Fix tag purging with stricter DB parameter checks
Should have failed without libraryID being passed
This commit is contained in:
parent
4e1dd6f5b6
commit
72e0124e4e
|
@ -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];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user