Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/src/IDBStore.js
4128 views
1
/**
2
* @license
3
* Copyright 2015 The Emscripten Authors
4
* SPDX-License-Identifier: MIT
5
*/
6
7
var IDBStore = {
8
indexedDB() {
9
#if ASSERTIONS
10
assert(typeof indexedDB != 'undefined', 'IDBStore used, but indexedDB not supported');
11
#endif
12
return indexedDB;
13
},
14
DB_VERSION: 22,
15
DB_STORE_NAME: 'FILE_DATA',
16
dbs: {},
17
blobs: [0],
18
getDB(name, callback) {
19
// check the cache first
20
var db = IDBStore.dbs[name];
21
if (db) {
22
return callback(null, db);
23
}
24
var req;
25
try {
26
req = IDBStore.indexedDB().open(name, IDBStore.DB_VERSION);
27
} catch (e) {
28
return callback(e);
29
}
30
req.onupgradeneeded = (e) => {
31
var db = /** @type {IDBDatabase} */ (e.target.result);
32
var transaction = e.target.transaction;
33
var fileStore;
34
if (db.objectStoreNames.contains(IDBStore.DB_STORE_NAME)) {
35
fileStore = transaction.objectStore(IDBStore.DB_STORE_NAME);
36
} else {
37
fileStore = db.createObjectStore(IDBStore.DB_STORE_NAME);
38
}
39
};
40
req.onsuccess = () => {
41
db = /** @type {IDBDatabase} */ (req.result);
42
// add to the cache
43
IDBStore.dbs[name] = db;
44
callback(null, db);
45
};
46
req.onerror = function(event) {
47
callback(event.target.error || 'unknown error');
48
event.preventDefault();
49
};
50
},
51
getStore(dbName, type, callback) {
52
IDBStore.getDB(dbName, (error, db) => {
53
if (error) return callback(error);
54
var transaction = db.transaction([IDBStore.DB_STORE_NAME], type);
55
transaction.onerror = (event) => {
56
callback(event.target.error || 'unknown error');
57
event.preventDefault();
58
};
59
var store = transaction.objectStore(IDBStore.DB_STORE_NAME);
60
callback(null, store);
61
});
62
},
63
// External API
64
getFile(dbName, id, callback) {
65
IDBStore.getStore(dbName, 'readonly', (err, store) => {
66
if (err) return callback(err);
67
var req = store.get(id);
68
req.onsuccess = (event) => {
69
var result = event.target.result;
70
if (!result) {
71
return callback(`file ${id} not found`);
72
}
73
return callback(null, result);
74
};
75
req.onerror = callback;
76
});
77
},
78
setFile(dbName, id, data, callback) {
79
IDBStore.getStore(dbName, 'readwrite', (err, store) => {
80
if (err) return callback(err);
81
var req = store.put(data, id);
82
req.onsuccess = (event) => callback();
83
req.onerror = callback;
84
});
85
},
86
deleteFile(dbName, id, callback) {
87
IDBStore.getStore(dbName, 'readwrite', (err, store) => {
88
if (err) return callback(err);
89
var req = store.delete(id);
90
req.onsuccess = (event) => callback();
91
req.onerror = callback;
92
});
93
},
94
existsFile(dbName, id, callback) {
95
IDBStore.getStore(dbName, 'readonly', (err, store) => {
96
if (err) return callback(err);
97
var req = store.count(id);
98
req.onsuccess = (event) => callback(null, event.target.result > 0);
99
req.onerror = callback;
100
});
101
},
102
clearStore(dbName, callback) {
103
IDBStore.getStore(dbName, 'readwrite', (err, store) => {
104
if (err) return callback(err);
105
var req = store.clear();
106
req.onsuccess = (event) => callback();
107
req.onerror = callback;
108
});
109
},
110
};
111
112