www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 5ef89b1d0f772803d11a727d30b95ee81de70e1e
parent c4d67c5b5e6b183e4cbf0096630d5723632a1dcf
Author: Dan Stillman <dstillman@zotero.org>
Date:   Sun, 17 Jan 2016 00:49:26 -0500

Speed up DB methods slightly by avoiding unnecessary yields

And tidy some things up

Diffstat:
Mchrome/content/zotero/xpcom/db.js | 113++++++++++++++++++++++++++++++++++---------------------------------------------
Mchrome/content/zotero/xpcom/zotero.js | 22++++++++++------------
2 files changed, 59 insertions(+), 76 deletions(-)

diff --git a/chrome/content/zotero/xpcom/db.js b/chrome/content/zotero/xpcom/db.js @@ -72,13 +72,12 @@ Zotero.DBConnection = function(dbName) { // Private members this._dbName = dbName; this._shutdown = false; - this._connectionAsync = null; + this._connection = null; this._transactionID = null; this._transactionDate = null; this._lastTransactionDate = null; this._transactionRollback = false; this._transactionNestingLevel = 0; - this._asyncTransactionNestingLevel = 0; this._callbacks = { begin: [], commit: [], @@ -89,7 +88,6 @@ Zotero.DBConnection = function(dbName) { } }; this._dbIsCorrupt = null - this._self = this; this._transactionPromise = null; } @@ -610,16 +608,13 @@ Zotero.DBConnection.prototype.requireTransaction = function () { * rows are Proxy objects that return values from the * underlying mozIStorageRows based on column names. */ -Zotero.DBConnection.prototype.queryAsync = function (sql, params, options) { - let conn; - let self = this; - let onRow = null; - return this._getConnectionAsync(options) - .then(function (c) { - conn = c; - [sql, params] = self.parseQueryAndParams(sql, params); +Zotero.DBConnection.prototype.queryAsync = Zotero.Promise.coroutine(function* (sql, params, options) { + try { + let onRow = null; + let conn = this._getConnection(options) || (yield this._getConnectionAsync(options)); + [sql, params] = this.parseQueryAndParams(sql, params); if (Zotero.Debug.enabled) { - self.logQuery(sql, params, options); + this.logQuery(sql, params, options); } if (options && options.onRow) { // Errors in onRow don't stop the query unless StopIteration is thrown @@ -638,11 +633,9 @@ Zotero.DBConnection.prototype.queryAsync = function (sql, params, options) { } } } - return conn.executeCached(sql, params, onRow); - }) - .then(function (rows) { + let rows = yield conn.executeCached(sql, params, onRow); // Parse out the SQL command being used - var op = sql.match(/^[^a-z]*[^ ]+/i); + let op = sql.match(/^[^a-z]*[^ ]+/i); if (op) { op = op.toString().toLowerCase(); } @@ -681,8 +674,8 @@ Zotero.DBConnection.prototype.queryAsync = function (sql, params, options) { // returning it for SELECT and REPLACE queries return; } - }) - .catch(function (e) { + } + catch (e) { if (e.errors && e.errors[0]) { var eStr = e + ""; eStr = eStr.indexOf("Error: ") == 0 ? eStr.substr(7): e; @@ -693,8 +686,8 @@ Zotero.DBConnection.prototype.queryAsync = function (sql, params, options) { else { throw e; } - }); -}; + } +}); Zotero.DBConnection.prototype.queryTx = function (sql, params, options) { @@ -711,20 +704,17 @@ Zotero.DBConnection.prototype.queryTx = function (sql, params, options) { * @param {Array|String|Integer} [params] SQL parameters to bind * @return {Promise<Array|Boolean>} A promise for either the value or FALSE if no result */ -Zotero.DBConnection.prototype.valueQueryAsync = function (sql, params) { - let self = this; - return this._getConnectionAsync() - .then(function (conn) { - [sql, params] = self.parseQueryAndParams(sql, params); +Zotero.DBConnection.prototype.valueQueryAsync = Zotero.Promise.coroutine(function* (sql, params, options = {}) { + try { + let conn = this._getConnection(options) || (yield this._getConnectionAsync(options)); + [sql, params] = this.parseQueryAndParams(sql, params); if (Zotero.Debug.enabled) { - self.logQuery(sql, params); + this.logQuery(sql, params); } - return conn.executeCached(sql, params); - }) - .then(function (rows) { + let rows = yield conn.executeCached(sql, params); return rows.length ? rows[0].getResultByIndex(0) : false; - }) - .catch(function (e) { + } + catch (e) { if (e.errors && e.errors[0]) { var eStr = e + ""; eStr = eStr.indexOf("Error: ") == 0 ? eStr.substr(7): e; @@ -735,8 +725,8 @@ Zotero.DBConnection.prototype.valueQueryAsync = function (sql, params) { else { throw e; } - }); -}; + } +}); /** @@ -757,26 +747,21 @@ Zotero.DBConnection.prototype.rowQueryAsync = function (sql, params) { * @param {Array|String|Integer} [params] SQL parameters to bind * @return {Promise<Array>} A promise for an array of values in the column */ -Zotero.DBConnection.prototype.columnQueryAsync = function (sql, params) { - let conn; - let self = this; - return this._getConnectionAsync(). - then(function (c) { - conn = c; - [sql, params] = self.parseQueryAndParams(sql, params); +Zotero.DBConnection.prototype.columnQueryAsync = Zotero.Promise.coroutine(function* (sql, params, options = {}) { + try { + let conn = this._getConnection(options) || (yield this._getConnectionAsync(options)); + [sql, params] = this.parseQueryAndParams(sql, params); if (Zotero.Debug.enabled) { - self.logQuery(sql, params); + this.logQuery(sql, params); } - return conn.executeCached(sql, params); - }) - .then(function (rows) { + let rows = yield conn.executeCached(sql, params); var column = []; for (let i=0, len=rows.length; i<len; i++) { column.push(rows[i].getResultByIndex(0)); } return column; - }) - .catch(function (e) { + } + catch (e) { if (e.errors && e.errors[0]) { var eStr = e + ""; eStr = eStr.indexOf("Error: ") == 0 ? eStr.substr(7): e; @@ -787,8 +772,8 @@ Zotero.DBConnection.prototype.columnQueryAsync = function (sql, params) { else { throw e; } - }); -}; + } +}); Zotero.DBConnection.prototype.logQuery = function (sql, params, options) { @@ -916,11 +901,11 @@ Zotero.DBConnection.prototype.checkException = function (e) { * allowing code to re-open the database again */ Zotero.DBConnection.prototype.closeDatabase = Zotero.Promise.coroutine(function* (permanent) { - if (this._connectionAsync) { + if (this._connection) { Zotero.debug("Closing database"); - yield this._connectionAsync.close(); - this._connectionAsync = undefined; - this._connectionAsync = permanent ? false : null; + yield this._connection.close(); + this._connection = undefined; + this._connection = permanent ? false : null; Zotero.debug("Database closed"); } }); @@ -1135,10 +1120,10 @@ Zotero.DBConnection.prototype._getConnection = function (options) { if (this._backupPromise && this._backupPromise.isPending() && (!options || !options.inBackup)) { return false; } - if (this._connectionAsync === false) { + if (this._connection === false) { throw new Error("Database permanently closed; not re-opening"); } - return this._connectionAsync || false; + return this._connection || false; } /* @@ -1151,10 +1136,10 @@ Zotero.DBConnection.prototype._getConnectionAsync = Zotero.Promise.coroutine(fun yield this._backupPromise; } - if (this._connectionAsync) { - return this._connectionAsync; + if (this._connection) { + return this._connection; } - else if (this._connectionAsync === false) { + else if (this._connection === false) { throw new Error("Database permanently closed; not re-opening"); } @@ -1176,7 +1161,7 @@ Zotero.DBConnection.prototype._getConnectionAsync = Zotero.Promise.coroutine(fun name: 'NS_ERROR_FILE_CORRUPTED' }; } - this._connectionAsync = yield Zotero.Promise.resolve(this.Sqlite.openConnection({ + this._connection = yield Zotero.Promise.resolve(this.Sqlite.openConnection({ path: file.path })); } @@ -1195,7 +1180,7 @@ Zotero.DBConnection.prototype._getConnectionAsync = Zotero.Promise.coroutine(fun // Create new main database var file = Zotero.getZoteroDatabase(this._dbName); - this._connectionAsync = store.openDatabase(file); + this._connection = store.openDatabase(file); if (corruptMarker.exists()) { corruptMarker.remove(null); @@ -1213,7 +1198,7 @@ Zotero.DBConnection.prototype._getConnectionAsync = Zotero.Promise.coroutine(fun // Test the backup file try { Zotero.debug("Asynchronously opening DB connection"); - this._connectionAsync = yield Zotero.Promise.resolve(this.Sqlite.openConnection({ + this._connection = yield Zotero.Promise.resolve(this.Sqlite.openConnection({ path: backupFile.path })); } @@ -1221,7 +1206,7 @@ Zotero.DBConnection.prototype._getConnectionAsync = Zotero.Promise.coroutine(fun catch (e) { // Create new main database var file = Zotero.getZoteroDatabase(this._dbName); - this._connectionAsync = yield Zotero.Promise.resolve(this.Sqlite.openConnection({ + this._connection = yield Zotero.Promise.resolve(this.Sqlite.openConnection({ path: file.path })); @@ -1234,7 +1219,7 @@ Zotero.DBConnection.prototype._getConnectionAsync = Zotero.Promise.coroutine(fun break catchBlock; } - this._connectionAsync = undefined; + this._connection = undefined; // Copy backup file to main DB file this._debug("Restoring database '" + this._dbName + "' from backup file", 1); @@ -1249,7 +1234,7 @@ Zotero.DBConnection.prototype._getConnectionAsync = Zotero.Promise.coroutine(fun // Open restored database var file = Zotero.getZoteroDirectory(); file.append(fileName); - this._connectionAsync = yield Zotero.Promise.resolve(this.Sqlite.openConnection({ + this._connection = yield Zotero.Promise.resolve(this.Sqlite.openConnection({ path: file.path })); this._debug('Database restored', 1); @@ -1292,7 +1277,7 @@ Zotero.DBConnection.prototype._getConnectionAsync = Zotero.Promise.coroutine(fun idleService.addIdleObserver(this, 60); idleService = null; - return this._connectionAsync; + return this._connection; }); diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js @@ -833,7 +833,7 @@ Components.utils.import("resource://gre/modules/osfile.jsm"); } } - this.shutdown = function() { + this.shutdown = Zotero.Promise.coroutine(function* () { Zotero.debug("Shutting down Zotero"); try { @@ -841,7 +841,7 @@ Components.utils.import("resource://gre/modules/osfile.jsm"); Zotero.closing = true; // run shutdown listener - for each(var listener in _shutdownListeners) { + for (let listener of _shutdownListeners) { try { listener(); } catch(e) { @@ -852,20 +852,18 @@ Components.utils.import("resource://gre/modules/osfile.jsm"); // remove temp directory Zotero.removeTempDirectory(); - if (Zotero.DB && Zotero.DB._connectionAsync) { + if (Zotero.DB) { // close DB - return Zotero.DB.closeDatabase(true).then(function() { - // broadcast that DB lock has been released - Zotero.IPC.broadcast("lockReleased"); - }); + yield Zotero.DB.closeDatabase(true) + + // broadcast that DB lock has been released + Zotero.IPC.broadcast("lockReleased"); } - - return Zotero.Promise.resolve(); } catch(e) { - Zotero.debug(e); - return Zotero.Promise.reject(e); + Zotero.logError(e); + throw e; } - } + }); function getProfileDirectory(){