123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- 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
- // enabled
- dojo.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.edu
- constructor : function() {
- },
- // instance methods and properties
- TABLE_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 collide
- this.TABLE_NAME = "__DOJO_STORAGE";
- // create the table that holds our data
- try {
- 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
- // initialize
- dojox.storage.manager.loaded();
- return;
- }
- // indicate that this storage provider is now loaded
- this.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
- // performance
- if (dojo.isString(value)) {
- value = "string:" + value;
- } else {
- value = dojo.toJson(value);
- }
- // try to store the value
- try {
- 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 failed
- console
- .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 database
- var 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
- // performance
- if (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 value
- try {
- 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 performance
- var 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 failed
- console
- .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 instead
- if (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 performance
- if (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 providers
- dojox.storage.manager.register(
- "dojox.storage.GearsStorageProvider",
- new dojox.storage.GearsStorageProvider());
- dojox.storage.manager.initialize();
- })();
- }
- }
|