forked from emscripten-core/emscripten
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIDBStore.js
118 lines (116 loc) · 3.49 KB
/
IDBStore.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Copyright 2015 The Emscripten Authors. All rights reserved.
// Emscripten is available under two separate licenses, the MIT license and the
// University of Illinois/NCSA Open Source License. Both these licenses can be
// found in the LICENSE file.
{
indexedDB: function() {
if (typeof indexedDB !== 'undefined') return indexedDB;
var ret = null;
if (typeof window === 'object') ret = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
assert(ret, 'IDBStore used, but indexedDB not supported');
return ret;
},
DB_VERSION: 22,
DB_STORE_NAME: 'FILE_DATA',
dbs: {},
blobs: [0],
getDB: function(name, callback) {
// check the cache first
var db = IDBStore.dbs[name];
if (db) {
return callback(null, db);
}
var req;
try {
req = IDBStore.indexedDB().open(name, IDBStore.DB_VERSION);
} catch (e) {
return callback(e);
}
req.onupgradeneeded = function(e) {
var db = e.target.result;
var transaction = e.target.transaction;
var fileStore;
if (db.objectStoreNames.contains(IDBStore.DB_STORE_NAME)) {
fileStore = transaction.objectStore(IDBStore.DB_STORE_NAME);
} else {
fileStore = db.createObjectStore(IDBStore.DB_STORE_NAME);
}
};
req.onsuccess = function() {
db = req.result;
// add to the cache
IDBStore.dbs[name] = db;
callback(null, db);
};
req.onerror = function(e) {
callback(this.error);
e.preventDefault();
};
},
getStore: function(dbName, type, callback) {
IDBStore.getDB(dbName, function(error, db) {
if (error) return callback(error);
var transaction = db.transaction([IDBStore.DB_STORE_NAME], type);
transaction.onerror = function(e) {
callback(this.error || 'unknown error');
e.preventDefault();
};
var store = transaction.objectStore(IDBStore.DB_STORE_NAME);
callback(null, store);
});
},
// External API
getFile: function(dbName, id, callback) {
IDBStore.getStore(dbName, 'readonly', function(err, store) {
if (err) return callback(err);
var req = store.get(id);
req.onsuccess = function(event) {
var result = event.target.result;
if (!result) {
return callback('file ' + id + ' not found');
} else {
return callback(null, result);
}
};
req.onerror = function(error) {
callback(error);
};
});
},
setFile: function(dbName, id, data, callback) {
IDBStore.getStore(dbName, 'readwrite', function(err, store) {
if (err) return callback(err);
var req = store.put(data, id);
req.onsuccess = function(event) {
callback();
};
req.onerror = function(error) {
callback(error);
};
});
},
deleteFile: function(dbName, id, callback) {
IDBStore.getStore(dbName, 'readwrite', function(err, store) {
if (err) return callback(err);
var req = store.delete(id);
req.onsuccess = function(event) {
callback();
};
req.onerror = function(error) {
callback(error);
};
});
},
existsFile: function(dbName, id, callback) {
IDBStore.getStore(dbName, 'readonly', function(err, store) {
if (err) return callback(err);
var req = store.count(id);
req.onsuccess = function(event) {
callback(null, event.target.result > 0);
};
req.onerror = function(error) {
callback(error);
};
});
},
}