epic-s6ts
[kivitendo-erp.git] / js / kivi.FileDB.js
1 namespace("kivi.FileDB", function(ns) {
2   "use strict";
3
4   const database = 'kivi';
5   const store    = 'files';
6   const db_version = 1;
7
8   // IndexedDB
9   const indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.OIndexedDB || window.msIndexedDB;
10
11   // Create/open database
12   let db;
13   let request = indexedDB.open(database, db_version);
14   request.onupgradeneeded = (event) => {
15     ns.create_image_store(event.target.result);
16   };
17   request.onerror = ns.onerror;
18   request.aftersuccess = [];
19   request.onsuccess = () => {
20     db = request.result;
21
22     db.onerror = (event) => {
23       console.error("Error creating/accessing IndexedDB database");
24       console.error(event);
25     };
26
27     // Interim solution for Google Chrome to create an objectStore. Will be deprecated
28     if (db.setVersion) {
29       if (db.version != db_version) {
30         let setVersion = db.setVersion(db_version);
31         setVersion.onsuccess = () =>  {
32           ns.create_image_store(db);
33         };
34       }
35     }
36
37     request.aftersuccess.forEach(f => f());
38   };
39
40   ns.create_image_store = function (db) {
41     db.createObjectStore(store, { autoIncrement : true });
42   };
43
44   ns.store_image = function (blob, filename, success) {
45     ns.open_rw_store((store) => {
46       let put_request = store.add(blob, filename);
47
48       put_request.onsuccess = success;
49       put_request.on_error = ns.onerror;
50     });
51   };
52
53   ns.retrieve_image = function(key, success) {
54     ns.open_ro_store((store) => {
55       let get_request = store.get(key);
56
57       get_request.onsuccess = success;
58       get_request.onerror = request.onerror;
59     });
60   };
61
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;
67     });
68   };
69
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;
75     });
76   };
77
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;
83     });
84   };
85
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;
91     });
92   };
93
94   ns.open_rw_store = function(callback) {
95     if (db && db_version == db.version) {
96       callback(ns.open_store("readwrite"));
97     } else {
98       request.aftersuccess.push(() => callback(ns.open_store("readwrite")));
99     }
100   };
101
102   ns.open_ro_store = function(callback) {
103     if (db && db_version == db.version) {
104       callback(ns.open_store("readonly"));
105     } else {
106       request.aftersuccess.push(() => callback(ns.open_store("readonly")));
107     }
108   };
109
110   ns.open_store = function(mode = "readonly") {
111     return db.transaction([store], mode).objectStore(store);
112   };
113
114   ns.onerror = (event) => {
115     console.error("Error creating/accessing IndexedDB database");
116     console.error(event.errorState);
117   };
118
119   ns.with_db = function(success) {
120     if (db && db_version == db.version) {
121       success();
122     } else {
123       // assume the page load db init isn't done yet and push it onto the success
124       request.aftersuccess.push(success);
125     }
126   };
127 });