www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 5e190204376d1a1f75d550925d83407d9bf0dd9b
parent 9821db988dce9ea8da512027983a855b35636ef7
Author: Dan Stillman <dstillman@zotero.org>
Date:   Sun, 11 Mar 2012 18:54:46 -0400

Auto-empty items from trash on idle rather than at pane open

Deleting is currently very slow (which will be fixed on master), which
can cause long delays when auto-emptying items older at pane open.
Instead, empty 10 items after 5 minutes of idle, and then another 10
every 5 seconds until there are no more items to empty or the user is back.

Diffstat:
Mchrome/content/zotero/xpcom/data/items.js | 67+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Mchrome/content/zotero/xpcom/zotero.js | 2++
Mchrome/content/zotero/zoteroPane.js | 10----------
3 files changed, 67 insertions(+), 12 deletions(-)

diff --git a/chrome/content/zotero/xpcom/data/items.js b/chrome/content/zotero/xpcom/data/items.js @@ -62,6 +62,8 @@ Zotero.Items = new function() { var _cachedFields = []; var _firstCreatorSQL = ''; var _primaryFields = []; + var _emptyTrashIdleObserver = null; + var _emptyTrashTimer = null; /* @@ -490,12 +492,15 @@ Zotero.Items = new function() { /** * @param {Integer} days Only delete items deleted more than this many days ago */ - this.emptyTrash = function (libraryID, days) { + this.emptyTrash = function (libraryID, days, limit) { Zotero.DB.beginTransaction(); var deletedIDs = this.getDeleted(libraryID, true, days); if (deletedIDs.length) { + if (limit) { + deletedIDs = deletedIDs.slice(0, limit - 1) + } this.erase(deletedIDs); - Zotero.Notifier.trigger('refresh', 'collection', libraryID ? libraryID : 0); + Zotero.Notifier.trigger('refresh', 'trash', libraryID ? libraryID : 0); } Zotero.DB.commitTransaction(); return deletedIDs.length; @@ -503,6 +508,64 @@ Zotero.Items = new function() { /** + * Start idle observer to delete trashed items older than a certain number of days + */ + this.startEmptyTrashTimer = function () { + _emptyTrashIdleObserver = { + observe: function (subject, topic, data) { + if (topic == 'idle' || topic == 'timer-callback') { + var days = Zotero.Prefs.get('trashAutoEmptyDays'); + if (!days) { + return; + } + + // TODO: empty group trashes if permissions + + var d = new Date(); + + // Delete a few items a time + // + // TODO: increase number after dealing with slow + // tag.getLinkedItems() call during deletes + Zotero.debug("Auto-emptying items from trash"); + var num = 10; + var deleted = Zotero.Items.emptyTrash(null, days, num); + + var d2 = new Date(); + Zotero.debug("Emptied " + deleted + " old items from trash in " + (d2 - d) + " ms"); + + if (!deleted) { + _emptyTrashTimer = null; + return; + } + + // Set a timer to do more every few seconds + if (!_emptyTrashTimer) { + _emptyTrashTimer = Components.classes["@mozilla.org/timer;1"]. + createInstance(Components.interfaces.nsITimer); + } + _emptyTrashTimer.init( + _emptyTrashIdleObserver.observe, + 5 * 1000, + Components.interfaces.nsITimer.TYPE_ONE_SHOT + ); + } + // When no longer idle, cancel timer + else if (topic == 'back') { + if (_emptyTrashTimer) { + _emptyTrashTimer.cancel(); + } + } + } + }; + + var idleService = Components.classes["@mozilla.org/widget/idleservice;1"]. + getService(Components.interfaces.nsIIdleService); + idleService.addIdleObserver(_emptyTrashIdleObserver, 305); + } + + + /** * Delete item(s) from database and clear from internal array * * @param {Integer|Integer[]} ids Item ids diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js @@ -669,6 +669,8 @@ const ZOTERO_CONFIG = { // Initialize Locate Manager Zotero.LocateManager.init(); + Zotero.Items.startEmptyTrashTimer(); + return true; } diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js @@ -403,16 +403,6 @@ var ZoteroPane = new function() searchBar.inputField.select(); }, 1); - // Auto-empty trashed items older than a certain number of days - var days = Zotero.Prefs.get('trashAutoEmptyDays'); - if (days) { - var d = new Date(); - // TODO: empty group trashes if permissions - var deleted = Zotero.Items.emptyTrash(null, days); - var d2 = new Date(); - Zotero.debug("Emptied old items from trash in " + (d2 - d) + " ms"); - } - var d = new Date(); Zotero.purgeDataObjects(); var d2 = new Date();