398 lines
12 KiB
JavaScript
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){
|
|
|
|
|
|
}
|
|
} |