description and source-codefunction Dexie(dbName, options) {
/// <param name="options" type="Object" optional="true">Specify only if you wich to control which addons that should run on
this instance</param>
var deps = Dexie.dependencies;
var opts = extend({
// Default Options
addons: Dexie.addons, // Pick statically registered addons by default
autoOpen: true, // Don't require db.open() explicitely.
indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to IDBShim or browser env.
IDBKeyRange: deps.IDBKeyRange // Backend IDBKeyRange api. Default to IDBShim or browser env.
}, options);
var addons = opts.addons,
autoOpen = opts.autoOpen,
indexedDB = opts.indexedDB,
IDBKeyRange = opts.IDBKeyRange;
var globalSchema = this._dbSchema = {};
var versions = [];
var dbStoreNames = [];
var allTables = {};
///<var type="IDBDatabase" />
var idbdb = null; // Instance of IDBDatabase
var dbOpenError = null;
var isBeingOpened = false;
var openComplete = false;
var READONLY = "readonly",
READWRITE = "readwrite";
var db = this;
var dbReadyResolve,
dbReadyPromise = new Promise(function (resolve) {
dbReadyResolve = resolve;
}),
cancelOpen,
openCanceller = new Promise(function (_, reject) {
cancelOpen = reject;
});
var autoSchema = true;
var hasNativeGetDatabaseNames = !!getNativeGetDatabaseNamesFn(indexedDB),
hasGetAll;
function init() {
// Default subscribers to "versionchange" and "blocked".
// Can be overridden by custom handlers. If custom handlers return false, these default
// behaviours will be prevented.
db.on("versionchange", function (ev) {
// Default behavior for versionchange event is to close database connection.
// Caller can override this behavior by doing db.on("versionchange", function(){ return false; });
// Let's not block the other window from making it's delete() or open() call.
// NOTE! This event is never fired in IE,Edge or Safari.
if (ev.newVersion > 0) console.warn('Another connection wants to upgrade database \'' + db.name + '\'. Closing db now
to resume the upgrade.');else console.warn('Another connection wants to delete database\'' + db.name + '\'. Closing db now to resume the delete request.');
db.close();
// In many web applications, it would be recommended to force window.reload()
// when this event occurs. To do that, subscribe to the versionchange event
// and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)
// The reason for this is that your current web app obviously has old schema code that needs
// to be updated. Another window got a newer version of the app and needs to upgrade DB but
// your window is blocking it unless we close it here.
});
db.on("blocked", function (ev) {
if (!ev.newVersion || ev.newVersion < ev.oldVersion) console.warn('Dexie.delete(\'' + db.name + '\') was blocked');else
console.warn('Upgrade\'' + db.name + '\' blocked by other connection holding version ' + ev.oldVersion / 10);
});
}
//
//
//
// ------------------------- Versioning Framework---------------------------
//
//
//
this.version = function (versionNumber) {
/// <param name="versionNumber" type="Number"></param>
/// <returns type="Version"></returns>
if (idbdb || isBeingOpened) throw new exceptions.Schema("Cannot add version when database is open");
this.verno = Math.max(this.verno, versionNumber);
var versionInstance = versions.filter(function (v) {
return v._cfg.version === versionNumber;
})[0];
if (versionInstance) return versionInstance;
versionInstance = new Version(versionNumber);
versions.push(versionInstance);
versions.sort(lowerVersionFirst);
return versionIn ...