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:
parent
b0e15d1a7f
commit
30c13ae12f
@ -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 => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user