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:
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();