109 lines
3.1 KiB
JavaScript

const INTERNAL_SECOND_MS = 60 * 1000;
const INTERNAL_MINUTE_MS = 60 * INTERNAL_SECOND_MS;
const INTERNAL_HOUR_MS = 60 * INTERNAL_MINUTE_MS;
var isIndexedDBSupported = 'indexedDB' in window;
$.dbManager = {
openDatabases: {}
}
$.dbManager.alert = function (msg) {
alert(msg);
}
$.dbManager.openDatabase = function (name, version, onUpgradeNeeded) {
let dbManager = this;
return new Promise(function (resolve, reject) {
let db = dbManager.openDatabases[name];
if (db !== undefined && db !== null) {
resolve(db);
return;
}
let request = indexedDB.open(name, version);
request.onupgradeneeded = function (event) {
//Upgrade DB? Drop DB and reload? For now, drop db
console.log("onupgradeneeded");
if (onUpgradeNeeded != null) {
onUpgradeNeeded(event);
}
else {
dbManager.deleteDatabase(name).then(
function onSuccess(db) {
resolve(db);
},
function onError(error) {
reject(error);
});
}
//reject("Upgrade Needed");
};
request.onerror = function () {
console.error("Error: ", request.error);
reject(request.error);
};
request.onblocked = function () {
console.error();
reject("Database blocked");
};
request.onsuccess = function () {
let db = request.result;
db.onversionchange = function (event) {
let isDeleted = event.newVersion === null;
db.close();
if(!isDeleted)
alert("Database is outdated, please reload the page: ", event.currentTarget.name)
};
console.log("Database opened: ", name);
if (dbManager.openDatabases == null)
dbManager.openDatabases = {};
dbManager.openDatabases[name] = db;
db.onclose = function () { //TODO: DOesn't appear to be called currently
console.log('Database connection closed: ', name);
dbManager.openDatabases[name] = null;
}
resolve(db);
};
});
}
$.dbManager.closeDatabase = function (name) {
let currentDB = this;
return new Promise(function (resolve, reject) {
let db = currentDB.openDatabases[name];
if (db != null) {
db.close();
}
currentDB.openDatabases[name] == null;
resolve();
});
}
$.dbManager.deleteDatabase = function (name) {
let currentDB = this;
return new Promise(function (resolve, reject) {
let request = indexedDB.deleteDatabase(name);
request.onerror = function () {
console.error("Error", request.error);
reject(request.error);
};
request.onsuccess = function () {
console.log("database deleted: ", name);
currentDB.openDatabases[name] = null;
resolve();
};
});
}