From e0ba9712d463ad71aef2142b74e000ecfc180fea Mon Sep 17 00:00:00 2001 From: "Jeremy Wall (zaphar)" Date: Tue, 16 Apr 2013 22:46:16 -0500 Subject: [PATCH] A basic IndexedDb wrapper api. * Init method for Initializing the Database. * Basic CRUD methods. * Session and Transaction Methods * for doing operations on an open database * and/or in a transaction. --- js/db.js | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 js/db.js diff --git a/js/db.js b/js/db.js new file mode 100644 index 00000000..0651f71d --- /dev/null +++ b/js/db.js @@ -0,0 +1,134 @@ +// TODO(jwall): Use RequireJS http://requirejs.org/docs/jquery.html +if (typeof dynamicbible == "undefined") { + dynamicbible = {}; +} + +// dynamicbible.db implements a basic wrapper for IndexedDB databases. +// See http://www.w3.org/TR/IndexedDB/ for more details about the +// IDB* interfaces referenced below. +dynamicbible.db = { + version: 1, + dbName: "localdata", + stores: ['settings', 'verselists'], + debug: false, + // Initialize database. If debug is true then logging will be turned on. + Init: function(debug) { + var self = this; + self.debug = debug; + self.Session( + function(e) { + self.debug && console.log("Database Init complete"); + }); + return self; + }, + // Internal method not for external use. + handleError: function(e) { + this.debug && console.log("Error: ", e); + }, + // Internal method not for external use. + handleUpdate: function(e) { + var db = e.target.result; + e.target.transaction.onerror = this.handleError; + for (i in this.stores) { + if (db.objectStoreNames.contains(this.stores[i])) { + // TODO(jwall): handle this more gracefully? + db.deleteObjectStore(this.stores[i]); + } + var store = db.createObjectStore(this.stores[i], + {keyPath: "key"}); + } + }, + // Do operations on an open database. + // ops is expected to be a function taking an IDBDatabase object + // as a parameter. + Session: function(ops) { + var self = this; + var req = indexedDB.open(this.dbname, this.version); + // HandleUpgrades + req.onupgradeneeded = function(e) { + self.handleUpdate(e); + }; + req.onsuccess = function(e) { + ops(e.target.result); + }; + }, + // Do operations on an open transaction scoped to the list of stores. + // ops is expected to be a function taking an IDBTransation object + // as a parameter. + // type is an optional transaction type. values should be one of the + // following: readonly or readwrite + Transaction: function(stores, ops, type) { + var self = this; + var transType = type || "readonly"; + self.debug && console.log( + "running", transType, "transaction on stores", + stores); + self.Session( + function(db) { + // Figure this api out. + var trans = db.transaction(stores, transType); + ops(trans); + }); + }, + // Get a key from the the object store. + // success is expected to be a function taking an IDBRequest object + // as a parameter. + // error is optional and expected to be a function taking an IDBRequest + // object as a parameter. + Get: function(storeName, key, success, error) { + var self = this; + self.Transaction( + [storeName], function(trans) { + var store = trans.objectStore(storeName); + var req = store.get(key); + req.onsuccess = success; + req.onerror = error || self.handleError; + }); + }, + // Store or update a key with data in an object store. + // success is expected to be a function taking an IDBRequest object + // as a parameter. + // error is optional and expected to be a function taking an IDBRequest + // object as a parameter. + Update: function(storeName, key, data, success, error) { + var self = this; + self.Transaction( + [storeName], function(trans) { + var store = trans.objectStore(storeName); + var req = store.put({"key": key, "data": data}); + req.onsuccess = success; + req.onerror = error || self.handleError; + }, "readwrite"); + }, + // Delete a key from an object store. + // success is expected to be a function taking an IDBRequest object + // as a parameter. + // error is optional and expected to be a function taking an IDBRequest + // object as a parameter. + Delete: function(storeName, key, success, error) { + var self = this; + self.Transaction( + [storeName], function(trans) { + var store = trans.objectStore(storeName); + var req = store.delete(key); + req.onsuccess = success; + req.onerror = error || self.handleError; + }, "readwrite"); + }, + // Query a range of values from an object store. + // range is expected to be an IDBKeyRange. + // success is expected to be a function taking an IDBRequest object + // as a parameter. + // error is optional and expected to be a function taking an IDBRequest + // object as a parameter. + Query: function(storeName, range, success, error) { + var self = this; + self.Transaction( + [storeName], function(trans) { + var store = trans.objectStore(storeName); + var req = store.openCursor(range); + req.onsuccess = success; + req.onerror = error || self.handleError; + }); + } +};