Blame | Last modification | View Log | RSS feed
if(!dojo._hasResource["dojox.storage.GearsStorageProvider"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojox.storage.GearsStorageProvider"] = true;dojo.provide("dojox.storage.GearsStorageProvider");dojo.require("dojox.storage.Provider");dojo.require("dojox.storage.manager");dojo.require("dojox.sql");if(dojo.isGears){(function(){// make sure we don't define the gears provider if we're not gears// enableddojo.declare("dojox.storage.GearsStorageProvider", dojox.storage.Provider, {// summary:// Storage provider that uses the features of Google Gears// to store data (it is saved into the local SQL database// provided by Gears, using dojox.sql)// description:////// You can disable this storage provider with the following djConfig// variable:// var djConfig = { disableGearsStorage: true };//// Authors of this storage provider-// Brad Neuberg, bkn3@columbia.educonstructor: function(){},// instance methods and propertiesTABLE_NAME: "__DOJO_STORAGE",initialized: false,_available: null,initialize: function(){//console.debug("dojox.storage.GearsStorageProvider.initialize");if(djConfig["disableGearsStorage"] == true){return;}// partition our storage data so that multiple apps// on the same host won't collidethis.TABLE_NAME = "__DOJO_STORAGE";// create the table that holds our datatry{dojox.sql("CREATE TABLE IF NOT EXISTS " + this.TABLE_NAME + "( "+ " namespace TEXT, "+ " key TEXT, "+ " value TEXT "+ ")");dojox.sql("CREATE UNIQUE INDEX IF NOT EXISTS namespace_key_index"+ " ON " + this.TABLE_NAME+ " (namespace, key)");}catch(e){console.debug("dojox.storage.GearsStorageProvider.initialize:", e);this.initialized = false; // we were unable to initializedojox.storage.manager.loaded();return;}// indicate that this storage provider is now loadedthis.initialized = true;dojox.storage.manager.loaded();},isAvailable: function(){// is Google Gears available and defined?return this._available = dojo.isGears;},put: function(key, value, resultsHandler, namespace){if(this.isValidKey(key) == false){throw new Error("Invalid key given: " + key);}namespace = namespace||this.DEFAULT_NAMESPACE;// serialize the value;// handle strings differently so they have better performanceif(dojo.isString(value)){value = "string:" + value;}else{value = dojo.toJson(value);}// try to store the valuetry{dojox.sql("DELETE FROM " + this.TABLE_NAME+ " WHERE namespace = ? AND key = ?",namespace, key);dojox.sql("INSERT INTO " + this.TABLE_NAME+ " VALUES (?, ?, ?)",namespace, key, value);}catch(e){// indicate we failedconsole.debug("dojox.storage.GearsStorageProvider.put:", e);resultsHandler(this.FAILED, key, e.toString());return;}if(resultsHandler){resultsHandler(dojox.storage.SUCCESS, key, null);}},get: function(key, namespace){if(this.isValidKey(key) == false){throw new Error("Invalid key given: " + key);}namespace = namespace||this.DEFAULT_NAMESPACE;// try to find this key in the databasevar results = dojox.sql("SELECT * FROM " + this.TABLE_NAME+ " WHERE namespace = ? AND "+ " key = ?",namespace, key);if(!results.length){return null;}else{results = results[0].value;}// destringify the content back into a// real JavaScript object;// handle strings differently so they have better performanceif(dojo.isString(results) && (/^string:/.test(results))){results = results.substring("string:".length);}else{results = dojo.fromJson(results);}return results;},getNamespaces: function(){var results = [ dojox.storage.DEFAULT_NAMESPACE ];var rs = dojox.sql("SELECT namespace FROM " + this.TABLE_NAME+ " DESC GROUP BY namespace");for(var i = 0; i < rs.length; i++){if(rs[i].namespace != dojox.storage.DEFAULT_NAMESPACE){results.push(rs[i].namespace);}}return results;},getKeys: function(namespace){namespace = namespace||this.DEFAULT_NAMESPACE;if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}var rs = dojox.sql("SELECT key FROM " + this.TABLE_NAME+ " WHERE namespace = ?",namespace);var results = [];for(var i = 0; i < rs.length; i++){results.push(rs[i].key);}return results;},clear: function(namespace){if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}namespace = namespace||this.DEFAULT_NAMESPACE;dojox.sql("DELETE FROM " + this.TABLE_NAME+ " WHERE namespace = ?",namespace);},remove: function(key, namespace){namespace = namespace||this.DEFAULT_NAMESPACE;dojox.sql("DELETE FROM " + this.TABLE_NAME+ " WHERE namespace = ? AND"+ " key = ?",namespace,key);},putMultiple: function(keys, values, resultsHandler, namespace) {if(this.isValidKeyArray(keys) === false|| ! values instanceof Array|| keys.length != values.length){throw new Error("Invalid arguments: keys = ["+ keys + "], values = [" + values + "]");}if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}this._statusHandler = resultsHandler;// try to store the valuetry{dojox.sql.open();dojox.sql.db.execute("BEGIN TRANSACTION");var _stmt = "REPLACE INTO " + this.TABLE_NAME + " VALUES (?, ?, ?)";for(var i=0;i<keys.length;i++) {// serialize the value;// handle strings differently so they have better performancevar value = values[i];if(dojo.isString(value)){value = "string:" + value;}else{value = dojo.toJson(value);}dojox.sql.db.execute( _stmt,[namespace, keys[i], value]);}dojox.sql.db.execute("COMMIT TRANSACTION");dojox.sql.close();}catch(e){// indicate we failedconsole.debug("dojox.storage.GearsStorageProvider.putMultiple:", e);if(resultsHandler){resultsHandler(this.FAILED, keys, e.toString());}return;}if(resultsHandler){resultsHandler(dojox.storage.SUCCESS, key, null);}},getMultiple: function(keys, namespace){// TODO: Maybe use SELECT IN insteadif(this.isValidKeyArray(keys) === false){throw new ("Invalid key array given: " + keys);}if(namespace == null || typeof namespace == "undefined"){namespace = dojox.storage.DEFAULT_NAMESPACE;}if(this.isValidKey(namespace) == false){throw new Error("Invalid namespace given: " + namespace);}var _stmt = "SELECT * FROM " + this.TABLE_NAME +" WHERE namespace = ? AND " + " key = ?";var results = [];for(var i=0;i<keys.length;i++){var result = dojox.sql( _stmt, namespace, keys[i]);if( ! result.length){results[i] = null;}else{result = result[0].value;// destringify the content back into a// real JavaScript object;// handle strings differently so they have better performanceif(dojo.isString(result) && (/^string:/.test(result))){results[i] = result.substring("string:".length);}else{results[i] = dojo.fromJson(result);}}}return results;},removeMultiple: function(keys, namespace){namespace = namespace||this.DEFAULT_NAMESPACE;dojox.sql.open();dojox.sql.db.execute("BEGIN TRANSACTION");var _stmt = "DELETE FROM " + this.TABLE_NAME + " WHERE namespace = ? AND key = ?";for(var i=0;i<keys.length;i++){dojox.sql.db.execute( _stmt,[namespace, keys[i]]);}dojox.sql.db.execute("COMMIT TRANSACTION");dojox.sql.close();},isPermanent: function(){ return true; },getMaximumSize: function(){ return this.SIZE_NO_LIMIT; },hasSettingsUI: function(){ return false; },showSettingsUI: function(){throw new Error(this.declaredClass+ " does not support a storage settings user-interface");},hideSettingsUI: function(){throw new Error(this.declaredClass+ " does not support a storage settings user-interface");}});// register the existence of our storage providersdojox.storage.manager.register("dojox.storage.GearsStorageProvider",new dojox.storage.GearsStorageProvider());dojox.storage.manager.initialize();})();}}