Skip to content

Instantly share code, notes, and snippets.

@r3b
Created February 4, 2014 21:27
Show Gist options
  • Select an option

  • Save r3b/8812692 to your computer and use it in GitHub Desktop.

Select an option

Save r3b/8812692 to your computer and use it in GitHub Desktop.
Playing with IndexedDB
<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>
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