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.
This commit is contained in:
Dan Stillman 2012-03-11 18:54:46 -04:00
parent 9821db988d
commit 5e19020437
3 changed files with 67 additions and 12 deletions

View file

@ -62,6 +62,8 @@ Zotero.Items = new function() {
var _cachedFields = [];
var _firstCreatorSQL = '';
var _primaryFields = [];
var _emptyTrashIdleObserver = null;
var _emptyTrashTimer = null;
/*
@ -490,18 +492,79 @@ 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;
}
/**
* 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
*

View file

@ -669,6 +669,8 @@ const ZOTERO_CONFIG = {
// Initialize Locate Manager
Zotero.LocateManager.init();
Zotero.Items.startEmptyTrashTimer();
return true;
}

View file

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