epic-s6ts
[kivitendo-erp.git] / js / kivi.FileDB.js
index 3edb45b..7ee0701 100644 (file)
@@ -15,6 +15,7 @@ namespace("kivi.FileDB", function(ns) {
     ns.create_image_store(event.target.result);
   };
   request.onerror = ns.onerror;
+  request.aftersuccess = [];
   request.onsuccess = () => {
     db = request.result;
 
@@ -32,6 +33,8 @@ namespace("kivi.FileDB", function(ns) {
         };
       }
     }
+
+    request.aftersuccess.forEach(f => f());
   };
 
   ns.create_image_store = function (db) {
@@ -39,44 +42,72 @@ namespace("kivi.FileDB", function(ns) {
   };
 
   ns.store_image = function (blob, filename, success) {
-    let put_request = ns.open_store("readwrite").add(blob, filename);
+    ns.open_rw_store((store) => {
+      let put_request = store.add(blob, filename);
 
-    put_request.onsuccess = success;
-    put_request.on_error = ns.onerror;
+      put_request.onsuccess = success;
+      put_request.on_error = ns.onerror;
+    });
   };
 
   ns.retrieve_image = function(key, success) {
-    let get_request = ns.open_store().objectStore(store).get(key);
+    ns.open_ro_store((store) => {
+      let get_request = store.get(key);
 
-    get_request.onsuccess = success;
-    get_request.onerror = request.onerror;
+      get_request.onsuccess = success;
+      get_request.onerror = request.onerror;
+    });
   };
 
   ns.retrieve_all = function(success) {
-    let request = ns.open_store().getAll();
-    request.onsuccess = (event) => { success(event.target.result); };
-    request.onerror = ns.error;
+    ns.open_ro_store((store) => {
+      let request = store.getAll();
+      request.onsuccess = (event) => { success(event.target.result); };
+      request.onerror = ns.error;
+    });
   };
 
   ns.retrieve_all_keys = function(success) {
-    let request = ns.open_store().getAllKeys();
-    request.onsuccess = (event) => { success(event.target.result); };
-    request.onerror = ns.error;
+    ns.open_ro_store((store) => {
+      let request = store.getAllKeys();
+      request.onsuccess = (event) => { success(event.target.result); };
+      request.onerror = ns.error;
+    });
   };
 
-  ns.delete_all= function() {
-    ns.retrieve_all_keys((keys) => {
-      keys.forEach((key) => ns.delete_key(key));
+  ns.delete_all = function(success) {
+    ns.open_rw_store((store) => {
+      let request = store.clear();
+      request.onsuccess = success;
+      request.onerror = ns.error;
     });
   };
 
-  ns.delete_key= function(key, success) {
-    let request = ns.open_store("readwrite").delete(key);
-    request.onsuccess = (event) => { if (success) success(event.target.result); };
-    request.onerror = ns.error;
+  ns.delete_key = function(key, success) {
+    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_store = function(mode = "readonly")  {
+  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")));
+    }
+  };
+
+  ns.open_store = function(mode = "readonly") {
     return db.transaction([store], mode).objectStore(store);
   };
 
@@ -84,4 +115,13 @@ namespace("kivi.FileDB", function(ns) {
     console.error("Error creating/accessing IndexedDB database");
     console.error(event.errorState);
   };
+
+  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);
+    }
+  };
 });