kivitendo/js/kivi.FileDB.js @ master
ecc4b0c2 | Sven Schöling | namespace("kivi.FileDB", function(ns) {
|
||
"use strict";
|
||||
const database = 'kivi';
|
||||
const store = 'files';
|
||||
const db_version = 1;
|
||||
// IndexedDB
|
||||
const indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB;
|
||||
// Create/open database
|
||||
let db;
|
||||
let request = indexedDB.open(database, db_version);
|
||||
request.onupgradeneeded = (event) => {
|
||||
ns.create_image_store(event.target.result);
|
||||
};
|
||||
request.onerror = ns.onerror;
|
||||
9129b021 | Sven Schöling | request.aftersuccess = [];
|
||
ecc4b0c2 | Sven Schöling | request.onsuccess = () => {
|
||
db = request.result;
|
||||
db.onerror = (event) => {
|
||||
console.error("Error creating/accessing IndexedDB database");
|
||||
console.error(event);
|
||||
};
|
||||
// Interim solution for Google Chrome to create an objectStore. Will be deprecated
|
||||
if (db.setVersion) {
|
||||
if (db.version != db_version) {
|
||||
let setVersion = db.setVersion(db_version);
|
||||
setVersion.onsuccess = () => {
|
||||
ns.create_image_store(db);
|
||||
};
|
||||
}
|
||||
}
|
||||
9129b021 | Sven Schöling | |||
request.aftersuccess.forEach(f => f());
|
||||
ecc4b0c2 | Sven Schöling | };
|
||
ns.create_image_store = function (db) {
|
||||
db.createObjectStore(store, { autoIncrement : true });
|
||||
};
|
||||
ns.store_image = function (blob, filename, success) {
|
||||
152a83a6 | Sven Schöling | ns.open_rw_store((store) => {
|
||
let put_request = store.add(blob, filename);
|
||||
ecc4b0c2 | Sven Schöling | |||
152a83a6 | Sven Schöling | put_request.onsuccess = success;
|
||
put_request.on_error = ns.onerror;
|
||||
});
|
||||
ecc4b0c2 | Sven Schöling | };
|
||
ns.retrieve_image = function(key, success) {
|
||||
152a83a6 | Sven Schöling | ns.open_ro_store((store) => {
|
||
let get_request = store.get(key);
|
||||
ecc4b0c2 | Sven Schöling | |||
152a83a6 | Sven Schöling | get_request.onsuccess = success;
|
||
get_request.onerror = request.onerror;
|
||||
});
|
||||
ecc4b0c2 | Sven Schöling | };
|
||
ns.retrieve_all = function(success) {
|
||||
152a83a6 | Sven Schöling | ns.open_ro_store((store) => {
|
||
let request = store.getAll();
|
||||
request.onsuccess = (event) => { success(event.target.result); };
|
||||
request.onerror = ns.error;
|
||||
});
|
||||
ecc4b0c2 | Sven Schöling | };
|
||
ns.retrieve_all_keys = function(success) {
|
||||
152a83a6 | Sven Schöling | ns.open_ro_store((store) => {
|
||
let request = store.getAllKeys();
|
||||
request.onsuccess = (event) => { success(event.target.result); };
|
||||
request.onerror = ns.error;
|
||||
});
|
||||
ecc4b0c2 | Sven Schöling | };
|
||
53baaec8 | Sven Schöling | ns.delete_all = function(success) {
|
||
ns.open_rw_store((store) => {
|
||||
let request = store.clear();
|
||||
request.onsuccess = success;
|
||||
request.onerror = ns.error;
|
||||
ecc4b0c2 | Sven Schöling | });
|
||
};
|
||||
53baaec8 | Sven Schöling | ns.delete_key = function(key, success) {
|
||
152a83a6 | Sven Schöling | ns.open_rw_store((store) => {
|
||
let request = store.delete(key);
|
||||
request.onsuccess = (event) => { if (success) success(event.target.result); };
|
||||
request.onerror = ns.error;
|
||||
});
|
||||
};
|
||||
ns.open_rw_store = function(callback) {
|
||||
if (db && db_version == db.version) {
|
||||
callback(ns.open_store("readwrite"));
|
||||
} else {
|
||||
request.aftersuccess.push(() => callback(ns.open_store("readwrite")));
|
||||
}
|
||||
};
|
||||
ns.open_ro_store = function(callback) {
|
||||
if (db && db_version == db.version) {
|
||||
callback(ns.open_store("readonly"));
|
||||
} else {
|
||||
request.aftersuccess.push(() => callback(ns.open_store("readonly")));
|
||||
}
|
||||
ecc4b0c2 | Sven Schöling | };
|
||
152a83a6 | Sven Schöling | ns.open_store = function(mode = "readonly") {
|
||
ecc4b0c2 | Sven Schöling | return db.transaction([store], mode).objectStore(store);
|
||
};
|
||||
ns.onerror = (event) => {
|
||||
console.error("Error creating/accessing IndexedDB database");
|
||||
console.error(event.errorState);
|
||||
};
|
||||
9129b021 | Sven Schöling | |||
ns.with_db = function(success) {
|
||||
if (db && db_version == db.version) {
|
||||
success();
|
||||
} else {
|
||||
// assume the page load db init isn't done yet and push it onto the success
|
||||
request.aftersuccess.push(success);
|
||||
}
|
||||
};
|
||||
ecc4b0c2 | Sven Schöling | });
|