From fd1585b5e2a8b0bcc6694ef24c43f6096ea3ad78 Mon Sep 17 00:00:00 2001 From: LyAhn Date: Sun, 7 Jun 2026 23:35:14 +0100 Subject: [PATCH] fix: three pre-emptive issues caught before push MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - store: removeFolder now also resets exploreTagsFolderId so the Explore tag list is invalidated when a folder is removed, not just tagCloud - db: delete_folder moves vector::delete_embedding calls outside the transaction — sqlite-vec virtual-table DML is unreliable inside a transaction and caused remove_folder to fail for folders with embeddings - store: loadMoreImages now passes similarSourceFolderId as the fourth arg to loadSimilarImages; omitting it caused each paginated load to overwrite the state with similarFolderId, corrupting scope-switches that use similarSourceFolderId afterward --- src-tauri/src/db.rs | 13 +++++++++---- src/store.ts | 6 +++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs index a9caf14..9b5caf8 100644 --- a/src-tauri/src/db.rs +++ b/src-tauri/src/db.rs @@ -2074,11 +2074,16 @@ pub fn delete_folder(conn: &Connection, folder_id: i64) -> Result<()> { rows }; - let tx = conn.unchecked_transaction()?; - for image_id in image_ids { - vector::delete_embedding(&tx, image_id)?; - vector::delete_caption_embedding(&tx, image_id)?; + // Delete sqlite-vec rows outside any transaction — DML on virtual tables is + // unreliable inside a transaction and will cause remove_folder to fail for + // folders that have generated embeddings. The folder cascade (images rows) + // is handled by the FK ON DELETE CASCADE when the folder row is deleted. + for image_id in &image_ids { + vector::delete_embedding(conn, *image_id)?; + vector::delete_caption_embedding(conn, *image_id)?; } + + let tx = conn.unchecked_transaction()?; tx.execute("DELETE FROM folders WHERE id = ?1", params![folder_id])?; tx.commit()?; Ok(()) diff --git a/src/store.ts b/src/store.ts index 60f406a..82d456d 100644 --- a/src/store.ts +++ b/src/store.ts @@ -657,8 +657,8 @@ export const useGalleryStore = create((set, get) => ({ const { selectedFolderId, loadFolders, loadImages, loadBackgroundJobProgress } = get(); await loadFolders(); await loadBackgroundJobProgress(); - // Invalidate tag cloud cache since library content changed - set({ tagCloudFolderId: undefined, tagCloudEntries: [] }); + // Invalidate tag cloud and explore-tags cache since library content changed + set({ tagCloudFolderId: undefined, tagCloudEntries: [], exploreTagsFolderId: undefined }); if (selectedFolderId === folderId) { set({ selectedFolderId: null }); await loadImages(true); @@ -810,7 +810,7 @@ export const useGalleryStore = create((set, get) => ({ if (collectionTitle === "Explore Cluster") return; if (collectionTitle === "Similar Images" && similarSourceImageId !== null) { if (!similarHasMore) return; - await get().loadSimilarImages(similarSourceImageId, similarFolderId, false); + await get().loadSimilarImages(similarSourceImageId, similarFolderId, false, get().similarSourceFolderId ?? null); return; } if (collectionTitle === "Region Search Results" && similarSourceImageId !== null && similarCrop !== null) {