From baa87f9e08e0f0b41c9ffe5ae11c06463f6573c0 Mon Sep 17 00:00:00 2001 From: Mike Date: Sun, 8 Apr 2012 10:19:39 -0400 Subject: [PATCH] this version is a good base, seems to work ok --- .../SQLitePlugin/assets/www/SQLitePlugin.js | 339 ++++++++---------- .../plugins/sqlitePlugin/SQLitePlugin.java | 82 +---- 2 files changed, 164 insertions(+), 257 deletions(-) diff --git a/Android/SQLitePlugin/assets/www/SQLitePlugin.js b/Android/SQLitePlugin/assets/www/SQLitePlugin.js index 35f02a5..770e501 100755 --- a/Android/SQLitePlugin/assets/www/SQLitePlugin.js +++ b/Android/SQLitePlugin/assets/www/SQLitePlugin.js @@ -1,141 +1,82 @@ (function() { - var callbacks, cbref, counter, getOptions, root; - - root = this; - - callbacks = {}; - - counter = 0; - - cbref = function(hash) { - var f; - f = "cb" + (counter += 1); - callbacks[f] = hash; - return f; - }; - - getOptions = function(opts, success, error) { - var cb, has_cbs; - cb = {}; - has_cbs = false; - if (typeof success === "function") { - has_cbs = true; - cb.success = success; - } - if (typeof error === "function") { - has_cbs = true; - cb.error = error; - } - if (has_cbs) opts.callback = cbref(cb); - return opts; - }; - root.SQLitePlugin = (function() { + var root; + root = this; + root.SQLitePlugin = (function() { console.log("root.SQLitePlugin"); SQLitePlugin.prototype.openDBs = {}; - function SQLitePlugin(dbPath, openSuccess, openError) { - console.log("SQLitePlugin"); - this.dbPath = dbPath; - this.openSuccess = openSuccess; - this.openError = openError; - if (!dbPath) { - throw new Error("Cannot create a SQLitePlugin instance without a dbPath"); - } - this.openSuccess || (this.openSuccess = function() { - console.log("DB opened: " + dbPath); - }); - this.openError || (this.openError = function(e) { - console.log(e.message); - }); - this.open(this.openSuccess, this.openError); + function SQLitePlugin(dbPath, openSuccess, openError) + { + console.log("SQLitePlugin"); + this.dbPath = dbPath; + this.openSuccess = openSuccess; + this.openError = openError; + if (!dbPath) { + throw new Error("Cannot create a SQLitePlugin instance without a dbPath"); + } + this.openSuccess || (this.openSuccess = function() { + console.log("DB opened: " + dbPath); + }); + this.openError || (this.openError = function(e) { + console.log(e.message); + }); + this.open(this.openSuccess, this.openError); } - SQLitePlugin.handleCallback = function(ref, type, obj) { - console.log("SQLitePlugin.prototype.handleCallback"); - var _ref; - if ((_ref = callbacks[ref]) != null) { - if (typeof _ref[type] === "function") _ref[type](obj); - } - callbacks[ref] = null; - delete callbacks[ref]; - }; - SQLitePlugin.prototype.executeSql = function(sql, values, success, error) { - console.log("SQLitePlugin.prototype.executeSql"); - var opts; - if (!sql) throw new Error("Cannot executeSql without a query"); - opts = getOptions({ - query: [sql].concat(values || []), - path: this.dbPath - }, success, error); - // PhoneGap.exec("SQLitePlugin.backgroundExecuteSql", opts); - PhoneGap.exec(null, null, "SQLitePlugin", "backgroundExecuteSql", opts); - }; - SQLitePlugin.prototype.transaction = function(fn, error, success) { - console.log("SQLitePlugin.prototype.transaction"); - var t; - t = new root.SQLitePluginTransaction(this.dbPath); - fn(t); - return t.complete(success, error); + SQLitePlugin.prototype.transaction = function(fn, error, success) + { + console.log("SQLitePlugin.prototype.transaction"); + var t; + t = new root.SQLitePluginTransaction(this.dbPath); + fn(t); + return t.complete(success, error); }; - SQLitePlugin.prototype.open = function(success, error) { - console.log("SQLitePlugin.prototype.open"); - var opts; - if (!(this.dbPath in this.openDBs)) { - this.openDBs[this.dbPath] = true; - opts = getOptions({ - path: this.dbPath - }, success, error); - //PhoneGap.exec("SQLitePlugin.open", opts); - /* - * db The name of the database - version The version - display_name The display name - size The size in bytes - * - */ - PhoneGap.exec(success, error, "SQLitePlugin", "open", [this.dbPath]); - } + SQLitePlugin.prototype.open = function(success, error) + { + console.log("SQLitePlugin.prototype.open"); + var opts; + if (!(this.dbPath in this.openDBs)) { + this.openDBs[this.dbPath] = true; + PhoneGap.exec(success, error, "SQLitePlugin", "open", [this.dbPath]); + } }; - SQLitePlugin.prototype.close = function(success, error) { + SQLitePlugin.prototype.close = function(success, error) + { console.log("SQLitePlugin.prototype.close"); - var opts; - if (this.dbPath in this.openDBs) { - delete this.openDBs[this.dbPath]; - opts = getOptions({ - path: this.dbPath - }, success, error); - //PhoneGap.exec("SQLitePlugin.close", opts); - PhoneGap.exec(null, null, "SQLitePlugin", "close", opts); - } + var opts; + if (this.dbPath in this.openDBs) { + delete this.openDBs[this.dbPath]; + PhoneGap.exec(null, null, "SQLitePlugin", "close", [this.dbPath]); + } }; - return SQLitePlugin; - })(); - get_unique_id = function() - { - var id = new Date().getTime(); - var id2 = new Date().getTime(); - while(id === id2) + get_unique_id = function() { - id2 = new Date().getTime(); + var id = new Date().getTime(); + var id2 = new Date().getTime(); + while(id === id2) + { + id2 = new Date().getTime(); + } + return id2+'000'; } - return id2+'000'; - } - transaction_queue = []; - transaction_callback_queue = new Object(); - root.SQLitePluginTransaction = (function() { - console.log("root.SQLitePluginTransaction"); - function SQLitePluginTransaction(dbPath) { + transaction_queue = []; + transaction_callback_queue = new Object(); + root.SQLitePluginTransaction = (function() { + console.log("root.SQLitePluginTransaction"); + function SQLitePluginTransaction(dbPath) + { console.log("root.SQLitePluginTransaction.SQLitePluginTransaction"); - this.dbPath = dbPath; - this.executes = []; - this.trans_id = get_unique_id(); - console.log("root.SQLitePluginTransaction - this.trans_id:"+this.trans_id); - transaction_queue[this.trans_id] = []; - } + this.dbPath = dbPath; + this.executes = []; + this.trans_id = get_unique_id(); + console.log("root.SQLitePluginTransaction - this.trans_id:"+this.trans_id); + transaction_queue[this.trans_id] = []; + transaction_callback_queue[this.trans_id] = new Object(); + } SQLitePluginTransaction.queryCompleteCallback = function(transId, queryId, result) { var query = null; @@ -149,27 +90,61 @@ } if(query) console.log("SQLitePluginTransaction.completeCallback---query:"+query['query']); - else - console.log("SQLitePluginTransaction.completeCallback---JSON.stringify(transaction_queue):"+JSON.stringify(transaction_queue[transId])); - if(query['callback']) + if(query && query['callback']) query['callback'](result) } + SQLitePluginTransaction.queryErrorCallback = function(transId, queryId, result) + { + var query = null; + for (var x in transaction_queue[transId]) + { + if(transaction_queue[transId][x]['query_id'] == queryId) + { + query = transaction_queue[transId][x]; + break; + } + } + if(query) + console.log("SQLitePluginTransaction.queryErrorCallback---query:"+query['query']); + if(query && query['err_callback']) + query['err_callback'](result) + } SQLitePluginTransaction.txCompleteCallback = function(transId) { if(typeof transId != 'undefined') { console.log("SQLitePluginTransaction.txCompleteCallback---transId:"+transId); - if(transId && transaction_callback_queue[transId]) - transaction_callback_queue[transId](); + if(transId && transaction_callback_queue[transId]['success']) + transaction_callback_queue[transId]['success'](); + + delete transaction_queue[transId]; + delete transaction_callback_queue[transId]; } else console.log("SQLitePluginTransaction.txCompleteCallback---transId = NULL"); } + SQLitePluginTransaction.txErrorCallback = function(transId, error) + { + if(typeof transId != 'undefined') + { + console.log("SQLitePluginTransaction.txErrorCallback---transId:"+transId); + if(transId && transaction_callback_queue[transId]['error']) + transaction_callback_queue[transId]['error'](error); + + delete transaction_queue[transId]; + delete transaction_callback_queue[transId]; + } + else + console.log("SQLitePluginTransaction.txErrorCallback---transId = NULL"); + } SQLitePluginTransaction.prototype.add_to_transaction = function(trans_id, query, params, callback, err_callback) { var new_query = new Object();; new_query['trans_id'] = trans_id; - new_query['query_id'] = get_unique_id(); + if(callback) + new_query['query_id'] = get_unique_id(); + else + new_query['query_id'] = ""; new_query['query'] = query; new_query['params'] = params; new_query['callback'] = callback; @@ -179,67 +154,69 @@ transaction_queue[trans_id].push(new_query); } - SQLitePluginTransaction.prototype.executeSql = function(sql, values, success, error) { + SQLitePluginTransaction.prototype.executeSql = function(sql, values, success, error) { console.log("SQLitePluginTransaction.prototype.executeSql"); - var errorcb, successcb, txself; - txself = this; - successcb = null; - if (success) { - successcb = function(execres) { - console.log("executeSql callback:"+JSON.stringify(execres)); - var res, saveres; - saveres = execres; - res = { - rows: { - item: function(i) { - return saveres[i]; - }, - length: saveres.length - }, - rowsAffected: saveres.rowsAffected, - insertId: saveres.insertId || null - }; - return success(txself, res); - }; - } - errorcb = null; - if (error) { - errorcb = function(res) { - return error(txself, res); - }; - } + var errorcb, successcb, txself; + txself = this; + successcb = null; + if (success) + { + console.log("success not null:"+sql); + successcb = function(execres) + { + console.log("executeSql callback:"+JSON.stringify(execres)); + var res, saveres; + saveres = execres; + res = { + rows: { + item: function(i) { + return saveres[i]; + }, + length: saveres.length + }, + rowsAffected: saveres.rowsAffected, + insertId: saveres.insertId || null + }; + return success(txself, res); + }; + } + else + console.log("success NULL:"+sql); + + errorcb = null; + if (error) { + errorcb = function(res) { + return error(txself, res); + }; + } this.add_to_transaction(this.trans_id, sql, values, successcb, errorcb); console.log("executeSql - add_to_transaction"+sql); - }; + }; - - - SQLitePluginTransaction.prototype.complete = function(success, error) { + SQLitePluginTransaction.prototype.complete = function(success, error) { console.log("SQLitePluginTransaction.prototype.complete"); - var begin_opts, commit_opts, errorcb, executes, opts, successcb, txself; - if (this.__completed) throw new Error("Transaction already run"); - this.__completed = true; - txself = this; - successcb = function() {}; - if (success) { - successcb = function() { - return success(txself); - }; - } - errorcb = function(res) { - }; - if (error) { - errorcb = function(res) { - return error(txself, res); - }; - } - console.log("complete - this.transaction_queue"+JSON.stringify(transaction_queue[this.trans_id])); - transaction_callback_queue[this.trans_id] = successcb; - PhoneGap.exec(null, null, "SQLitePlugin", "executeSqlBatch", transaction_queue[this.trans_id]); + var begin_opts, commit_opts, errorcb, executes, opts, successcb, txself; + if (this.__completed) throw new Error("Transaction already run"); + this.__completed = true; + txself = this; + successcb = function() {}; + if (success) { + successcb = function() { + return success(txself); + }; + } + errorcb = function(res) {}; + if (error) { + errorcb = function(res) { + return error(txself, res); + }; + } + console.log("complete - this.transaction_queue"+JSON.stringify(transaction_queue[this.trans_id])); + transaction_callback_queue[this.trans_id]['success'] = successcb; + transaction_callback_queue[this.trans_id]['error'] = errorcb; + PhoneGap.exec(null, null, "SQLitePlugin", "executeSqlBatch", transaction_queue[this.trans_id]); }; - return SQLitePluginTransaction; - })(); }).call(this); \ No newline at end of file diff --git a/Android/SQLitePlugin/src/com/phonegap/plugins/sqlitePlugin/SQLitePlugin.java b/Android/SQLitePlugin/src/com/phonegap/plugins/sqlitePlugin/SQLitePlugin.java index e1ec8eb..927ef2d 100755 --- a/Android/SQLitePlugin/src/com/phonegap/plugins/sqlitePlugin/SQLitePlugin.java +++ b/Android/SQLitePlugin/src/com/phonegap/plugins/sqlitePlugin/SQLitePlugin.java @@ -17,21 +17,12 @@ import android.database.sqlite.*; import android.util.Log; -/** - * This class implements the HTML5 database support for Android 1.X devices. It - * is not used for Android 2.X, since HTML5 database is built in to the browser. - */ public class SQLitePlugin extends Plugin { // Data Definition Language - private static final String ALTER = "alter"; - private static final String CREATE = "create"; - private static final String DROP = "drop"; - private static final String TRUNCATE = "truncate"; - SQLiteDatabase myDb = null; // Database object - String path = null; // Database path - String dbName = null; // Database name + String path = null; // Database path + String dbName = null; // Database name /** * Constructor. @@ -102,20 +93,6 @@ public class SQLitePlugin extends Plugin { else Log.v("error", "null trans_id"); } - else if (action.equals("executeSql")) { - String[] s = null; - if (args.isNull(1)) { - s = new String[0]; - } else { - JSONArray a = args.getJSONArray(1); - int len = a.length(); - s = new String[len]; - for (int i = 0; i < len; i++) { - s[i] = a.getString(i); - } - } - this.executeSql(args.getString(0), s, args.getString(2)); - } return new PluginResult(status, result); } catch (JSONException e) { return new PluginResult(PluginResult.Status.JSON_EXCEPTION); @@ -195,36 +172,6 @@ public class SQLitePlugin extends Plugin { this.myDb = SQLiteDatabase.openOrCreateDatabase(this.dbName, null); } - /** - * Execute SQL statement. - * - * @param query - * The SQL query - * @param params - * Parameters for the query - * @param tx_id - * Transaction id - */ - public void executeSql(String query, String[] params, String tx_id) { - try { - if (isDDL(query)) { - this.myDb.execSQL(query); - this.sendJavascript("dddb.completeQuery('" + tx_id + "', '');"); - } - else { - Cursor myCursor = this.myDb.rawQuery(query, params); - //this.processResults(myCursor, tx_id); - myCursor.close(); - } - } - catch (SQLiteException ex) { - ex.printStackTrace(); - System.out.println("SQLitePlugin.executeSql(): Error=" + ex.getMessage()); - - // Send error message back to JavaScript - this.sendJavascript("dddb.fail('" + ex.getMessage() + "','" + tx_id + "');"); - } - } public void executeSqlBatch(String[] queryarr, String[][] paramsarr, String[] queryIDs, String tx_id) { try { this.myDb.beginTransaction(); @@ -237,17 +184,16 @@ public class SQLitePlugin extends Plugin { params = paramsarr[i]; query_id = queryIDs[i]; Cursor myCursor = this.myDb.rawQuery(query, params); - this.processResults(myCursor, query_id, tx_id); + if(query_id != "") + this.processResults(myCursor, query_id, tx_id); myCursor.close(); } this.myDb.setTransactionSuccessful(); } catch (SQLiteException ex) { ex.printStackTrace(); - System.out.println("SQLitePlugin.executeSql(): Error=" + ex.getMessage()); - - // Send error message back to JavaScript - //this.sendJavascript("dddb.fail('" + ex.getMessage() + "','" + tx_id + "');"); + Log.v("executeSqlBatch", "SQLitePlugin.executeSql(): Error=" + ex.getMessage()); + this.sendJavascript("SQLitePluginTransaction.txErrorCallback('" + tx_id + "', '"+ex.getMessage()+"');"); } finally { this.myDb.endTransaction(); @@ -256,20 +202,6 @@ public class SQLitePlugin extends Plugin { } } - /** - * Checks to see the the query is a Data Definintion command - * - * @param query to be executed - * @return true if it is a DDL command, false otherwise - */ - private boolean isDDL(String query) { - String cmd = query.toLowerCase(); - if (cmd.startsWith(DROP) || cmd.startsWith(CREATE) || cmd.startsWith(ALTER) || cmd.startsWith(TRUNCATE)) { - return true; - } - return false; - } - /** * Process query results. * @@ -309,9 +241,7 @@ public class SQLitePlugin extends Plugin { result = fullresult.toString(); } - // Let JavaScript know that there are no more rows this.sendJavascript(" SQLitePluginTransaction.queryCompleteCallback('" + tx_id + "','" + query_id + "', " + result + ");"); } - }