commit 72e0124e4e316260b7bf60c0987d63acef305a79
parent 4e1dd6f5b6c8e12747773328af2227523db8478b
Author: Dan Stillman <dstillman@zotero.org>
Date: Fri, 29 May 2015 01:11:03 -0400
Fix tag purging with stricter DB parameter checks
Should have failed without libraryID being passed
Diffstat:
1 file changed, 18 insertions(+), 36 deletions(-)
diff --git a/chrome/content/zotero/xpcom/data/tags.js b/chrome/content/zotero/xpcom/data/tags.js
@@ -361,7 +361,7 @@ Zotero.Tags = new function() {
* @param {Number|Number[]} [tagIDs] - tagID or array of tagIDs to purge
* @return {Promise}
*/
- this.purge = Zotero.Promise.coroutine(function* (libraryID, tagIDs) {
+ this.purge = Zotero.Promise.coroutine(function* (tagIDs) {
if (!tagIDs && !Zotero.Prefs.get('purge.tags')) {
return;
}
@@ -372,8 +372,6 @@ Zotero.Tags = new function() {
Zotero.DB.requireTransaction();
- yield Zotero.Tags.load(libraryID);
-
// Use given tags, as long as they're orphaned
if (tagIDs) {
let sql = "CREATE TEMPORARY TABLE tagDelete (tagID INT PRIMARY KEY)";
@@ -381,8 +379,9 @@ Zotero.Tags = new function() {
for (let i=0; i<tagIDs.length; i++) {
yield Zotero.DB.queryAsync("INSERT OR IGNORE INTO tagDelete VALUES (?)", tagIDs[i]);
}
- sql = "SELECT * FROM tagDelete WHERE tagID NOT IN (SELECT tagID FROM itemTags)";
- var toDelete = yield Zotero.DB.columnQueryAsync(sql);
+ sql = "SELECT tagID AS id, libraryID, name FROM tagDelete JOIN tags USING (tagID) "
+ + "WHERE tagID NOT IN (SELECT tagID FROM itemTags)";
+ var toDelete = yield Zotero.DB.queryAsync(sql);
}
// Look for orphaned tags
else {
@@ -394,10 +393,10 @@ Zotero.Tags = new function() {
sql = "CREATE INDEX tagDelete_tagID ON tagDelete(tagID)";
yield Zotero.DB.queryAsync(sql);
- sql = "SELECT * FROM tagDelete";
+ sql = "SELECT tagID AS id, libraryID, name FROM tagDelete JOIN tags USING (tagID)";
var toDelete = yield Zotero.DB.columnQueryAsync(sql);
- if (!toDelete) {
+ if (!toDelete.length) {
sql = "DROP TABLE tagDelete";
return Zotero.DB.queryAsync(sql);
}
@@ -405,19 +404,21 @@ Zotero.Tags = new function() {
notifierData = {};
for (let i=0; i<toDelete.length; i++) {
- let id = toDelete[i];
- if (_tagNamesByID[id]) {
- notifierData[id] = {
- old: {
- libraryID: libraryID,
- tag: _tagNamesByID[id]
- }
- };
+ let row = toDelete[i];
+ notifierData[row.id] = {
+ old: {
+ libraryID: row.libraryID,
+ tag: row.name
+ }
+ };
+
+ // Clear cached values
+ delete _tagNamesByID[row.id];
+ if (_tagIDsByName[row.libraryID]) {
+ delete _tagIDsByName[row.libraryID]['_' + tagName];
}
}
- _unload(libraryID, toDelete);
-
sql = "DELETE FROM tags WHERE tagID IN (SELECT tagID FROM tagDelete);";
yield Zotero.DB.queryAsync(sql);
@@ -880,24 +881,5 @@ Zotero.Tags = new function() {
}
_tagIDsByName[libraryID]['_' + name] = tagID;
}
-
- /**
- * Unload tags from caches
- *
- * @param {Number} libraryID
- * @param {Number|Array<Number>} ids One or more tagIDs
- */
- function _unload(libraryID, ids) {
- var ids = Zotero.flattenArguments(ids);
-
- for (let i=0; i<ids.length; i++) {
- let id = ids[i];
- let tagName = _tagNamesByID[id];
- delete _tagNamesByID[id];
- if (tagName && _tagIDsByName[libraryID]) {
- delete _tagIDsByName[libraryID]['_' + tagName];
- }
- }
- }
}