UNPKG

alasql

Version:

AlaSQL.js - JavaScript SQL database library for relational and graph data manipulation with support of localStorage, IndexedDB, and Excel

499 lines (465 loc) 13.7 kB
// // 91indexeddb.js // AlaSQL IndexedDB module // Date: 18.04.2015 // (c) Andrey Gershun // if(typeof window !='undefined' && typeof window.indexedDB != 'undefined') { var IDB = alasql.engines.INDEXEDDB = function (){}; // For Chrome it work normally, for Firefox - simple shim if(typeof window.indexedDB.webkitGetDatabaseNames == 'function') { IDB.getDatabaseNames = window.indexedDB.webkitGetDatabaseNames.bind(window.indexedDB); } else { IDB.getDatabaseNames = function () { var request = {}; var result = { contains:function(name){ return true; // Always return true }, notsupported: true }; setTimeout(function(){ var event = {target:{result:result}} request.onsuccess(event); },0); return request; }; IDB.getDatabaseNamesNotSupported = true; } // // SHOW DATABASES // work only in chrome // IDB.showDatabases = function(like,cb) { // console.log('showDatabases',arguments); var request = IDB.getDatabaseNames(); request.onsuccess = function(event) { var dblist = event.target.result; if(IDB.getDatabaseNamesNotSupported) { throw new Error('SHOW DATABASE is not supported in this browser'); } var res = []; if(like) { var relike = new RegExp((like.value).replace(/\%/g,'.*'),'g'); } for(var i=0;i<dblist.length;i++) { if(!like || dblist[i].match(relike)) { res.push({databaseid: dblist[i]}); } }; cb(res); }; }; IDB.createDatabase = function(ixdbid, args, ifnotexists, dbid, cb){ console.log(arguments); if(ifnotexists) { var request2 = window.indexedDB.open(ixdbid,1); request2.onsuccess = function(event) { event.target.result.close(); cb(1); }; } else { var request1 = window.indexedDB.open(ixdbid,1); request1.onupgradeneeded = function (e){ console.log('abort'); e.target.transaction.abort(); }; request1.onsuccess = function(e) { console.log('success'); if(ifnotexists) { cb(0); } else { throw new Error('IndexedDB: Cannot create new database "'+ixdbid+'" because it already exists'); } } } /* var request1 = IDB.getDatabaseNames(); request1.onsuccess = function(event) { var dblist = event.target.result; if(dblist.contains(ixdbid)){ if(ifnotexists) { cb(0); return; } else { throw new Error('IndexedDB: Cannot create new database "'+ixdbid+'" because it already exists'); } }; */ /* }; */ // } }; IDB.createDatabase = function(ixdbid, args, ifnotexists, dbid, cb){ if(IDB.getDatabaseNamesNotSupported) { // Hack for Firefox if(ifnotexists) { // console.log('ifnotexists'); var dbExists = true; var request2 = window.indexedDB.open(ixdbid); // console.log(1); request2.onupgradeneeded = function (e){ // console.log('abort'); dbExists = false; // e.target.transaction.abort(); // cb(0); }; request2.onsuccess = function(event) { // console.log('success'); //console.log(event.target.result); event.target.result.close(); if(dbExists) { cb(0); } else { cb(1); } }; } else { // console.log('without'); var request1 = window.indexedDB.open(ixdbid); request1.onupgradeneeded = function (e){ e.target.transaction.abort(); }; request1.onabort = function(event) { cb(1); }; request1.onsuccess = function(event) { event.target.result.close(); throw new Error('IndexedDB: Cannot create new database "'+ixdbid+'" because it already exists'); // cb(0); }; } } else { var request1 = IDB.getDatabaseNames(); request1.onsuccess = function(event) { var dblist = event.target.result; if(dblist.contains(ixdbid)){ if(ifnotexists) { cb(0); return; } else { throw new Error('IndexedDB: Cannot create new database "'+ixdbid+'" because it already exists'); } }; var request2 = window.indexedDB.open(ixdbid,1); request2.onsuccess = function(event) { event.target.result.close(); cb(1); }; }; } // } }; IDB.dropDatabase = function(ixdbid, ifexists, cb){ var request1 = IDB.getDatabaseNames(); request1.onsuccess = function(event) { var dblist = event.target.result; if(!dblist.contains(ixdbid)){ if(ifexists) { cb(0); return; } else { throw new Error('IndexedDB: Cannot drop new database "'+ixdbid+'" because it does not exist'); } }; var request2 = window.indexedDB.deleteDatabase(ixdbid); request2.onsuccess = function(event) { // console.log('dropped'); if(cb) cb(1); } }; }; IDB.attachDatabase = function(ixdbid, dbid, args, params, cb) { var request1 = IDB.getDatabaseNames(); request1.onsuccess = function(event) { var dblist = event.target.result; if(!dblist.contains(ixdbid)){ throw new Error('IndexedDB: Cannot attach database "'+ixdbid+'" because it does not exist'); }; var request2 = window.indexedDB.open(ixdbid); request2.onsuccess = function(event) { var ixdb = event.target.result; var db = new alasql.Database(dbid || ixdbid); db.engineid = "INDEXEDDB"; db.ixdbid = ixdbid; db.tables = []; var tblist = ixdb.objectStoreNames; for(var i=0;i<tblist.length;i++){ db.tables[tblist[i]] = {}; }; // if(!alasql.options.autocommit) { // if(db.tables){ // for(var tbid in db.tables) { // db.tables[tbid].data = LS.get(db.lsdbid+'.'+tbid); // } // } // } event.target.result.close(); cb(1); }; }; }; IDB.createTable = function(databaseid, tableid, ifnotexists, cb) { // console.log(arguments); var ixdbid = alasql.databases[databaseid].ixdbid; // console.log(ixdbid); var request1 = IDB.getDatabaseNames(); request1.onsuccess = function(event) { var dblist = event.target.result; if(!dblist.contains(ixdbid)){ throw new Error('IndexedDB: Cannot create table in database "'+ixdbid+'" because it does not exist'); }; var request2 = window.indexedDB.open(ixdbid); request2.onversionchange = function(event) { // console.log('onversionchange'); event.target.result.close(); }; request2.onsuccess = function(event) { var version = event.target.result.version; event.target.result.close(); var request3 = window.indexedDB.open(ixdbid, version+1); request3.onupgradeneeded = function(event) { var ixdb = event.target.result; // console.log(ixdb); var store = ixdb.createObjectStore(tableid, {autoIncrement:true}); // console.log(store); }; request3.onsuccess = function(event) { // console.log('opened'); event.target.result.close(); cb(1); }; request3.onerror = function(event){ throw event; // console.log('error'); } request3.onblocked = function(event){ throw new Error('Cannot create table "'+tableid+'" because database "'+databaseid+'" is blocked'); // console.log('blocked'); } }; }; }; IDB.dropTable = function (databaseid, tableid, ifexists, cb) { var ixdbid = alasql.databases[databaseid].ixdbid; var request1 = IDB.getDatabaseNames(); request1.onsuccess = function(event) { var dblist = event.target.result; if(!dblist.contains(ixdbid)){ throw new Error('IndexedDB: Cannot drop table in database "'+ixdbid+'" because it does not exist'); }; var request2 = window.indexedDB.open(ixdbid); request2.onversionchange = function(event) { event.target.result.close(); }; request2.onsuccess = function(event) { var version = event.target.result.version; event.target.result.close(); var request3 = window.indexedDB.open(ixdbid, version+1); request3.onupgradeneeded = function(event) { var ixdb = event.target.result; if(ixdb.objectStoreNames.contains(tableid)) { ixdb.deleteObjectStore(tableid); delete alasql.databases[databaseid].tables[tableid]; } else { if(!ifexists) { throw new Error('IndexedDB: Cannot drop table "'+tableid+'" because it is not exist'); } } // var store = ixdb.createObjectStore(tableid); // console.log('deleted'); }; request3.onsuccess = function(event) { // console.log('opened'); event.target.result.close(); cb(1); }; request3.onerror = function(event){ throw event; // console.log('error'); } request3.onblocked = function(event){ throw new Error('Cannot drop table "'+tableid+'" because database "'+databaseid+'" is blocked'); // console.log('blocked'); } }; }; } // IDB.intoTable = function(databaseid, tableid, value, cb) { // // console.log('intoTable',databaseid, tableid, value, cb); // var ixdbid = alasql.databases[databaseid].ixdbid; // var request1 = indexedDB.open(ixdbid); // request1.onsuccess = function(event) { // var ixdb = event.target.result; // var tx = ixdb.transaction([tableid],"readwrite"); // var tb = tx.objectStore(tableid); // // console.log(tb.keyPath); // // console.log(tb.indexNames); // // console.log(tb.autoIncrement); // for(var i=0, ilen = value.length;i<ilen;i++) { // tb.add(value[i]); // }; // tx.oncomplete = function() { // ixdb.close(); // // console.log('indexeddb',203,ilen); // cb(ilen); // } // }; // // var tb = LS.get(lsdbid+'.'+tableid); // // if(!tb) tb = []; // // tb = tb.concat(value); // // LS.set(lsdbid+'.'+tableid, tb); // // console.log(lsdbid+'.'+tableid, tb); // // console.log(localStorage[lsdbid+'.'+tableid]); // // if(cb) cb(res); // // return res; // }; IDB.intoTable = function(databaseid, tableid, value, columns, cb) { // console.log(arguments); // console.trace(); // console.log('intoTable',databaseid, tableid, value, cb); var ixdbid = alasql.databases[databaseid].ixdbid; var request1 = window.indexedDB.open(ixdbid); request1.onsuccess = function(event) { var ixdb = event.target.result; var tx = ixdb.transaction([tableid],"readwrite"); var tb = tx.objectStore(tableid); // console.log(tb.keyPath); // console.log(tb.indexNames); // console.log(tb.autoIncrement); for(var i=0, ilen = value.length;i<ilen;i++) { tb.add(value[i]); }; tx.oncomplete = function() { ixdb.close(); // console.log('indexeddb',203,ilen); cb(ilen); } }; // var tb = LS.get(lsdbid+'.'+tableid); // if(!tb) tb = []; // tb = tb.concat(value); // LS.set(lsdbid+'.'+tableid, tb); // console.log(lsdbid+'.'+tableid, tb); // console.log(localStorage[lsdbid+'.'+tableid]); // if(cb) cb(res); // return res; }; IDB.fromTable = function(databaseid, tableid, cb, idx, query){ // console.log(arguments); // console.trace(); var ixdbid = alasql.databases[databaseid].ixdbid; var request = window.indexedDB.open(ixdbid); request.onsuccess = function(event) { var res = []; var ixdb = event.target.result; // console.log(444,ixdb, tableid, ixdbid); var tx = ixdb.transaction([tableid]); var store = tx.objectStore(tableid); var cur = store.openCursor(); // console.log(cur); cur.onblocked = function(event) { // console.log('blocked'); } cur.onerror = function(event) { // console.log('error'); } cur.onsuccess = function(event) { // console.log('success'); var cursor = event.target.result; // console.log(222,event); // console.log(333,cursor); if(cursor) { res.push(cursor.value); cursor.continue(); } else { // console.log(555, res,idx,query); ixdb.close(); cb(res, idx, query); } } } } IDB.deleteFromTable = function(databaseid, tableid, wherefn,params, cb){ // console.log(arguments); // console.trace(); var ixdbid = alasql.databases[databaseid].ixdbid; var request = window.indexedDB.open(ixdbid); request.onsuccess = function(event) { var res = []; var ixdb = event.target.result; // console.log(444,ixdb, tableid, ixdbid); var tx = ixdb.transaction([tableid], 'readwrite'); var store = tx.objectStore(tableid); var cur = store.openCursor(); var num = 0; // console.log(cur); cur.onblocked = function(event) { // console.log('blocked'); } cur.onerror = function(event) { // console.log('error'); } cur.onsuccess = function(event) { // console.log('success'); var cursor = event.target.result; // console.log(222,event); // console.log(333,cursor); if(cursor) { if((!wherefn) || wherefn(cursor.value,params)) { // console.log(cursor); cursor.delete(); num++; } cursor.continue(); } else { // console.log(555, res,idx,query); ixdb.close(); cb(num); } } } } IDB.updateTable = function(databaseid, tableid, assignfn, wherefn, params, cb){ // console.log(arguments); // console.trace(); var ixdbid = alasql.databases[databaseid].ixdbid; var request = window.indexedDB.open(ixdbid); request.onsuccess = function(event) { var res = []; var ixdb = event.target.result; // console.log(444,ixdb, tableid, ixdbid); var tx = ixdb.transaction([tableid], 'readwrite'); var store = tx.objectStore(tableid); var cur = store.openCursor(); var num = 0; // console.log(cur); cur.onblocked = function(event) { // console.log('blocked'); } cur.onerror = function(event) { // console.log('error'); } cur.onsuccess = function(event) { // console.log('success'); var cursor = event.target.result; // console.log(222,event); // console.log(333,cursor); if(cursor) { if((!wherefn) || wherefn(cursor.value,params)) { //console.log(cursor); var r = cursor.value; assignfn(r,params); // console.log('update 363',r); cursor.update(r); num++; } cursor.continue(); } else { // console.log(555, res,idx,query); ixdb.close(); cb(num); } } } } // Skip }