2013-10-02 17:27:09 +00:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
|
|
|
|
|
|
|
this.EXPORTED_SYMBOLS = ['DataStoreDB'];
|
|
|
|
|
|
|
|
function debug(s) {
|
|
|
|
// dump('DEBUG DataStoreDB: ' + s + '\n');
|
|
|
|
}
|
|
|
|
|
|
|
|
const DATASTOREDB_VERSION = 1;
|
|
|
|
const DATASTOREDB_OBJECTSTORE_NAME = 'DataStoreDB';
|
2013-10-02 17:27:11 +00:00
|
|
|
const DATASTOREDB_REVISION = 'revision';
|
|
|
|
const DATASTOREDB_REVISION_INDEX = 'revisionIndex';
|
2013-10-02 17:27:09 +00:00
|
|
|
|
|
|
|
Cu.import('resource://gre/modules/IndexedDBHelper.jsm');
|
2013-10-02 17:27:11 +00:00
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "uuidgen",
|
|
|
|
"@mozilla.org/uuid-generator;1",
|
|
|
|
"nsIUUIDGenerator");
|
2013-10-02 17:27:09 +00:00
|
|
|
|
|
|
|
this.DataStoreDB = function DataStoreDB() {}
|
|
|
|
|
|
|
|
DataStoreDB.prototype = {
|
|
|
|
|
|
|
|
__proto__: IndexedDBHelper.prototype,
|
|
|
|
|
|
|
|
upgradeSchema: function(aTransaction, aDb, aOldVersion, aNewVersion) {
|
|
|
|
debug('updateSchema');
|
|
|
|
aDb.createObjectStore(DATASTOREDB_OBJECTSTORE_NAME, { autoIncrement: true });
|
2013-10-02 17:27:11 +00:00
|
|
|
let store = aDb.createObjectStore(DATASTOREDB_REVISION,
|
|
|
|
{ autoIncrement: true,
|
|
|
|
keyPath: 'internalRevisionId' });
|
|
|
|
store.createIndex(DATASTOREDB_REVISION_INDEX, 'revisionId', { unique: true });
|
2013-10-02 17:27:09 +00:00
|
|
|
},
|
|
|
|
|
2013-10-02 17:27:23 +00:00
|
|
|
init: function(aOwner, aName) {
|
|
|
|
let dbName = aName + '|' + aOwner;
|
2013-10-02 17:27:09 +00:00
|
|
|
this.initDBHelper(dbName, DATASTOREDB_VERSION,
|
2013-10-02 17:27:11 +00:00
|
|
|
[DATASTOREDB_OBJECTSTORE_NAME, DATASTOREDB_REVISION]);
|
2013-10-02 17:27:09 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
txn: function(aType, aCallback, aErrorCb) {
|
|
|
|
debug('Transaction request');
|
|
|
|
this.newTxn(
|
|
|
|
aType,
|
2013-10-02 17:27:11 +00:00
|
|
|
aType == 'readonly'
|
|
|
|
? [ DATASTOREDB_OBJECTSTORE_NAME ] : [ DATASTOREDB_OBJECTSTORE_NAME, DATASTOREDB_REVISION ],
|
|
|
|
function(aTxn, aStores) {
|
|
|
|
aType == 'readonly' ? aCallback(aTxn, aStores[0], null) : aCallback(aTxn, aStores[0], aStores[1]);
|
|
|
|
},
|
|
|
|
function() {},
|
|
|
|
aErrorCb
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
2013-10-02 20:39:54 +00:00
|
|
|
cursorTxn: function(aCallback, aErrorCb) {
|
|
|
|
debug('Cursor transaction request');
|
|
|
|
this.newTxn(
|
|
|
|
'readonly',
|
|
|
|
[ DATASTOREDB_OBJECTSTORE_NAME, DATASTOREDB_REVISION ],
|
|
|
|
function(aTxn, aStores) {
|
|
|
|
aCallback(aTxn, aStores[0], aStores[1]);
|
|
|
|
},
|
|
|
|
function() {},
|
|
|
|
aErrorCb
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
2013-10-02 17:27:11 +00:00
|
|
|
revisionTxn: function(aType, aCallback, aErrorCb) {
|
|
|
|
debug("Transaction request");
|
|
|
|
this.newTxn(
|
|
|
|
aType,
|
|
|
|
DATASTOREDB_REVISION,
|
2013-10-02 17:27:09 +00:00
|
|
|
aCallback,
|
|
|
|
function() {},
|
|
|
|
aErrorCb
|
|
|
|
);
|
|
|
|
},
|
|
|
|
|
2013-10-02 17:27:11 +00:00
|
|
|
addRevision: function(aStore, aId, aType, aSuccessCb) {
|
|
|
|
debug("AddRevision: " + aId + " - " + aType);
|
|
|
|
let revisionId = uuidgen.generateUUID().toString();
|
|
|
|
let request = aStore.put({ revisionId: revisionId, objectId: aId, operation: aType });
|
|
|
|
request.onsuccess = function() {
|
|
|
|
aSuccessCb(revisionId);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
getInternalRevisionId: function(aRevisionId, aStore, aSuccessCb) {
|
|
|
|
debug('GetInternalRevisionId');
|
|
|
|
let request = aStore.index(DATASTOREDB_REVISION_INDEX).getKey(aRevisionId);
|
|
|
|
request.onsuccess = function(aEvent) {
|
|
|
|
aSuccessCb(aEvent.target.result);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
clearRevisions: function(aStore, aSuccessCb) {
|
|
|
|
debug("ClearRevisions");
|
|
|
|
let request = aStore.clear();
|
|
|
|
request.onsuccess = function() {
|
|
|
|
aSuccessCb();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
2013-10-02 17:27:09 +00:00
|
|
|
delete: function() {
|
|
|
|
debug('delete');
|
|
|
|
this.close();
|
|
|
|
indexedDB.deleteDatabase(this.dbName);
|
|
|
|
debug('database deleted');
|
|
|
|
}
|
|
|
|
}
|