Created
February 4, 2014 21:27
-
-
Save r3b/8812692 to your computer and use it in GitHub Desktop.
Playing with IndexedDB
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <html> | |
| <head> | |
| <meta charset="utf-8"> | |
| <title>IndexedDB Tests</title> | |
| <script> | |
| function isFunction(f) { | |
| return (f && f !== null && typeof(f) === 'function'); | |
| } | |
| </script> | |
| <script src="KeyStore.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| var keystore= new KeyStore('test_keystore', 8, 'data', 'key', function(err, keystore){ | |
| console.log(err, keystore); | |
| keystore.set('token', 'F01DE600-0000-0000-0000-000000000000', function(){ | |
| console.log("set", arguments); | |
| keystore.get('token', function(){ | |
| console.log("get", arguments); | |
| keystore.delete('token', function(){ | |
| console.log("delete", arguments); | |
| keystore.get('token', function(){ | |
| console.log("get", arguments); | |
| }); | |
| }); | |
| }); | |
| }); | |
| }) | |
| </script> | |
| </body> | |
| </html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| var KeyStore=(function(global){ | |
| global.indexedDB = global.indexedDB || global.mozIndexedDB || global.webkitIndexedDB || global.msIndexedDB; | |
| // (Mozilla has never prefixed these objects, so we don't need global.mozIDB*) | |
| global.IDBTransaction = global.IDBTransaction || global.webkitIDBTransaction || global.msIDBTransaction; | |
| global.IDBKeyRange = global.IDBKeyRange || global.webkitIDBKeyRange || global.msIDBKeyRange; | |
| function KeyStore(database, version, storeName, keyPath, callback){ | |
| this.db=null; | |
| this.error=null; | |
| this.ready=false; | |
| this.storeName=storeName; | |
| this.keyPath=keyPath; | |
| var self=this; | |
| var request = indexedDB.open(database, version); | |
| function useDatabase(db, callback) { | |
| db.onversionchange = function(event) { | |
| db.close(); | |
| console.warn("A new version of this keystore has been loaded. Please restart your application!"); | |
| }; | |
| self.db=db; | |
| self.ready=true; | |
| (isFunction(callback)) && (callback(null, self)); | |
| } | |
| request.onerror = function(event) { | |
| console.error("internal keystore error: " + event.target.errorCode); | |
| self.ready=true; | |
| self.error=event.target; | |
| (isFunction(callback)) && (callback(event.target, self)); | |
| }; | |
| request.onupgradeneeded = function(event) { | |
| console.warn("upgrading internal keystore"); | |
| var db = event.target.result; | |
| var objectStore; | |
| try{ | |
| objectStore = event.currentTarget.transaction.objectStore(self.storeName); | |
| //console.log(objectStore); | |
| if (!objectStore)throw "not found"; | |
| }catch(e){ | |
| objectStore = db.createObjectStore(self.storeName, { | |
| keyPath: self.keyPath | |
| }); | |
| }finally{ | |
| objectStore.transaction.oncomplete = function(event) { | |
| console.info("created ObjectStore: '%s'", self.storeName); | |
| //useDatabase(db, callback); | |
| }; | |
| } | |
| var index; | |
| try{ | |
| index = objectStore.index(self.keyPath); | |
| if(!index) throw "not found"; | |
| }catch(e){ | |
| objectStore.createIndex(self.keyPath, self.keyPath, {unique: true}); | |
| }finally{ | |
| objectStore.transaction.oncomplete = function(event) { | |
| console.info("created ObjectStore index: '%s'", self.keyPath); | |
| //useDatabase(db, callback); | |
| }; | |
| } | |
| }; | |
| request.onsuccess = function(event) { | |
| console.info("successfully opened database %s", event.target.result); | |
| useDatabase(event.target.result, callback); | |
| }; | |
| } | |
| KeyStore.prototype.delete=function(key, callback) { | |
| var transaction = this.db.transaction([this.storeName], "readwrite"); | |
| var objectStore = transaction.objectStore(this.storeName); | |
| var item = objectStore.get(key); | |
| item.onsuccess = function(event) { | |
| objectStore.delete(key); | |
| (isFunction(callback)) && (callback(null, key)); | |
| }; | |
| item.onerror = function(event) { | |
| console.warn("Attempt to delete nonexistent item from keystore: %s", key); | |
| (isFunction(callback)) && (callback(null, key)); | |
| }; | |
| }; | |
| KeyStore.prototype.get=function(key, callback) { | |
| var transaction = this.db.transaction([this.storeName], "readwrite"); | |
| var objectStore = transaction.objectStore(this.storeName); | |
| var item = objectStore.get(key); | |
| item.onsuccess = function(event) { | |
| console.log(event.target.result); | |
| (isFunction(callback)) && (callback(null, event.target.result?event.target.result.value:null)); | |
| }; | |
| item.onerror = function(event) { | |
| (isFunction(callback)) && (callback(event.target, event.target.result?event.target.result.value:null)); | |
| }; | |
| }; | |
| KeyStore.prototype.set = function(key, value, callback) { | |
| var transaction = this.db.transaction([this.storeName], "readwrite"); | |
| var objectStore = transaction.objectStore(this.storeName); | |
| var data={'key':key,'value':value}; | |
| var item = objectStore.get(key); | |
| item.onsuccess = function(event) { | |
| data.created=(event.target.result)?event.target.result.created:Date.now(); | |
| data.modified=Date.now(); | |
| objectStore.delete(key); | |
| objectStore.add(data).onsuccess = function(event) { | |
| //event.target.result is the 'key' | |
| console.info("KEYSTORE: update %s=%s", data.key, data.value); | |
| (isFunction(callback)) && (callback(null, data.value)); | |
| }; | |
| }; | |
| item.onerror = function(event) { | |
| data.created=Date.now(); | |
| data.modified=Date.now(); | |
| objectStore.add(data).onsuccess = function(event) { | |
| console.info("KEYSTORE: create %s=%s", data.key=data.value); | |
| (isFunction(callback)) && (callback(null, data)); | |
| }; | |
| }; | |
| }; | |
| return KeyStore; | |
| }(this)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment