blob: b27eb90e5c5c07b6d8078a9b596a011aa5fff1a2 [file] [log] [blame]
// 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);
};
});
},
}