Revision aec5c9ae
Added by koszko about 1 year ago
common/indexeddb.js | ||
---|---|---|
53 | 53 |
); |
54 | 54 |
|
55 | 55 |
/* Update when changes are made to database schema. Must have 3 elements */ |
56 |
const db_version = [1, 0, 0];
|
|
56 |
const db_version = [1, 0, 1];
|
|
57 | 57 |
|
58 | 58 |
const nr_reductor = ([i, s], num) => [i - 1, s + num * 1024 ** i]; |
59 | 59 |
const version_nr = ver => ver.slice(0, 3).reduce(nr_reductor, [2, 0])[1]; |
60 | 60 |
|
61 |
let db_version_nr = version_nr(db_version); |
|
62 |
|
|
61 | 63 |
const stores = [ |
62 | 64 |
["file", {keyPath: "sha256"}], |
63 | 65 |
["file_uses", {keyPath: "sha256"}], |
... | ... | |
100 | 102 |
} |
101 | 103 |
|
102 | 104 |
async function perform_upgrade(event) { |
105 |
if (event.oldVersion > db_version_nr) |
|
106 |
throw "bad db version: " + event.oldVersion; |
|
107 |
|
|
103 | 108 |
const opened_db = event.target.result; |
109 |
const transaction = event.target.transaction; |
|
104 | 110 |
|
105 |
/* When we move to a new database schema, we will add upgrade logic here. */ |
|
106 |
if (event.oldVersion > 0) |
|
107 |
throw "bad db version: " + event.oldVersion; |
|
111 |
if (event.oldVersion == 0) { |
|
112 |
for (const [store_name, key_mode] of stores) |
|
113 |
opened_db.createObjectStore(store_name, key_mode); |
|
114 |
} |
|
108 | 115 |
|
109 |
let store;
|
|
110 |
for (const [store_name, key_mode] of stores)
|
|
111 |
store = opened_db.createObjectStore(store_name, key_mode);
|
|
116 |
if (event.oldVersion > 0 && event.oldVersion < db_version_nr) {
|
|
117 |
const v1_url = "https://hydrilla.koszko.org/api_v1/";
|
|
118 |
const v1_entry = await idb_get(transaction, "repo", v1_url);
|
|
112 | 119 |
|
113 |
const ctx = make_context(store.transaction, initial_data.file); |
|
114 |
await _save_items(initial_data.resource, initial_data.mapping, |
|
115 |
initial_data.repo || [], ctx); |
|
120 |
if (v1_entry) { |
|
121 |
const v2_url = "https://hydrilla.koszko.org/api_v2/"; |
|
122 |
|
|
123 |
await idb_del(transaction, "repo", v1_url); |
|
124 |
await idb_put(transaction, "repo", {url: v2_url}); |
|
125 |
} |
|
126 |
} |
|
127 |
|
|
128 |
if (event.oldVersion == 0) { |
|
129 |
const ctx = make_context(transaction, initial_data.file); |
|
130 |
await _save_items(initial_data.resource, initial_data.mapping, |
|
131 |
initial_data.repo || [], ctx); |
|
132 |
} else { |
|
133 |
await new Promise( |
|
134 |
(...cbs) => [transaction.onsuccess, transaction.onerror] = cbs |
|
135 |
); |
|
136 |
} |
|
116 | 137 |
|
117 | 138 |
return opened_db; |
118 | 139 |
} |
... | ... | |
125 | 146 |
let resolve, reject; |
126 | 147 |
const waiter = new Promise((...cbs) => [resolve, reject] = cbs); |
127 | 148 |
|
128 |
const request = indexedDB.open("haketilo", version_nr(db_version));
|
|
149 |
const request = indexedDB.open("haketilo", db_version_nr);
|
|
129 | 150 |
request.onsuccess = ev => resolve(ev.target.result); |
130 | 151 |
request.onerror = ev => reject("db error: " + ev.target.errorCode); |
131 | 152 |
request.onupgradeneeded = ev => perform_upgrade(ev).then(resolve, reject); |
Also available in: Unified diff
automatically change repo url to point to api v2 endpoint