Fix DB initialization with async DB access

Also fix the initial repository check to trigger after initialization is
complete instead of waiting
This commit is contained in:
Dan Stillman 2013-08-15 17:35:16 -04:00
parent d543936307
commit 28ca0a3599
4 changed files with 260 additions and 217 deletions

View file

@ -53,7 +53,8 @@ Zotero_Preferences.General = {
updateTranslators: function () {
Zotero.Schema.updateFromRepository(true, function (xmlhttp, updated) {
Zotero.Schema.updateFromRepository(true)
.then(function (updated) {
var button = document.getElementById('updateButton');
if (button) {
if (updated===-1) {
@ -71,6 +72,7 @@ Zotero_Preferences.General = {
Zotero_Preferences.Cite.refreshStylesList();
}
}
});
})
.done();
}
}

View file

@ -1005,6 +1005,51 @@ Zotero.DBConnection.prototype.columnQueryAsync = function (sql, params) {
};
Zotero.DBConnection.prototype.tableExistsAsync = function (table) {
return this._getConnectionAsync()
.then(function () {
var sql = "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND tbl_name=?";
return Zotero.DB.valueQueryAsync(sql, [table]);
})
.then(function (count) {
return !!count;
});
}
/**
* Parse SQL string and execute transaction with all statements
*
* @return {Promise}
*/
Zotero.DBConnection.prototype.executeSQLFile = function (sql) {
var nonCommentRE = /^[^-]/;
var trailingCommentRE = /^(.*?)(?:--.+)?$/;
sql = sql.trim()
// Ugly hack to parse triggers with embedded semicolons
.replace(/;---/g, "TEMPSEMI")
.split("\n")
.filter(function (x) nonCommentRE.test(x))
.map(function (x) x.match(trailingCommentRE)[1])
.join("");
if (sql.substr(-1) == ";") {
sql = sql.substr(0, sql.length - 1);
}
var statements = sql.split(";")
.map(function (x) x.replace(/TEMPSEMI/g, ";"));
return this.executeTransaction(function () {
var statement;
while (statement = statements.shift()) {
yield Zotero.DB.queryAsync(statement);
}
});
}
/**
* Generator functions can't return values, but Task.js-style generators,
* as used by executeTransaction(), can throw a special exception in order

View file

@ -50,8 +50,10 @@ Zotero.Schema = new function(){
var sql = "SELECT version FROM version WHERE schema='" + schema + "'";
return Zotero.DB.valueQueryAsync(sql)
.then(function (dbVersion) {
dbVersion = parseInt(dbVersion);
_dbVersions[schema] = dbVersion;
if (dbVersion) {
dbVersion = parseInt(dbVersion);
_dbVersions[schema] = dbVersion;
}
return dbVersion;
});
}
@ -409,23 +411,22 @@ Zotero.Schema = new function(){
})
.then(function (updated) {
if (runRemoteUpdateWhenComplete) {
var deferred = Q.defer();
if (updated) {
if (Zotero.Prefs.get('automaticScraperUpdates')) {
Zotero.proxyAuthComplete
.then(function () {
Zotero.Schema.updateFromRepository(2, function () deferred.resolve());
})
Zotero.unlockPromise
.then(Zotero.proxyAuthComplete)
.delay(1000)
.then(function () Zotero.Schema.updateFromRepository(2))
.done();
}
}
else {
Zotero.proxyAuthComplete
.then(function () {
Zotero.Schema.updateFromRepository(false, function () deferred.resolve());
})
Zotero.unlockPromise
.then(Zotero.proxyAuthComplete)
.delay(1000)
.then(function () Zotero.Schema.updateFromRepository(false))
.done();
}
return deferred.promise;
}
});
}
@ -896,10 +897,9 @@ Zotero.Schema = new function(){
*
* @param {Boolean} force Force a repository query regardless of how
* long it's been since the last check
* @param {Function} callback
*/
this.updateFromRepository = function (force, callback) {
Q.fcall(function () {
this.updateFromRepository = function (force) {
return Q.fcall(function () {
if (force) return true;
if (_remoteUpdateInProgress) {
@ -992,23 +992,21 @@ Zotero.Schema = new function(){
}
var body = 'styles=' + encodeURIComponent(JSON.stringify(styleTimestamps));
var get = Zotero.HTTP.doPost(url, body, function (xmlhttp) {
_updateFromRepositoryCallback(xmlhttp, !!force)
.then(function (updated) {
if (callback) {
callback(xmlhttp, updated);
}
});
Zotero.HTTP.promise("POST", url, { body: body })
.then(function (xmlhttp) {
return _updateFromRepositoryCallback(xmlhttp, !!force);
})
.catch(function (e) {
if (e instanceof Zotero.HTTP.BrowserOfflineException) {
Zotero.debug('Browser is offline -- skipping check');
// TODO: instead, add an observer to start and stop timer on online state change
_setRepositoryTimer(ZOTERO_CONFIG.REPOSITORY_RETRY_INTERVAL);
return;
}
throw e;
});
// TODO: instead, add an observer to start and stop timer on online state change
if (!get) {
Zotero.debug('Browser is offline -- skipping check');
_setRepositoryTimer(ZOTERO_CONFIG.REPOSITORY_RETRY_INTERVAL);
}
});
})
.done();
});
}
@ -1382,13 +1380,13 @@ Zotero.Schema = new function(){
yield Zotero.DB.queryAsync("PRAGMA auto_vacuum = 1");
yield _getSchemaSQL('system').then(function (sql) {
return Zotero.DB.queryAsync(sql);
return Zotero.DB.executeSQLFile(sql);
});
yield _getSchemaSQL('userdata').then(function (sql) {
return Zotero.DB.queryAsync(sql);
return Zotero.DB.executeSQLFile(sql);
});
yield _getSchemaSQL('triggers').then(function (sql) {
return Zotero.DB.queryAsync(sql);
return Zotero.DB.executeSQLFile(sql);
});
yield Zotero.Schema.updateCustomTables(true);
@ -1526,10 +1524,8 @@ Zotero.Schema = new function(){
// Store the timestamp provided by the server
yield _updateDBVersion('repository', currentTime);
if (!manual) {
// And the local timestamp of the update time
yield _updateDBVersion('lastcheck', lastCheckTime);
}
// And the local timestamp of the update time
yield _updateDBVersion('lastcheck', lastCheckTime);
})
.then(function () {
Zotero.debug('All translators and styles are up-to-date');
@ -1567,10 +1563,8 @@ Zotero.Schema = new function(){
// Store the timestamp provided by the server
yield _updateDBVersion('repository', currentTime);
if (!manual) {
// And the local timestamp of the update time
yield _updateDBVersion('lastcheck', lastCheckTime);
}
// And the local timestamp of the update time
yield _updateDBVersion('lastcheck', lastCheckTime);
})
.then(function () {
if (!manual) {

File diff suppressed because it is too large Load diff