var IDBStore = {
indexedDB() {
#if ASSERTIONS
assert(typeof indexedDB != 'undefined', 'IDBStore used, but indexedDB not supported');
#endif
return indexedDB;
},
DB_VERSION: 22,
DB_STORE_NAME: 'FILE_DATA',
dbs: {},
blobs: [0],
getDB(name, callback) {
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 = (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 = () => {
db = (req.result);
IDBStore.dbs[name] = db;
callback(null, db);
};
req.onerror = function(event) {
callback(event.target.error || 'unknown error');
event.preventDefault();
};
},
getStore(dbName, type, callback) {
IDBStore.getDB(dbName, (error, db) => {
if (error) return callback(error);
var transaction = db.transaction([IDBStore.DB_STORE_NAME], type);
transaction.onerror = (event) => {
callback(event.target.error || 'unknown error');
event.preventDefault();
};
var store = transaction.objectStore(IDBStore.DB_STORE_NAME);
callback(null, store);
});
},
getFile(dbName, id, callback) {
IDBStore.getStore(dbName, 'readonly', (err, store) => {
if (err) return callback(err);
var req = store.get(id);
req.onsuccess = (event) => {
var result = event.target.result;
if (!result) {
return callback(`file ${id} not found`);
}
return callback(null, result);
};
req.onerror = callback;
});
},
setFile(dbName, id, data, callback) {
IDBStore.getStore(dbName, 'readwrite', (err, store) => {
if (err) return callback(err);
var req = store.put(data, id);
req.onsuccess = (event) => callback();
req.onerror = callback;
});
},
deleteFile(dbName, id, callback) {
IDBStore.getStore(dbName, 'readwrite', (err, store) => {
if (err) return callback(err);
var req = store.delete(id);
req.onsuccess = (event) => callback();
req.onerror = callback;
});
},
existsFile(dbName, id, callback) {
IDBStore.getStore(dbName, 'readonly', (err, store) => {
if (err) return callback(err);
var req = store.count(id);
req.onsuccess = (event) => callback(null, event.target.result > 0);
req.onerror = callback;
});
},
clearStore(dbName, callback) {
IDBStore.getStore(dbName, 'readwrite', (err, store) => {
if (err) return callback(err);
var req = store.clear();
req.onsuccess = (event) => callback();
req.onerror = callback;
});
},
};