1 namespace("kivi.FileDB", function(ns) {
4 const database = 'kivi';
9 const indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB;
11 // Create/open database
13 let request = indexedDB.open(database, db_version);
14 request.onupgradeneeded = (event) => {
15 ns.create_image_store(event.target.result);
17 request.onerror = ns.onerror;
18 request.aftersuccess = [];
19 request.onsuccess = () => {
22 db.onerror = (event) => {
23 console.error("Error creating/accessing IndexedDB database");
27 // Interim solution for Google Chrome to create an objectStore. Will be deprecated
29 if (db.version != db_version) {
30 let setVersion = db.setVersion(db_version);
31 setVersion.onsuccess = () => {
32 ns.create_image_store(db);
37 request.aftersuccess.forEach(f => f());
40 ns.create_image_store = function (db) {
41 db.createObjectStore(store, { autoIncrement : true });
44 ns.store_image = function (blob, filename, success) {
45 ns.open_rw_store((store) => {
46 let put_request = store.add(blob, filename);
48 put_request.onsuccess = success;
49 put_request.on_error = ns.onerror;
53 ns.retrieve_image = function(key, success) {
54 ns.open_ro_store((store) => {
55 let get_request = store.get(key);
57 get_request.onsuccess = success;
58 get_request.onerror = request.onerror;
62 ns.retrieve_all = function(success) {
63 ns.open_ro_store((store) => {
64 let request = store.getAll();
65 request.onsuccess = (event) => { success(event.target.result); };
66 request.onerror = ns.error;
70 ns.retrieve_all_keys = function(success) {
71 ns.open_ro_store((store) => {
72 let request = store.getAllKeys();
73 request.onsuccess = (event) => { success(event.target.result); };
74 request.onerror = ns.error;
78 ns.delete_all = function(success) {
79 ns.open_rw_store((store) => {
80 let request = store.clear();
81 request.onsuccess = success;
82 request.onerror = ns.error;
86 ns.delete_key = function(key, success) {
87 ns.open_rw_store((store) => {
88 let request = store.delete(key);
89 request.onsuccess = (event) => { if (success) success(event.target.result); };
90 request.onerror = ns.error;
94 ns.open_rw_store = function(callback) {
95 if (db && db_version == db.version) {
96 callback(ns.open_store("readwrite"));
98 request.aftersuccess.push(() => callback(ns.open_store("readwrite")));
102 ns.open_ro_store = function(callback) {
103 if (db && db_version == db.version) {
104 callback(ns.open_store("readonly"));
106 request.aftersuccess.push(() => callback(ns.open_store("readonly")));
110 ns.open_store = function(mode = "readonly") {
111 return db.transaction([store], mode).objectStore(store);
114 ns.onerror = (event) => {
115 console.error("Error creating/accessing IndexedDB database");
116 console.error(event.errorState);
119 ns.with_db = function(success) {
120 if (db && db_version == db.version) {
123 // assume the page load db init isn't done yet and push it onto the success
124 request.aftersuccess.push(success);