mirror of
https://github.com/zotero/zotero.git
synced 2026-10-05 02:43:38 +00:00
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:
parent
9821db988d
commit
5e19020437
3 changed files with 67 additions and 12 deletions
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -669,6 +669,8 @@ const ZOTERO_CONFIG = {
|
|||
// Initialize Locate Manager
|
||||
Zotero.LocateManager.init();
|
||||
|
||||
Zotero.Items.startEmptyTrashTimer();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue