Speed up translator initialization in source installs

updateBundledStyles() already has the contents of a new/updated
translator when it copies it into the data dir, so there's no need for
Zotero.Translators.reinit() to read it again from the just-copied file.
This passes the metadata from updateBundledStyles() to reinit() to avoid
the extra file read.

(Alas, this appears to make essentially zero difference on an OS X
system with an SSD, but maybe it will help elsewhere.)
This commit is contained in:
Dan Stillman 2015-05-24 19:38:52 -04:00
parent bd9c53b29c
commit 2ed04eca26
3 changed files with 48 additions and 23 deletions

View File

@ -663,6 +663,7 @@ Zotero.Schema = new function(){
//
var sql = "SELECT version FROM version WHERE schema=?";
var lastModTime = yield Zotero.DB.valueQueryAsync(sql, mode);
var cache = {};
// XPI installation
if (!isUnpacked) {
@ -880,6 +881,9 @@ Zotero.Schema = new function(){
else if (mode == 'translators') {
newObj = yield Zotero.Translators.loadFromFile(entry.path);
}
else {
throw new Error("Invalid mode '" + mode + "'");
}
let existingObj = Zotero[Mode].get(newObj[modeType + "ID"]);
if (!existingObj) {
Zotero.debug("Installing " + modeType + " '" + newObj[titleField] + "'");
@ -902,19 +906,16 @@ Zotero.Schema = new function(){
}
try {
let destFile = OS.Path.join(destDir, fileName);
let destFile;
if (!existingObj || !existingObj.hidden) {
destFile = OS.Path.join(destDir, fileName);
}
else {
destFile = OS.Path.join(hiddenDir, fileName)
}
try {
if (!existingObj || !existingObj.hidden) {
yield OS.File.copy(entry.path, destFile, {
noOverwrite: true
});
}
else {
yield OS.File.copy(entry.path, OS.Path.join(hiddenDir, fileName), {
noOverwrite: true
});
}
yield OS.File.copy(entry.path, destFile, { noOverwrite: true });
}
catch (e) {
if (e instanceof OS.File.Error && e.becauseExists) {
@ -923,17 +924,16 @@ Zotero.Schema = new function(){
+ "'" + fileName + "'";
Zotero.debug(msg, 1);
Components.utils.reportError(msg);
if (!existingObj || !existingObj.hidden) {
yield OS.File.copy(entry.path, destFile);
}
else {
yield OS.File.copy(entry.path, OS.Path.join(hiddenDir, fileName));
}
yield OS.File.copy(entry.path, destFile);
}
else {
throw e;
}
}
if (mode == 'translators') {
cache[fileName] = newObj.metadata;
}
}
catch (e) {
Components.utils.reportError("Error copying file " + fileName + ": " + e);
@ -956,7 +956,7 @@ Zotero.Schema = new function(){
}
});
yield Zotero[Mode].reinit();
yield Zotero[Mode].reinit(cache);
return true;
});

View File

@ -59,6 +59,7 @@ var TRANSLATOR_SAVE_PROPERTIES = TRANSLATOR_REQUIRED_PROPERTIES.concat(["browser
* @property {Object} hiddenPrefs Hidden preferences configurable through about:config
* @property {Boolean} inRepository Whether the translator may be found in the repository
* @property {String} lastUpdated SQL-style date and time of translator's last update
* @property {Object} metadata - Metadata block as object
* @property {String} code The executable JavaScript for the translator
* @property {Boolean} cacheCode Whether to cache code for this session (non-connector only)
* @property {String} [path] File path corresponding to this translator (non-connector only)
@ -129,6 +130,11 @@ Zotero.Translator.prototype.init = function(info) {
} else if(this.hasOwnProperty("code")) {
delete this.code;
}
// Save a copy of the metadata block
delete info.path;
delete info.code;
this.metadata = info;
}
/**
@ -192,6 +198,7 @@ Zotero.Translator.prototype.logError = function(message, type, line, lineNumber,
var ios = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService);
Zotero.log(message, type ? type : "error", ios.newFileURI(file).spec);
Zotero.debug(message, 1);
} else {
Zotero.logError(message);
}

View File

@ -23,6 +23,8 @@
***** END LICENSE BLOCK *****
*/
"use strict";
// Enumeration of types of translators
const TRANSLATOR_TYPES = {"import":1, "export":2, "web":4, "search":8};
@ -36,8 +38,11 @@ Zotero.Translators = new function() {
/**
* Initializes translator cache, loading all translator metadata into memory
*
* @param {Object} [memCache] - Translator metadata keyed by filename, if already available
* (e.g., in updateBundledFiles()), to avoid unnecesary file reads
*/
this.reinit = Zotero.Promise.coroutine(function* () {
this.reinit = Zotero.Promise.coroutine(function* (memCache) {
Zotero.debug("Initializing translators");
var start = new Date;
_initialized = true;
@ -76,7 +81,14 @@ Zotero.Translators = new function() {
lastModifiedTime = (yield OS.File.stat(path)).lastModificationDate.getTime();
}
var dbCacheEntry = false;
// Check passed cache for metadata
let memCacheJSON = false;
if (memCache && memCache[fileName]) {
memCacheJSON = memCache[fileName];
}
// Check DB cache
let dbCacheEntry = false;
if (dbCache[fileName]) {
filesInCache[fileName] = true;
if (dbCache[fileName].lastModifiedTime == lastModifiedTime) {
@ -85,8 +97,10 @@ Zotero.Translators = new function() {
}
// Get JSON from cache if possible
if(dbCacheEntry) {
var translator = Zotero.Translators.load(dbCacheEntry.metadataJSON, path);
if (memCacheJSON || dbCacheEntry) {
var translator = Zotero.Translators.load(
memCacheJSON || dbCacheEntry.metadataJSON, path
);
}
// Otherwise, load from file
else {
@ -175,9 +189,13 @@ Zotero.Translators = new function() {
/**
* Loads a translator from JSON, with optional code
*
* @param {String|Object} json - Metadata JSON
* @param {String} path
* @param {String} [code]
*/
this.load = function (json, path, code) {
var info = JSON.parse(json);
var info = typeof json == 'string' ? JSON.parse(json) : json;
info.path = path;
info.code = code;
return new Zotero.Translator(info);