From a5329880d791f93a45201199210ba0973c6a86d6 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Wed, 27 Jan 2010 10:39:35 +0000 Subject: [PATCH] - Purge tags immediately on delete from tag selector - Adds optional tagIDs parameter to Zotero.Tags.purge() --- .../content/zotero/bindings/tagselector.xml | 1 + chrome/content/zotero/xpcom/data/tags.js | 57 ++++++++++++------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/chrome/content/zotero/bindings/tagselector.xml b/chrome/content/zotero/bindings/tagselector.xml index 21ee307e7..812d58d27 100644 --- a/chrome/content/zotero/bindings/tagselector.xml +++ b/chrome/content/zotero/bindings/tagselector.xml @@ -682,6 +682,7 @@ } Zotero.Tags.erase(tagIDs); + Zotero.Tags.purge(tagIDs); Zotero.DB.commitTransaction() } diff --git a/chrome/content/zotero/xpcom/data/tags.js b/chrome/content/zotero/xpcom/data/tags.js index 458f9b31e..298b131c9 100644 --- a/chrome/content/zotero/xpcom/data/tags.js +++ b/chrome/content/zotero/xpcom/data/tags.js @@ -399,37 +399,54 @@ Zotero.Tags = new function() { } - /* + /** * Delete obsolete tags from database and clear internal array entries * - * Returns removed tagIDs on success + * @param [Integer[]|Integer] [tagIDs] tagID or array of tagIDs to purge */ - function purge() { - if (!Zotero.Prefs.get('purge.tags')) { + function purge(tagIDs) { + if (!tagIDs && !Zotero.Prefs.get('purge.tags')) { return; } + if (tagIDs) { + tagIDs = Zotero.flattenArguments(tagIDs); + } + Zotero.UnresponsiveScriptIndicator.disable(); try { Zotero.DB.beginTransaction(); - var sql = "CREATE TEMPORARY TABLE tagDelete AS " - + "SELECT tagID FROM tags WHERE tagID " - + "NOT IN (SELECT tagID FROM itemTags)"; - Zotero.DB.query(sql); - - sql = "CREATE INDEX tagDelete_tagID ON tagDelete(tagID)"; - Zotero.DB.query(sql); - - sql = "SELECT * FROM tagDelete"; - var toDelete = Zotero.DB.columnQuery(sql); - - if (!toDelete) { - sql = "DROP TABLE tagDelete"; + // Use given tags + if (tagIDs) { + var sql = "CREATE TEMPORARY TABLE tagDelete (tagID INT PRIMARY KEY)"; Zotero.DB.query(sql); - Zotero.DB.commitTransaction(); - Zotero.Prefs.set('purge.tags', false); - return; + for each(var id in tagIDs) { + Zotero.DB.query("INSERT OR IGNORE INTO tagDelete VALUES (?)", id); + } + // Remove duplicates + var toDelete = Zotero.DB.columnQuery("SELECT * FROM tagDelete"); + } + // Look for orphaned tags + else { + var sql = "CREATE TEMPORARY TABLE tagDelete AS " + + "SELECT tagID FROM tags WHERE tagID " + + "NOT IN (SELECT tagID FROM itemTags)"; + Zotero.DB.query(sql); + + sql = "CREATE INDEX tagDelete_tagID ON tagDelete(tagID)"; + Zotero.DB.query(sql); + + sql = "SELECT * FROM tagDelete"; + var toDelete = Zotero.DB.columnQuery(sql); + + if (!toDelete) { + sql = "DROP TABLE tagDelete"; + Zotero.DB.query(sql); + Zotero.DB.commitTransaction(); + Zotero.Prefs.set('purge.tags', false); + return; + } } var notifierData = {};