wochenbericht-manager/src/jsx/static/storage.jsx

398 lines
12 KiB
JavaScript

import {Log} from './debug';
const SQL = require('sql.js')
export class DB{
static cdb;
static loaded = false;
static loadedCB = [];
static newDB(){
Log.debug('create new database');
DB.cdb = new SQL.Database();
DB.cdb.exec(
`CREATE TABLE settings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ke TEXT not null,
val TEXT not null
);
CREATE TABLE days (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date DATETIME ,
startTime DATETIME ,
breakTime INTEGER ,
endTime DATETIME
);
CREATE TABLE tasks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
taskName TEXT not NULL
);
CREATE TABLE IF NOT EXISTS days_have_tasks(day_id INTEGER ,task_id INTEGER);
CREATE TABLE notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date DATETIME ,
title TEXT,
text TEXT,
priority TEXT
);
INSERT INTO settings (ke,val)
VALUES ('name','Max');
INSERT INTO settings (ke,val)
VALUES ('start','2018-08-01');
INSERT INTO settings (ke,val)
VALUES ('version','2');
`)
DB.loaded = true;
DB.__load()
DB.storeLocalStorage()
}
static storeLocalStorage(){
var data = DB.cdb.export();
var buffer = new Buffer(data);
var blob = new Blob([buffer]);
var reader = new FileReader();
reader.onload = function() {
localStorage.setItem('storage',reader.result)
}
reader.readAsBinaryString(blob);
}
static loadLocalStorage(){
var i, l, d, array;
array = new Uint8Array(localStorage.getItem('storage'));
for (var i = 0; i < l; i++){
array[i] = d.charCodeAt(i);
}
DB.loadDB(array);
DB.loaded = true;
DB.__load()
}
/**
*
* @param {type:Uint8Array} file Uint8Array
*/
static loadDB(file){
Log.debug('load database');
DB.cdb = new SQL.Database(file);
DB.storeLocalStorage()
DB.loaded = true;
DB.__load()
return "";
}
static __load(){
Log.debug('DB onload EVENT');
for(var l in DB.loadedCB){
DB.loadedCB[l]();
}
}
static onLoad(cb){
Log.debug('added DB onload EVENT');
DB.loadedCB.push(cb);
}
/**
*
*/
static exportDB(){
Log.debug('export database');
var data = DB.cdb.export();
var buffer = new Buffer(data);
//console.log(buffer);
var blob = new Blob([buffer],{type:'application/x-sqlite3'});
//console.log(blob);
//console.log(window.URL.createObjectURL(blob));
var link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
var fileName = "wbm.sqlite";
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(link);
}
/**
*
* @param {*} date
*/
static loadDate(date){
//var re = DB.cdb.exec("SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'");
//console.log(re)
Log.debug('load from date:'+date.getTime())
// get date
var sql = `SELECT * FROM days WHERE date=:date;`;
var stmt = DB.cdb.prepare(sql);
var res = stmt.getAsObject({":date":date.getTime()})
// clear statement memory
stmt.free();
Log.debug(JSON.stringify(res));
if(Object.keys(res).length === 0){
return {breakTime: 0, date: null,startTime:null, endTime: null, taskList:[]}
}else{
var sql2 = `SELECT * FROM days_have_tasks WHERE day_id=:id`
var stmt2 = DB.cdb.prepare(sql2);
var tasks = [];
tasks.push(stmt2.getAsObject({":id":res.id}).task_id);
while (stmt2.step()) tasks.push(stmt2.get()[1]);
stmt2.free();
//return {breakTime: 0, date: null,startTime:null, endTime: null, taskList:[]}
//return 0;
//var tasks = resu.taskList.split(',');
sql = `SELECT * FROM tasks WHERE id=:id`;
for ( var task in tasks){
stmt = DB.cdb.prepare(sql);
tasks[task] = stmt.getAsObject({":id":tasks[task]}).taskName;
stmt.free();
}
res.taskList = tasks;
return res;
}
}
static saveDate(args){
Log.debug('save date');
Log.debug(JSON.stringify(args))
var sql;
var stmt;
var res;
var tasks = args.taskList;
var taskss = []
//console.log(tasks);
for(var t in tasks){
if(typeof tasks[t] === 'undefined'){
continue;
}
tasks[t] = tasks[t].trim();
/**
* @INFO: search for TASK name
*/
sql = `SELECT * FROM tasks WHERE taskName=:task`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject({':task':tasks[t]});
stmt.free();
//console.log(res);
/**
* @INFO: if task is not found add it as new task
* into the tasks table and research the taskname again
*/
if(Object.keys(res).length === 0){
sql = `INSERT INTO tasks(taskName) VALUES(:task);`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject(
{
":task":tasks[t]
}
)
stmt.free()
sql = `SELECT * FROM tasks WHERE taskName=:task`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject({':task':tasks[t]});
stmt.free();
console.log(res);
}
/**
* @INFO: store the task id in taskss[t]
*
*/
taskss[t]= res.id;
}
/**
* @INFO: get the choosen date
*/
sql = `SELECT * FROM days WHERE date=:date;`;
stmt = DB.cdb.prepare(sql);
console.log(args);
res = stmt.getAsObject({":date":args.date})
stmt.free()
/**
* @INFO: CHECK IF DATE EXISTS
*/
if(Object.keys(res).length === 0){
/**
* @TODO: rework if date not exists
*/
Log.debug('added new entry');
Log.debug(JSON.stringify(args))
sql = `INSERT INTO days(date,startTime,breakTime,endTime) VALUES(:date,:startTime,:breakTime,:endTime);`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject(
{
":date":args.date,
":startTime":args.startTime,
":breakTime":args.breakTime,
":endTime":args.endTime
/*":taskList":taskss.join()*/
}
)
stmt.free()
sql = `SELECT * FROM days WHERE date=:date;`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject({
":date":args.date
});
/* DAY ID */
var d_id = res.id;
/**
* @INFO:
* for each day insert into days_have_tasks the tasks and the day id
*/
for(var i = 0;i<taskss.length;i++){
sql = `INSERT INTO days_have_tasks(day_id,task_id) VALUES(:did,:task);`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject(
{
":did":d_id,
":task":taskss[i]
}
)
stmt.free()
}
}else{
/**
* @INFO: get DATE ID
* @TODO: rewrite it as a external method
*/
sql = `SELECT * FROM days WHERE date=:date;`
stmt = DB.cdb.prepare(sql);
var id = stmt.getAsObject({":date":args.date}).id;
stmt.free()
sql = `SELECT * FROM days_have_tasks WHERE day_id=:id`
stmt = DB.cdb.prepare(sql);
var day_tasks = stmt.getAsObject({":id":id});
var old_tasks = [];
// load all old tasks in array
old_tasks.push(day_tasks.task_id)
while (stmt.step()) old_tasks.push(stmt.get()[1]);
stmt.free();
for(var x = 0;x<old_tasks.length;x++){
var t = taskss.indexOf(old_tasks[x])
if(t===-1){
sql = `DELETE FROM days_have_tasks WHERE day_id=:id AND task_id=:t_id;`
stmt = DB.cdb.prepare(sql);
stmt.getAsObject({":id":id,":t_id":old_tasks[x]});
}
}
/**
* @INFO
* ALL USED TASKS @var - taskss
*
* SELECT
*/
for(var i = 0;i<taskss.length;i++){
sql = `SELECT * FROM days_have_tasks WHERE day_id=:id AND task_id=:tid;`
stmt = DB.cdb.prepare(sql);
var tid = taskss[i];
var res = stmt.getAsObject({":id":id,":tid":tid});
stmt.free()
/**
* ADD TASK TO DAY
*/
if(typeof res.day_id == "undefined"){
var taskID = taskss[i];
/**
* @INFO: relate day_id and task_id in days_have_tasks
*/
sql = `INSERT INTO days_have_tasks(day_id,task_id) VALUES(:did,:task);`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject(
{
":did":id,
":task":taskID
}
)
stmt.free()
}
}
/** DELETE NOT USED TASKS */
/** @TODO: DELETE NOT USED TASKS FOR DAY */
/*
sql = `SELECT * FROM days_have_tasks WHERE day_id=:id AND task_id NOT IN :tid;`
stmt = DB.cdb.prepare(sql);
var tid = taskss[i];
var res = stmt.getAsObject({":id":id,":tid":"\"("+taskss.join('","')+")\""});
console.log(res);
stmt.free()
*/
/** */
Log.debug('update entry');
Log.debug(JSON.stringify(args))
sql = `UPDATE days SET startTime=:startTime,breakTime=:breakTime,endTime=:endTime,taskList=:taskList WHERE date=:date;`;
stmt = DB.cdb.prepare(sql);
res = stmt.getAsObject(
{
":date":args.date,
":startTime":args.startTime,
":breakTime":args.breakTime,
":endTime":args.endTime,
":taskList":taskss.join()
}
)
Log.debug(res);
stmt.free()
}
}
static handleTasks(){
}
static loadSettings(key){
var sql = `SELECT * FROM settings WHERE ke=:key`;
var stmt = DB.cdb.prepare(sql);
var res = stmt.getAsObject({':key':key});
stmt.free();
return res;
}
/**
*
* @param {*} obj name: Name , start: Date ( 2018-08-01 )
*/
static saveSettings(obj){
var sql = `UPDATE settings SET val=:name WHERE ke="name"`;
var stmt = DB.cdb.prepare(sql);
stmt.getAsObject({':name':obj.name});
stmt.free();
sql = `UPDATE settings SET val=:start WHERE ke="start"`;
stmt = DB.cdb.prepare(sql);
stmt.getAsObject({':start':obj.start});
stmt.free();
return "";
}
/**
* RES MAPPING
*/
static resMap(res){
}
}