Fix tag purging with stricter DB parameter checks

Should have failed without libraryID being passed
This commit is contained in:
Dan Stillman 2015-05-29 01:11:03 -04:00
parent 4e1dd6f5b6
commit 72e0124e4e

View File

@ -361,7 +361,7 @@ Zotero.Tags = new function() {
* @param {Number|Number[]} [tagIDs] - tagID or array of tagIDs to purge * @param {Number|Number[]} [tagIDs] - tagID or array of tagIDs to purge
* @return {Promise} * @return {Promise}
*/ */
this.purge = Zotero.Promise.coroutine(function* (libraryID, tagIDs) { this.purge = Zotero.Promise.coroutine(function* (tagIDs) {
if (!tagIDs && !Zotero.Prefs.get('purge.tags')) { if (!tagIDs && !Zotero.Prefs.get('purge.tags')) {
return; return;
} }
@ -372,8 +372,6 @@ Zotero.Tags = new function() {
Zotero.DB.requireTransaction(); Zotero.DB.requireTransaction();
yield Zotero.Tags.load(libraryID);
// Use given tags, as long as they're orphaned // Use given tags, as long as they're orphaned
if (tagIDs) { if (tagIDs) {
let sql = "CREATE TEMPORARY TABLE tagDelete (tagID INT PRIMARY KEY)"; 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++) { for (let i=0; i<tagIDs.length; i++) {
yield Zotero.DB.queryAsync("INSERT OR IGNORE INTO tagDelete VALUES (?)", tagIDs[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)"; sql = "SELECT tagID AS id, libraryID, name FROM tagDelete JOIN tags USING (tagID) "
var toDelete = yield Zotero.DB.columnQueryAsync(sql); + "WHERE tagID NOT IN (SELECT tagID FROM itemTags)";
var toDelete = yield Zotero.DB.queryAsync(sql);
} }
// Look for orphaned tags // Look for orphaned tags
else { else {
@ -394,10 +393,10 @@ Zotero.Tags = new function() {
sql = "CREATE INDEX tagDelete_tagID ON tagDelete(tagID)"; sql = "CREATE INDEX tagDelete_tagID ON tagDelete(tagID)";
yield Zotero.DB.queryAsync(sql); 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); var toDelete = yield Zotero.DB.columnQueryAsync(sql);
if (!toDelete) { if (!toDelete.length) {
sql = "DROP TABLE tagDelete"; sql = "DROP TABLE tagDelete";
return Zotero.DB.queryAsync(sql); return Zotero.DB.queryAsync(sql);
} }
@ -405,18 +404,20 @@ Zotero.Tags = new function() {
notifierData = {}; notifierData = {};
for (let i=0; i<toDelete.length; i++) { for (let i=0; i<toDelete.length; i++) {
let id = toDelete[i]; let row = toDelete[i];
if (_tagNamesByID[id]) { notifierData[row.id] = {
notifierData[id] = {
old: { old: {
libraryID: libraryID, libraryID: row.libraryID,
tag: _tagNamesByID[id] tag: row.name
} }
}; };
}
}
_unload(libraryID, toDelete); // Clear cached values
delete _tagNamesByID[row.id];
if (_tagIDsByName[row.libraryID]) {
delete _tagIDsByName[row.libraryID]['_' + tagName];
}
}
sql = "DELETE FROM tags WHERE tagID IN (SELECT tagID FROM tagDelete);"; sql = "DELETE FROM tags WHERE tagID IN (SELECT tagID FROM tagDelete);";
yield Zotero.DB.queryAsync(sql); yield Zotero.DB.queryAsync(sql);
@ -880,24 +881,5 @@ Zotero.Tags = new function() {
} }
_tagIDsByName[libraryID]['_' + name] = tagID; _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];
}
}
}
} }