Improved initDB

initDB also deletes objectstores on upgrade needed (version change)
This commit is contained in:
sairajzero 2020-05-07 15:46:58 +05:30
parent 489996c1b8
commit 32da4e28af

View File

@ -8377,33 +8377,40 @@ Bitcoin.Util = {
this.dbName = dbName; this.dbName = dbName;
}, },
initDB: function (dbName, objectStores = {}) { initDB: function (dbName, objectStores = {}, version = null, removeStores = []) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.dbName = this.dbName || dbName; this.dbName = this.dbName || dbName;
var idb = indexedDB.open(dbName); var idb = version ? indexedDB.open(dbName, version) : indexedDB.open(dbName);
idb.onerror = (event) => { idb.onerror = (event) => {
reject("Error in opening IndexedDB!"); reject("Error in opening IndexedDB!");
}; };
idb.onupgradeneeded = (event) => { idb.onupgradeneeded = (event) => {
var db = event.target.result; var db = event.target.result;
for (obs in objectStores) { for (let obs in objectStores) {
var objectStore = db.createObjectStore(obs, objectStores[obs].options || var objectStore = db.createObjectStore(obs, objectStores[obs].options ||
{}); {});
if (objectStores[obs].indexes && typeof objectStores[obs].indexes === if (objectStores[obs].indexes && typeof objectStores[obs].indexes ===
'object') 'object')
for (i in objectStores[obs].indexes) for (let i in objectStores[obs].indexes)
objectStore.createIndex(i, i, objectStores[obs].indexes[i] || {}); objectStore.createIndex(i, i, objectStores[obs].indexes[i] || {});
} }
if (version)
removeStores.forEach(obs => db.deleteObjectStore(obs));
} }
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 if (JSON.stringify(Object.values(db.objectStoreNames).sort()) === JSON
.stringify(Object.keys( .stringify(Object.keys(objectStores).sort()))
objectStores).sort()))
resolve("Initiated IndexedDB"); resolve("Initiated IndexedDB");
else { else {
Object.values(db.objectStoreNames).forEach(obs => delete objectStores[obs]) let removeObs = [];
this.initDB(dbName, objectStores, db.version + 1) Object.values(db.objectStoreNames).forEach(obs => {
if (obs in objectStores)
delete objectStores[obs]
else
removeObs.push(obs)
})
this.initDB(dbName, objectStores, db.version + 1, removeObs)
.then(result => resolve(result)) .then(result => resolve(result))
.catch(error => reject(error)) .catch(error => reject(error))
} }