UNPKG

cordova-sqlcipher-adapter

Version:

SQLCipher database adapter for PhoneGap/Cordova, based on cordova-sqlite-storage

189 lines (167 loc) 4.99 kB
var dbmap = {}; var nextTick = window.setImmediate || function(fun) { window.setTimeout(fun, 0); }; /* ** function handle(p, win, fail) { if (p) p.done( function (res) { if (res[1]) fail(res[1]); else win(res[0]?JSON.parse(res[0]):[]); }, function (err) { fail(err); } ); } // */ module.exports = { echoStringValue: function(win, fail, args) { var options = args[0]; win(options.value); }, open: function(win, fail, args) { var options = args[0]; var res; function openImmediate(dbname) { if (!!dbmap[dbname]) { // NO LONGER EXPECTED due to BUG 666 workaround solution: fail("INTERNAL ERROR: database already open for dbname: " + dbname); } // from @EionRobb / phonegap-win8-sqlite: var opendbname = Windows.Storage.ApplicationData.current.localFolder.path + "\\" + dbname; console.log("open db name: " + dbname + " at full path: " + opendbname); var db = new SQLite3JS.Database(opendbname); if (!!options.key && options.key.length !== 0) { // XXX FAIL EXPLICITLY SINCE THERE IS NO CRYPTO PROVIDER FOR WINDOWS: fail("OPEN ERROR: NO CRYPTO PROVIDER for Windows"); /* XXX CURRENTLY NOT SUPPORTED: db.key(options.key) // XXX */ // ignore result if following access test does not throw. } // test if db can be accessed: db.all("SELECT count(*) FROM sqlite_master", []); dbmap[dbname] = db; nextTick(function() { win(); }); //res = SQLitePluginRT.SQLitePlugin.openAsync(options.name); } try { //res = SQLitePluginRT.SQLitePlugin.openAsync(options.name); var dbname = options.name; openImmediate(dbname); } catch(ex) { //fail(ex); nextTick(function() { fail(ex); }); } //handle(res, win, fail); }, close: function(win, fail, args) { var options = args[0]; var res; try { var dbname = options.path; nextTick(function() { var rc = 0; var db = dbmap[dbname]; if (!db) { fail("CLOSE ERROR: cannot find db object for dbname: " + dbname); } else if ((rc = db.close()) !== 0) { fail("CLOSE ERROR CODE: " + rc); } else { delete dbmap[dbname]; win(); } }); } catch (ex) { fail(ex); } }, backgroundExecuteSqlBatch: function(win, fail, args) { var options = args[0]; var dbname = options.dbargs.dbname; var executes = options.executes; var db = dbmap[dbname]; var results = []; var i, count=executes.length; //console.log("executes: " + JSON.stringify(executes)); //console.log("execute sql count: " + count); for (i=0; i<count; ++i) { var e = executes[i]; //console.log("execute sql: " + e.sql + " params: " + JSON.stringify(e.params)); try { var oldTotalChanges = db.totalChanges(); var rows = db.all(e.sql, e.params); //console.log("got rows: " + JSON.stringify(rows)); var rowsAffected = db.totalChanges() - oldTotalChanges; var result = { rows: rows, rowsAffected: rowsAffected }; if (rowsAffected > 0) { var lastInsertRowid = db.lastInsertRowid(); if (lastInsertRowid !== 0) result.insertId = lastInsertRowid; } results.push({ type: "success", result: result }); } catch(ex) { console.log("sql exception error: " + ex.message); results.push({ type: "error", result: { message: ex.message, code: 0 } }); } } //console.log("return results: " + JSON.stringify(results)); nextTick(function() { //console.log("return results: " + JSON.stringify(results)); win(results); }); }, "delete": function(win, fail, args) { var options = args[0]; var res; try { //res = SQLitePluginRT.SQLitePlugin.deleteAsync(JSON.stringify(options)); var dbname = options.path; WinJS.Application.local.exists(dbname).then(function(isExisting) { if (!isExisting) { // XXX FUTURE TBD consistent for all platforms: fail("file does not exist"); return; } if (!!dbmap[dbname]) { dbmap[dbname].close_v2(); delete dbmap[dbname]; } //console.log('test db name: ' + dbname); Windows.Storage.ApplicationData.current.localFolder.getFileAsync(dbname) .then(function (dbfile) { //console.log('get db file to delete ok'); return dbfile.deleteAsync(Windows.Storage.StorageDeleteOption.permanentDelete); }, function (e) { console.log('get file failure: ' + JSON.stringify(e)); // XXX FUTURE TBD consistent for all platforms: fail(e); }).then(function () { //console.log('delete ok'); win(); }, function (e) { console.log('delete failure: ' + JSON.stringify(e)); // XXX FUTURE TBD consistent for all platforms: fail(e); }); }); } catch(ex) { fail(ex); } //handle(res, win, fail); } }; require("cordova/exec/proxy").add("SQLitePlugin", module.exports);