commit ae65267d5d9a5f16ea09f8a56fd83ec26701127a
parent 0876e689c8d33334a302c060c87ac860ca1f0d56
Author: Dan Stillman <dstillman@zotero.org>
Date: Tue, 29 Jun 2010 06:04:04 +0000
Use DB cache and new translators.index file in XPIs to skip unnecessary translator extraction on upgrades
Diffstat:
1 file changed, 117 insertions(+), 36 deletions(-)
diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js
@@ -565,6 +565,7 @@ Zotero.Schema = new function(){
var sql = "SELECT version FROM version WHERE schema=?";
var lastModTime = Zotero.DB.valueQuery(sql, modes);
+ // XPI installation
if (zipFile.exists()) {
var modTime = Math.round(zipFile.lastModifiedTime / 1000);
@@ -575,37 +576,84 @@ Zotero.Schema = new function(){
Zotero.debug("Updating installed " + modes + " from " + modes + ".zip");
+ if (mode == 'translator') {
+ // Parse translators.index
+ var indexFile = extDir.clone();
+ indexFile.append('translators.index');
+ if (!indexFile.exists()) {
+ Components.utils.reportError("translators.index not found in Zotero.Schema.updateBundledFiles()");
+ return false;
+ }
+ var indexFile = Zotero.File.getContents(indexFile);
+ indexFile = indexFile.split("\n");
+ var index = {};
+ for each(var line in indexFile) {
+ if (!line) {
+ continue;
+ }
+ var [fileName, translatorID, label, lastUpdated] = line.split(',');
+ if (!translatorID) {
+ Components.utils.reportError("Invalid translatorID '" + translatorID + "' in Zotero.Schema.updateBundledFiles()");
+ return false;
+ }
+ index[translatorID] = {
+ label: label,
+ lastUpdated: lastUpdated,
+ fileName: fileName, // Numbered JS file within ZIP
+ extract: true
+ };
+ }
+
+ var sql = "SELECT translatorJSON FROM translatorCache";
+ var dbCache = Zotero.DB.columnQuery(sql);
+ // If there's anything in the cache, see what we actually need to extract
+ if (dbCache) {
+ var nsIJSON = Components.classes["@mozilla.org/dom/json;1"]
+ .createInstance(Components.interfaces.nsIJSON);
+ for each(var json in dbCache) {
+ var metadata = nsIJSON.decode(json);
+ var id = metadata.translatorID;
+ if (index[id] && index[id].lastUpdated == metadata.lastUpdated) {
+ index[id].extract = false;
+ }
+ }
+ }
+ }
+
var zipReader = Components.classes["@mozilla.org/libjar/zip-reader;1"]
.getService(Components.interfaces.nsIZipReader);
zipReader.open(zipFile);
var tmpDir = Zotero.getTempDirectory();
- var entries = zipReader.findEntries(null);
- while (entries.hasMore()) {
- var entry = entries.getNext();
-
- var tmpFile = tmpDir.clone();
- tmpFile.append(entry);
- if (tmpFile.exists()) {
- tmpFile.remove(false);
- }
- zipReader.extract(entry, tmpFile);
- var newObj = new Zotero[Mode](tmpFile);
-
- var existingObj = Zotero[Modes].get(newObj[mode + "ID"]);
- if (!existingObj) {
- Zotero.debug("Installing " + mode + " '" + newObj[titleField] + "'");
- }
- else {
- Zotero.debug("Updating "
- + (existingObj.hidden ? "hidden " : "")
- + mode + " '" + existingObj[titleField] + "'");
- if (existingObj.file.exists()) {
- existingObj.file.remove(false);
+
+ if (mode == 'translator') {
+ for (var translatorID in index) {
+ // Use index file and DB cache for translator entries,
+ // extracting only what's necessary
+ var entry = index[translatorID];
+ if (!entry.extract) {
+ Zotero.debug("Not extracting '" + entry.label + "' -- same version already in cache");
+ continue;
+ }
+
+ var tmpFile = tmpDir.clone();
+ tmpFile.append(entry.fileName);
+ if (tmpFile.exists()) {
+ tmpFile.remove(false);
+ }
+ zipReader.extract(entry.fileName, tmpFile);
+
+ var existingObj = Zotero.Translators.get(translatorID);
+ if (!existingObj) {
+ Zotero.debug("Installing translator '" + entry.label + "'");
+ }
+ else {
+ Zotero.debug("Updating translator '" + existingObj.label + "'");
+ if (existingObj.file.exists()) {
+ existingObj.file.remove(false);
+ }
}
- }
-
- if (mode == 'translator') {
- var fileName = Zotero.File.getValidFileName(newObj[titleField]) + fileExt;
+
+ var fileName = Zotero.File.getValidFileName(entry.label) + fileExt;
var destFile = destDir.clone();
destFile.append(fileName);
@@ -616,22 +664,55 @@ Zotero.Schema = new function(){
Components.utils.reportError(msg + " in Zotero.Schema.updateBundledFiles()");
destFile.remove(false);
}
- }
- else if (mode == 'style') {
- var fileName = tmpFile.leafName;
- }
-
- if (!existingObj || !existingObj.hidden) {
+
tmpFile.moveTo(destDir, fileName);
+
+ Zotero.wait();
}
- else {
- tmpFile.moveTo(hiddenDir, fileName);
+ }
+ // Styles
+ else {
+ var entries = zipReader.findEntries(null);
+ while (entries.hasMore()) {
+ var entry = entries.getNext();
+
+ var tmpFile = tmpDir.clone();
+ tmpFile.append(entry);
+ if (tmpFile.exists()) {
+ tmpFile.remove(false);
+ }
+ zipReader.extract(entry, tmpFile);
+ var newObj = new Zotero[Mode](tmpFile);
+
+ var existingObj = Zotero[Modes].get(newObj[mode + "ID"]);
+ if (!existingObj) {
+ Zotero.debug("Installing " + mode + " '" + newObj[titleField] + "'");
+ }
+ else {
+ Zotero.debug("Updating "
+ + (existingObj.hidden ? "hidden " : "")
+ + mode + " '" + existingObj[titleField] + "'");
+ if (existingObj.file.exists()) {
+ existingObj.file.remove(false);
+ }
+ }
+
+ var fileName = tmpFile.leafName;
+
+ if (!existingObj || !existingObj.hidden) {
+ tmpFile.moveTo(destDir, fileName);
+ }
+ else {
+ tmpFile.moveTo(hiddenDir, fileName);
+ }
+
+ Zotero.wait();
}
-
- Zotero.wait();
}
+
zipReader.close();
}
+ // SVN installation
else {
var sourceDir = extDir.clone();
sourceDir.append(modes);