- Author:
- David Nickerson <nickerso@users.sourceforge.net>
- Date:
- 2009-07-16 02:00:03+12:00
- Desc:
- the starting point for the HH tutorial example
- Permanent Source URI:
- https://models.fieldml.org/workspace/a1/rawfile/f6a8f90307388eb4b040ee3566b84d88b59247f7/dojo-presentation/js/dojo/dojox/storage/GearsStorageProvider.js
dojo.provide("dojox.storage.GearsStorageProvider");
dojo.require("dojo.gears");
dojo.require("dojox.storage.Provider");
dojo.require("dojox.storage.manager");
dojo.require("dojox.sql");
if(dojo.gears.available){
(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(dojo.config["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.gears.available;
},
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(), namespace);
return;
}
if(resultsHandler){
resultsHandler(dojox.storage.SUCCESS, key, null, namespace);
}
},
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(), namespace);
}
return;
}
if(resultsHandler){
resultsHandler(dojox.storage.SUCCESS, keys, null, namespace);
}
},
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());
})();
}