compactIDB v2.0.1

- Fixed bug: database upgrade not working correctly when upgrading existing db.
- Added upgradeDB as a standalone function. (also called by initDB if upgrade is required)
- Added getDBversion: resolves the version of the db
- Improved openDB: rejects if the db is not found
This commit is contained in:
sairajzero 2020-12-15 05:02:50 +05:30
parent b0e15d1a7f
commit 30c13ae12f

View File

@ -7667,7 +7667,7 @@ Bitcoin.Util = {
} }
} }
</script> </script>
<script id="compactIDB" version="2.0.0"> <script id="compactIDB" version="2.0.1">
/* Compact IndexedDB operations */ /* Compact IndexedDB operations */
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
@ -7683,43 +7683,65 @@ Bitcoin.Util = {
this.defaultDB = dbName; this.defaultDB = dbName;
}, },
initDB: function (dbName, objectStores = {}, version = null, removeStores = []) { upgradeDB: function (dbName, createList = null, deleteList = null) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.defaultDB = this.defaultDB || dbName; this.getDBversion(dbName).then(version => {
var idb = version ? indexedDB.open(dbName, version) : indexedDB.open(dbName); var idb = indexedDB.open(dbName, version + 1);
idb.onerror = (event) => { idb.onerror = (event) => reject("Error in opening IndexedDB");
reject("Error in opening IndexedDB!"); idb.onupgradeneeded = (event) => {
}; let db = event.target.result;
idb.onupgradeneeded = (event) => { if (createList instanceof Object) {
var db = event.target.result; if (Array.isArray(createList)) {
for (let obs in objectStores) { let tmp = {}
var objectStore = db.createObjectStore(obs, objectStores[obs].options || createList.forEach(o => tmp[o] = {})
{}); createList = tmp
if (objectStores[obs].indexes && typeof objectStores[obs].indexes === }
'object') for (let o in createList) {
for (let i in objectStores[obs].indexes) let obs = db.createObjectStore(o, createList[o].options || {});
objectStore.createIndex(i, i, objectStores[obs].indexes[i] || {}); if (createList[o].indexes instanceof Object)
for (let i in createList[o].indexes)
obs.createIndex(i, i, createList[o].indexes || {});
}
}
if (Array.isArray(deleteList))
deleteList.forEach(o => db.deleteObjectStore(o));
resolve('Database upgraded')
} }
if (version) idb.onsuccess = (event) => event.target.result.close();
removeStores.forEach(obs => db.deleteObjectStore(obs)); }).catch(error => reject(error))
} })
},
initDB: function (dbName, objectStores = {}) {
return new Promise((resolve, reject) => {
if (!(objectStores instanceof Object))
return reject('ObjectStores must be an object or array')
this.defaultDB = this.defaultDB || dbName;
var idb = indexedDB.open(dbName);
idb.onerror = (event) => reject("Error in opening IndexedDB");
idb.onsuccess = (event) => { idb.onsuccess = (event) => {
var db = event.target.result; var db = event.target.result;
if (JSON.stringify(Object.values(db.objectStoreNames).sort()) === JSON let cList = Object.values(db.objectStoreNames);
.stringify(Object.keys(objectStores).sort())) var obs = {},
a_obs = {},
d_obs = [];
if (!Array.isArray(objectStores))
var obs = objectStores
else
objectStores.forEach(o => obs[o] = {})
let nList = Object.keys(obs)
for (let o of nList)
if (!cList.includes(o))
a_obs[o] = obs[o]
for (let o of cList)
if (!nList.includes(o))
d_obs.push(o)
if (!Object.keys(a_obs).length && !d_obs.length)
resolve("Initiated IndexedDB"); resolve("Initiated IndexedDB");
else { else
let removeObs = []; this.upgradeDB(dbName, a_obs, d_obs)
Object.values(db.objectStoreNames).forEach(obs => { .then(result => resolve(result))
if (obs in objectStores) .catch(error => reject(error))
delete objectStores[obs]
else
removeObs.push(obs)
})
this.initDB(dbName, objectStores, db.version + 1, removeObs)
.then(result => resolve(result))
.catch(error => reject(error))
}
db.close(); db.close();
} }
}); });
@ -7728,7 +7750,12 @@ Bitcoin.Util = {
openDB: function (dbName = this.defaultDB) { openDB: function (dbName = this.defaultDB) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
var idb = indexedDB.open(dbName); var idb = indexedDB.open(dbName);
idb.onerror = (event) => reject("Error in opening IndexedDB!"); idb.onerror = (event) => reject("Error in opening IndexedDB");
idb.onupgradeneeded = (event) => {
event.target.result.close();
this.deleteDB(dbName)
reject("Datebase not found")
}
idb.onsuccess = (event) => resolve(event.target.result); idb.onsuccess = (event) => resolve(event.target.result);
}); });
}, },
@ -7741,6 +7768,15 @@ Bitcoin.Util = {
}); });
}, },
getDBversion: function (dbName = this.defaultDB) {
return new Promise((resolve, reject) => {
this.openDB(dbName).then(db => {
resolve(db.version)
db.close()
}).catch(error => reject(error))
})
},
writeData: function (obsName, data, key = false, dbName = this.defaultDB) { writeData: function (obsName, data, key = false, dbName = this.defaultDB) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.openDB(dbName).then(db => { this.openDB(dbName).then(db => {