1 line
5.1 KiB
JavaScript
1 line
5.1 KiB
JavaScript
|
|
function addObject(db,key,val,storeName){return new Promise(function(resolve,reject){var request=getStore(db,storeName,"readwrite").put(val,key);request.onerror=reject,request.onsuccess=resolve})}function updateObject(db,key,val,storeName){return new Promise(function(resolve,reject){let request=getStore(db,storeName,"readwrite").put(val,key);request.onerror=reject,request.onsuccess=function(){resolve(request.result)}})}function deleteObject(db,key,storeName){return new Promise(function(resolve,reject){var request=getStore(db,storeName,"readwrite").delete(key);request.onerror=reject,request.onsuccess=resolve})}function clearObjects(db,storeName){return new Promise(function(resolve,reject){var request=getStore(db,storeName,"readwrite").clear();request.onerror=reject,request.onsuccess=resolve})}function getAllObjects(db,storeName){return new Promise(function(resolve,reject){var objectStore=getStore(db,storeName);let request;if("function"==typeof objectStore.getAll)(request=objectStore.getAll()).onsuccess=function(event){resolve(event.target.result)};else{let results=[];(request=objectStore.openCursor()).onsuccess=function(event){event=event.target.result;event?(results.push(event.value),event.continue()):resolve(results)}}request.onerror=reject})}function getObjectByKey(db,key,storeName){return new Promise(function(resolve,reject){let request=getStore(db,storeName).get(key);request.onerror=reject,request.onsuccess=function(){resolve(request.result)}})}function getObjectsByKeys(db,keys,storeName){return Array.isArray(keys)&&1!==keys.length?(4<keys.length?getObjectsByKeysSequentialSeek:getObjectsByKeysParallelLookup)(db,keys,storeName):getObjectByKey(db,Array.isArray(keys)?keys[0]:keys,storeName)}function getObjectsByKeysParallelLookup(db,keys,storeName){keys=keys.map(function(key){return getObjectByKey(db,key,storeName)});return Promise.all(keys).then(function(results){results=results.reduce(function(acc,val){return acc.concat(val)},[]);return Promise.resolve(results)})}function getObjectsByKeysSequentialSeek(db,keys,storeName){return new Promise(function(resolve,reject){var objectStore=getStore(db,storeName);let set=keys.slice(0),i=(set.sort(function(a,b){return indexedDB.cmp(a,b)}),0);var range=IDBKeyRange.bound(set[0],set[set.length-1]);let results=[];objectStore=objectStore.openCursor(range);objectStore.onsuccess=function(event){event=event.target.result;if(event){for(var key=event.key;0<indexedDB.cmp(key,set[i]);)if(++i===set.length)return void resolve(results);key===set[i]?(results.push(event.value),event.continue()):event.continue(set[i])}else resolve(results)},objectStore.onerror=reject})}function getObjectsByIndexKeys(db,indexName,keys,storeName){return Array.isArray(keys)&&1!==keys.length?(4<keys.length?getObjectsByIndexKeysSequentialSeek:getObjectsByIndexKeysParallelLookup)(db,indexName,keys,storeName):getObjectsBySingleIndexKey(db,indexName,Array.isArray(keys)?keys[0]:keys,storeName)}function getObjectsByIndexKeysParallelLookup(db,indexName,keys,storeName){keys=keys.map(function(key){return getObjectsBySingleIndexKey(db,indexName,key,storeName)});return Promise.all(keys).then(function(results){results=results.reduce(function(acc,val){return acc.concat(val)},[]);return Promise.resolve(results)})}function getObjectsBySingleIndexKey(db,indexName,key,storeName){return new Promise(function(resolve,reject){storeName=storeName||db.name;var index=db.transaction([storeName],"readonly").objectStore(storeName).index(indexName);let request;if("function"==typeof index.getAll)(request=index.getAll(key)).onsuccess=function(event){resolve(event.target.result)};else{let results=[];(request=index.openCursor(key)).onsuccess=function(event){event=event.target.result;event?(results.push(event.value),event.continue()):resolve(results)}}request.onerror=reject})}function getObjectsByIndexKeysSequentialSeek(db,indexName,keys,storeName){return new Promise(function(resolve,reject){var index=getStore(db,storeName).index(indexName);let set=keys.slice(0),i=(set.sort(function(a,b){return indexedDB.cmp(a,b)}),0);var range=IDBKeyRange.bound(set
|