- Sped up item importing dramatically by doing import in a single transaction -- this means that an error will cause already-imported items to be discarded, but that's probably better anyway

- The (empty) created collection is now deleted after import failure

- Sped up general DB performance dramatically (especially on XP and Linux) by using a dummy statement to keep the SQLite shared cache active between transactions -- this seems to have only a moderate effect on OS X, which was already much faster, perhaps because of its own disk cache (though running XP and Linux under Parallels with limited RAM probably didn't help)

- Added some additional sanity checks to Date.strToDate() to prevent errors in the metadata pane and on import with dates like "1998-99" -- strToDate() was treating 99 as the month, which caused an error in the stricter DB trigger. "99" is now left as an unparsed part, though "2006-08" (where the second part is <= 31) will still get parsed as August 2006. Can't do much about that, though.

- Fixed a bug when rolling back nested transactions that could temporarily leave things somewhat funky
This commit is contained in:
Dan Stillman 2007-05-17 06:30:13 +00:00
parent 3b19fddc31
commit 5a7d65532c
4 changed files with 83 additions and 18 deletions

View File

@ -226,8 +226,8 @@ var Zotero_File_Interface = new function() {
Zotero_File_Interface.Progress.show(
Zotero.getString("fileInterface.itemsImported"),
function() {
// disable notifier
_unlock = Zotero.Notifier.begin(true);
Zotero.DB.beginTransaction();
// translate
translation.translate();
});
@ -255,13 +255,13 @@ var Zotero_File_Interface = new function() {
_importCollection.addItem(itemID);
}
// notify
Zotero.Notifier.commit(_unlock);
Zotero.DB.commitTransaction();
Zotero_File_Interface.Progress.close();
Zotero.UnresponsiveScriptIndicator.enable();
if(!worked) {
_importCollection.erase();
window.alert(Zotero.getString("fileInterface.importError"));
}
}

View File

@ -304,7 +304,7 @@ Zotero.DBConnection.prototype.commitTransaction = function () {
}
else if (this._transactionRollback) {
this._debug('Rolling back previously flagged transaction', 5);
db.rollbackTransaction();
this.rollbackTransaction();
}
else {
this._debug('Committing transaction',5);
@ -672,6 +672,69 @@ Zotero.DBConnection.prototype.backupDatabase = function (suffix) {
}
/*
* Keep the SQLite shared cache live between transactions with a dummy statement,
* which speeds up DB access dramatically (at least on Windows and Linux--OS X
* seems to be much faster already, perhaps due to its own disk cache)
*
* This is the same technique used by Mozilla code. The one downside is that it
* prevents schema changes, so this is called after schema updating. If the
* schema really needs to be updated at another point, use stopDummyStatement().
*
* See http://developer.mozilla.org/en/docs/Storage:Performance for more info.
*/
Zotero.DBConnection.prototype.startDummyStatement = function () {
try {
if (!this._dummyConnection) {
this._debug("Opening database '" + this._dbName + " for dummy statement");
// Get the storage service
var store = Components.classes["@mozilla.org/storage/service;1"].
getService(Components.interfaces.mozIStorageService);
var file = Zotero.getZoteroDatabase(this._dbName);
this._dummyConnection = store.openDatabase(file);
}
if (this._dummyStatement) {
Zotero.debug("Dummy statement is already open");
return;
}
Zotero.debug("Initializing dummy statement for '" + this._dbName + "'");
var sql = "CREATE TABLE IF NOT EXISTS zoteroDummyTable (id INTEGER PRIMARY KEY)";
this._dummyConnection.executeSimpleSQL(sql);
sql = "INSERT OR IGNORE INTO zoteroDummyTable VALUES (1)";
this._dummyConnection.executeSimpleSQL(sql);
sql = "SELECT id FROM zoteroDummyTable LIMIT 1"
this._dummyStatement = this._dummyConnection.createStatement(sql)
this._dummyStatement.executeStep()
}
catch (e) {
Components.utils.reportError(e);
Zotero.debug(e);
}
}
/*
* Stop the dummy statement temporarily to allow for schema changess
*
* The statement needs to be started again or performance will suffer.
*/
Zotero.DBConnection.prototype.stopDummyStatement = function () {
if (!this._dummyStatement) {
return;
}
Zotero.debug("Stopping dummy statement for '" + this._dbName + "'");
this._dummyStatement.reset();
this._dummyStatement = null;
}
/////////////////////////////////////////////////////////////////
//
// Private methods

View File

@ -1073,8 +1073,6 @@ Zotero.Schema = new function(){
}
}
var parsedID = parseInt(rows[j].itemID);
Zotero.debug(parsedID);
Zotero.debug(rows[j].itemID);
if ((parsedID + '').length != rows[j].itemID) {
if (parseInt(rows[j].note) != rows[j].note ||
(parseInt(rows[j].note) + '').length != rows[j].note.length) {

View File

@ -212,6 +212,7 @@ var Zotero = new function(){
Zotero.Schema.updateSchema();
}
Zotero.DB.startDummyStatement();
Zotero.Schema.updateScrapersRemote();
// Initialize integration web server
@ -1220,7 +1221,7 @@ Zotero.Date = new function(){
}
}
if(!date.month || date.month <= 12) {
if((!date.month || date.month <= 12) && (!date.day || date.day <= 31)) {
if(date.year && date.year < 100) { // for two digit years, determine proper
// four digit year
var today = new Date();
@ -1288,18 +1289,21 @@ Zotero.Date = new function(){
var m = _dayRe.exec(date.part);
if(m) {
date.day = parseInt(m[1], 10);
if(m.index > 0) {
date.part = date.part.substr(0, m.index);
if(m[2]) {
date.part += " "+m[2];;
var day = parseInt(m[1], 10);
// Sanity check
if (day <= 31) {
date.day = day;
if(m.index > 0) {
date.part = date.part.substr(0, m.index);
if(m[2]) {
date.part += " "+m[2];;
}
} else {
date.part = m[2];
}
} else {
date.part = m[2];
Zotero.debug("DATE: got day ("+date.day+", "+date.part+")");
}
Zotero.debug("DATE: got day ("+date.day+", "+date.part+")");
}
}