From 29a47933021c6ca2ab8613dc3d28af9eb0432343 Mon Sep 17 00:00:00 2001 From: awsr <43862868+awsr@users.noreply.github.com> Date: Sat, 29 Nov 2025 03:19:33 -0800 Subject: [PATCH] Much faster performance for normal runs - May result in the initial run being slower in some circumstances. --- javascript/indexdb.js | 37 +++++++++++++------------------------ 1 file changed, 13 insertions(+), 24 deletions(-) diff --git a/javascript/indexdb.js b/javascript/indexdb.js index 1b391d9c0..88da54835 100644 --- a/javascript/indexdb.js +++ b/javascript/indexdb.js @@ -147,36 +147,25 @@ async function idbFolderCleanup(keepSet, folder, msgCallback) { if (typeof folder !== 'string') { throw new Error('IndexedDB cleaning function must be told the current active folder'); } - const removals = (new Set(await idbGetAllKeys('folder', folder))).difference(keepSet); + + let removals = new Set(await idbGetAllKeys('folder', folder)); + removals = removals.difference(keepSet); // Don't need to keep full set in memory const totalRemovals = removals.size; - let counter = 0; + return new Promise((resolve, reject) => { try { const transaction = db.transaction('thumbs', 'readwrite'); - const folderIndex = transaction.objectStore('thumbs').index('folder'); - const request = folderIndex.openCursor(folder); + const store = transaction.objectStore('thumbs'); - request.onsuccess = (evt) => { - const cursor = evt.target.result; - if (cursor) { - if (removals.has(cursor.primaryKey)) { - counter++; - cursor.delete(); - } - if (counter === totalRemovals) { - resolve(counter); // Got lucky with element order and can stop early - } else { - if (counter % 100 === 0 && counter !== 0) { - msgCallback(Math.floor((counter / totalRemovals) * 100)); - } - cursor.continue(); - } - } else { - resolve(counter); + removals = Array.from(removals); + for (let index = 0; index < totalRemovals; index++) { + const entry = removals[index]; + store.delete(entry); + if (index % 100 === 0 && index !== 0) { + msgCallback(Math.floor((index / totalRemovals) * 100)); } - }; - request.onerror = (e) => reject(e); - transaction.onabort = (e) => reject(e); + } + resolve(totalRemovals); } catch (err) { reject(err); }