From a4a88dbfa01f7a43c57d911b99c7f806b4275858 Mon Sep 17 00:00:00 2001 From: Ross Gerbasi Date: Wed, 6 Jun 2012 15:41:40 -0500 Subject: [PATCH 1/8] Updated to allow for multiple properties in the same filter i.e (WHERE x == "10" || y == "10"). Added custom variable check to allow store.load to pass ina totally custom query, --- sqlite/data/proxy/SqliteStorage.js | 97 +++++++++++++++++------------- 1 file changed, 56 insertions(+), 41 deletions(-) diff --git a/sqlite/data/proxy/SqliteStorage.js b/sqlite/data/proxy/SqliteStorage.js index 7f73966..8ca17af 100644 --- a/sqlite/data/proxy/SqliteStorage.js +++ b/sqlite/data/proxy/SqliteStorage.js @@ -25,7 +25,6 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { me.setTable(); }, - /* INTERFACE FUNCTIONS */ //inherit docs @@ -154,16 +153,21 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { filters = operation.getFilters(), fieldTypes = {}; - grouper = this.applyGrouper(grouper); - filters = this.applyFilters(filters); - sorters = this.applySorters(sorters); - // generate sql var sql = "SELECT _ROWID_,*\nFROM " + me.getDbConfig().tablename; - if (filters != null) sql += me.whereClause(filters); - if (grouper != null) sql += me.groupClause(grouper); - if (sorters != null) sql += me.orderClause(sorters); - if (limit != null && start != null) sql += me.limitClause(limit, start); + if(!operation.config.hasOwnProperty("query")) { + grouper = this.applyGrouper(grouper); + filters = this.applyFilters(filters); + sorters = this.applySorters(sorters); + + // generate sql + if (filters != null) sql += me.whereClause(filters); + if (grouper != null) sql += me.groupClause(grouper); + if (sorters != null) sql += me.orderClause(sorters); + if (limit != null && start != null) sql += me.limitClause(limit, start); + }else{ + sql = operation.config.query; + } var onSuccess, onError; onSuccess = function (tx, results) { @@ -366,6 +370,7 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { whereClause: function (filters) { var me = this, + firstProperty = true, firstFilter = true, sql = '', fieldTypes = {}; @@ -375,43 +380,54 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { }); Ext.each(filters, function (filter) { - // need to make sure this property is in the database - if (!Ext.isDefined(fieldTypes[filter.getProperty()])) - return; + //force filter property to be an array + var filterProperties = Ext.isArray(filter.getProperty()) ?filter.getProperty() : [filter.getProperty()]; + + //Confirm all filter properties are fields + if(!Ext.each(filterProperties, function(filterProperty){ + // need to make sure this property is in the database + if (!Ext.isDefined(fieldTypes[filterProperty])) return false; + })) return; if (!firstFilter) sql += "\n AND"; else sql += "\nWHERE\n "; firstFilter = false; - - sql += ' `' + filter.getProperty() + '`'; - - // now: do we use like or =? - var fieldType = fieldTypes[filter.getProperty()].toUpperCase(); - - if(typeof filter.getFilterFn() == 'string'){ - sql += " " + filter.getFilterFn(); - }else{ - if (fieldType == 'TEXT' && - !filter.getCaseSensitive()) sql += ' LIKE'; - else sql += ' ='; - } - - // need to surround with %? - if (!filter.getExactMatch() && - fieldType == 'TEXT') { - sql += " '%" + filter.getValue() + "%'"; - } else if (fieldType == 'TEXT') { - sql += " '" + filter.getValue() + "'"; - } else if (fieldType == 'boolean') { - if (filter.getValue()) { - sql += " 'true'"; + firstProperty = true; + + Ext.each(filterProperties, function(filterProperty){ + //Separate all properties with OR + if (!firstProperty) sql += " OR "; + firstProperty = false; + + sql += ' `' + filterProperty + '`'; + var fieldType = fieldTypes[filterProperty].toUpperCase(); + + // now: do we use like or =? + if(typeof filter.getFilterFn() == 'string'){ + sql += " " + filter.getFilterFn(); + }else{ + if (fieldType == 'TEXT' && + !filter.getCaseSensitive()) sql += ' LIKE'; + else sql += ' ='; } - else { - sql += " 'false'"; + + // need to surround with %? + if (!filter.getExactMatch() && + fieldType == 'TEXT') { + sql += " '%" + filter.getValue() + "%'"; + } else if (fieldType == 'TEXT') { + sql += " '" + filter.getValue() + "'"; + } else if (fieldType == 'boolean') { + if (filter.getValue()) { + sql += " 'true'"; + } + else { + sql += " 'false'"; + } + } else { + sql += ' ' + filter.getValue(); } - } else { - sql += ' ' + filter.getValue(); - } + }); }); return sql; @@ -420,7 +436,6 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { orderClause: function (sorters) { var me = this, sql = '', - orders = [], fields = {}, firstOrder = true; From 2be39a6a28d21af5df4e3e3bb0ec11ecba445cfd Mon Sep 17 00:00:00 2001 From: Ross Gerbasi Date: Wed, 20 Jun 2012 22:49:06 -0500 Subject: [PATCH 2/8] Updates added AND/OR selection to Where clause --- sqlite/data/proxy/SqliteStorage.js | 69 ++++++++++++++++-------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/sqlite/data/proxy/SqliteStorage.js b/sqlite/data/proxy/SqliteStorage.js index 8ca17af..a8f1b98 100644 --- a/sqlite/data/proxy/SqliteStorage.js +++ b/sqlite/data/proxy/SqliteStorage.js @@ -178,6 +178,7 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { me.throwDbError(tx, err); }; + console.log(sql); me.transactionDB(me.getDb(), [function (tx) { tx.executeSql(sql, [], onSuccess, onError); }], Ext.emptyFn, Ext.emptyFn); @@ -382,6 +383,7 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { Ext.each(filters, function (filter) { //force filter property to be an array var filterProperties = Ext.isArray(filter.getProperty()) ?filter.getProperty() : [filter.getProperty()]; + var filterValues = Ext.isArray(filter.getValue()) ?filter.getValue() : [filter.getValue()]; //Confirm all filter properties are fields if(!Ext.each(filterProperties, function(filterProperty){ @@ -389,44 +391,49 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { if (!Ext.isDefined(fieldTypes[filterProperty])) return false; })) return; - if (!firstFilter) sql += "\n AND"; + var propertyConcat = filter.config.hasOwnProperty("propertyIsAny") ? filter.config.propertyIsAny ? "AND" : "OR" : "AND"; + var valueConcat = filter.config.hasOwnProperty("valueIsAny") ? filter.config.valueIsAny ? "AND" : "OR" : "OR"; + + if (!firstFilter) sql += "\n "+propertyConcat ; else sql += "\nWHERE\n "; firstFilter = false; firstProperty = true; Ext.each(filterProperties, function(filterProperty){ - //Separate all properties with OR - if (!firstProperty) sql += " OR "; - firstProperty = false; - - sql += ' `' + filterProperty + '`'; - var fieldType = fieldTypes[filterProperty].toUpperCase(); - - // now: do we use like or =? - if(typeof filter.getFilterFn() == 'string'){ - sql += " " + filter.getFilterFn(); - }else{ - if (fieldType == 'TEXT' && - !filter.getCaseSensitive()) sql += ' LIKE'; - else sql += ' ='; - } - - // need to surround with %? - if (!filter.getExactMatch() && - fieldType == 'TEXT') { - sql += " '%" + filter.getValue() + "%'"; - } else if (fieldType == 'TEXT') { - sql += " '" + filter.getValue() + "'"; - } else if (fieldType == 'boolean') { - if (filter.getValue()) { - sql += " 'true'"; + Ext.each(filterValues, function(filterValue){ + //Separate all properties with OR + if (!firstProperty) sql += " "+valueConcat+" "; + firstProperty = false; + + sql += ' `' + filterProperty + '`'; + var fieldType = fieldTypes[filterProperty].toUpperCase(); + + // now: do we use like or =? + if(typeof filter.getFilterFn() == 'string'){ + sql += " " + filter.getFilterFn(); + }else{ + if (fieldType == 'TEXT' && + !filter.getCaseSensitive()) sql += ' LIKE'; + else sql += ' ='; } - else { - sql += " 'false'"; + + // need to surround with %? + if (!filter.getExactMatch() && + fieldType == 'TEXT') { + sql += " '%" + filterValue + "%'"; + } else if (fieldType == 'TEXT') { + sql += " '" + filterValue + "'"; + } else if (fieldType == 'boolean') { + if (filter.getValue()) { + sql += " 'true'"; + } + else { + sql += " 'false'"; + } + } else { + sql += ' ' + filterValue; } - } else { - sql += ' ' + filter.getValue(); - } + }); }); }); From f264a8bcd54963ffb64dac181cee1e926cfc2cf8 Mon Sep 17 00:00:00 2001 From: Ross Gerbasi Date: Thu, 21 Jun 2012 00:43:51 -0500 Subject: [PATCH 3/8] Removed debug log statement --- sqlite/data/proxy/SqliteStorage.js | 1 - 1 file changed, 1 deletion(-) diff --git a/sqlite/data/proxy/SqliteStorage.js b/sqlite/data/proxy/SqliteStorage.js index a8f1b98..2805c11 100644 --- a/sqlite/data/proxy/SqliteStorage.js +++ b/sqlite/data/proxy/SqliteStorage.js @@ -178,7 +178,6 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { me.throwDbError(tx, err); }; - console.log(sql); me.transactionDB(me.getDb(), [function (tx) { tx.executeSql(sql, [], onSuccess, onError); }], Ext.emptyFn, Ext.emptyFn); From 5194f773f56bbee680276772ab4b3a76a6edca60 Mon Sep 17 00:00:00 2001 From: Ross Gerbasi Date: Thu, 21 Jun 2012 23:24:05 -0500 Subject: [PATCH 4/8] Major App Updates in functionality. Added Audio Updated Tours InBloom pulls from server --- sqlite/data/proxy/SqliteStorage.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sqlite/data/proxy/SqliteStorage.js b/sqlite/data/proxy/SqliteStorage.js index 2805c11..9d358a8 100644 --- a/sqlite/data/proxy/SqliteStorage.js +++ b/sqlite/data/proxy/SqliteStorage.js @@ -164,7 +164,7 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { if (filters != null) sql += me.whereClause(filters); if (grouper != null) sql += me.groupClause(grouper); if (sorters != null) sql += me.orderClause(sorters); - if (limit != null && start != null) sql += me.limitClause(limit, start); + if (!isNaN(limit) && !isNaN(start)) sql += me.limitClause(limit, start); }else{ sql = operation.config.query; } @@ -501,8 +501,8 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { }, limitClause: function (limit, start) { var sql = "\nLIMIT"; - if (start != null) sql += ' ' + start + ','; - if (limit != null) sql += ' ' + limit; + if (!isNaN(start)) sql += ' ' + start + ','; + if (!isNaN(limit)) sql += ' ' + limit; return sql; }, From 3bb3059d6379c64ba22395144974cbadc39c3c16 Mon Sep 17 00:00:00 2001 From: Ross Gerbasi Date: Thu, 12 Jul 2012 12:24:05 -0500 Subject: [PATCH 5/8] Updated with Proper Total Count for Paging --- sqlite/data/proxy/SqliteStorage.js | 36 ++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/sqlite/data/proxy/SqliteStorage.js b/sqlite/data/proxy/SqliteStorage.js index 9d358a8..91907f6 100644 --- a/sqlite/data/proxy/SqliteStorage.js +++ b/sqlite/data/proxy/SqliteStorage.js @@ -153,8 +153,8 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { filters = operation.getFilters(), fieldTypes = {}; - var sql = "SELECT _ROWID_,*\nFROM " + me.getDbConfig().tablename; + if(!operation.config.hasOwnProperty("query")) { grouper = this.applyGrouper(grouper); filters = this.applyFilters(filters); @@ -164,14 +164,31 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { if (filters != null) sql += me.whereClause(filters); if (grouper != null) sql += me.groupClause(grouper); if (sorters != null) sql += me.orderClause(sorters); - if (!isNaN(limit) && !isNaN(start)) sql += me.limitClause(limit, start); }else{ sql = operation.config.query; } + + var regExp = /select(.*\n*)from/gi; + var sql_count = sql.replace(regExp, "SELECT count(*) as total FROM"); + if (!isNaN(limit) && limit != null) sql += me.limitClause(limit, start); var onSuccess, onError; + var countGroups = operation.config.hasOwnProperty("countTotals") ? operation.config.countTotals : true; onSuccess = function (tx, results) { - me.applyDataToModel(tx, results, operation, callback, scope); + me.transactionDB(me.getDb(), [function (tx) { + tx.executeSql(sql_count, [], function(count_tx, count_results){ + var total_count = count_results.rows.length; + if(countGroups){ + total_count = 0; + for (var i=0;i Date: Mon, 23 Jul 2012 16:50:30 -0500 Subject: [PATCH 6/8] Fixed semi-colon bug --- sqlite/data/proxy/SqliteStorage.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sqlite/data/proxy/SqliteStorage.js b/sqlite/data/proxy/SqliteStorage.js index 91907f6..81f175d 100644 --- a/sqlite/data/proxy/SqliteStorage.js +++ b/sqlite/data/proxy/SqliteStorage.js @@ -115,17 +115,17 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { if (typeof callback == 'function') { callback.call(scope, operation); } - }, - onError = function (tx, err) { - operation.setCompleted(); - operation.setException(err ? err : ''); - if (typeof callback == 'function') { - callback.call(scope, operation); - } - }; + }; - operation.setStarted(); + onError = function (tx, err) { + operation.setCompleted(); + operation.setException(err ? err : ''); + if (typeof callback == 'function') { + callback.call(scope, operation); + } + }; + operation.setStarted(); for (i = 0; i < length; i++) { queries.push(this.getDeleteRecordFunc(records[i], me.getDbConfig().tablename)); } From 3ba7e8e8d5e129bb9f93ade0b7973b9fec1ed26d Mon Sep 17 00:00:00 2001 From: Ross Gerbasi Date: Wed, 25 Jul 2012 18:27:49 -0500 Subject: [PATCH 7/8] Updated for new "Local Copy" SQLite Database support. --- sqlite/Connection.js | 45 ------------------------------ sqlite/data/proxy/SqliteStorage.js | 8 ++++-- 2 files changed, 6 insertions(+), 47 deletions(-) delete mode 100644 sqlite/Connection.js diff --git a/sqlite/Connection.js b/sqlite/Connection.js deleted file mode 100644 index 7787bc1..0000000 --- a/sqlite/Connection.js +++ /dev/null @@ -1,45 +0,0 @@ -// var a = {dbName : "test",dbVersion : "1.0",dbDescription: "testdb",dbSize : 65536}; - -Ext.define('Sqlite.Connection', { - extend: 'Ext.util.Observable', - /** - * @cfg {String} dbName - * Name of database - */ - dbName: undefined, - - /** - * @cfg {String} version - * database version. If different than current, use updatedb event to update database - */ - dbVersion: '1.19', - - /** - * @cfg {String} dbDescription - * Description of the database - */ - dbDescription: '', - - /** - * @cfg {String} dbSize - * Max storage size in bytes - */ - dbSize: 5 * 1024 * 1024, - - /** - * @cfg {String} dbConn - * database connection object - */ - dbConn: undefined, - - constructor: function (config) { - config = config || {}; - - Ext.apply(this, config); - var me = this; - - me.callParent([this]); - me.dbConn = openDatabase(me.dbName, me.dbVersion, me.dbDescription, me.dbSize); - return me; - } -}); \ No newline at end of file diff --git a/sqlite/data/proxy/SqliteStorage.js b/sqlite/data/proxy/SqliteStorage.js index 81f175d..36720f1 100644 --- a/sqlite/data/proxy/SqliteStorage.js +++ b/sqlite/data/proxy/SqliteStorage.js @@ -202,9 +202,13 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { /* GENERAL DB FUNCTIONS */ - getDb: function () { - return this.getDbConfig().dbConn.dbConn; + if(!this.cachedDb){ + this.cachedDb = this.getDbConfig().dbConn; + if(Ext.isFunction(this.cachedDb)) this.cachedDb = this.cachedDb(); + if(this.cachedDb.hasOwnProperty("dbConn")) this.cachedDb = this.cachedDb.dbConn; + } + return this.cachedDb; }, throwDbError: function (tx, err) { From 944086c949bfe28afc7c368e2bd8e63a7a419e0e Mon Sep 17 00:00:00 2001 From: Ross Gerbasi Date: Wed, 25 Jul 2012 18:31:32 -0500 Subject: [PATCH 8/8] Removed Connection.js allowing any Database provider. dbConn can optional be a function returning a database. --- sqlite/data/proxy/SqliteStorage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/sqlite/data/proxy/SqliteStorage.js b/sqlite/data/proxy/SqliteStorage.js index 36720f1..3a60c38 100644 --- a/sqlite/data/proxy/SqliteStorage.js +++ b/sqlite/data/proxy/SqliteStorage.js @@ -208,6 +208,7 @@ Ext.define('Sqlite.data.proxy.SqliteStorage', { if(Ext.isFunction(this.cachedDb)) this.cachedDb = this.cachedDb(); if(this.cachedDb.hasOwnProperty("dbConn")) this.cachedDb = this.cachedDb.dbConn; } + return this.cachedDb; },