From 46ad9022c2d5dffad696d808ce5e10579f670081 Mon Sep 17 00:00:00 2001 From: 4aiman Date: Mon, 1 Jun 2026 21:25:23 +0300 Subject: [PATCH] Fix dedup: PRAGMA foreign_keys=OFF before delete, alert on seed error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FOREIGN KEY constraint failed on desktop (rusqlite enables FK by default). Android was silently failing too. Fix: disable FK during dedup, re-enable after. Tested: desktop 16675 → 8330 products, idx_products_dedup created. Also: alert() instead of boot-label for seed errors (visible to user). --- frontend/js/main.js | 2 +- src-tauri/src/lib.rs | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/js/main.js b/frontend/js/main.js index fe42db0..c49c2e2 100644 --- a/frontend/js/main.js +++ b/frontend/js/main.js @@ -96,7 +96,7 @@ async function init() { const result = await window.__TAURI__.core.invoke("import_seed_products"); if (unlisten) unlisten(); - } catch (e) { console.error("[SEED]", e); document.getElementById("boot-label").textContent = "Seed: " + e; } + } catch (e) { console.error("[SEED]", e); alert("Seed error: " + e); } // Apply safe area insets (Android status bar / nav bar) try { diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index fcf42e9..6f4ae0f 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -140,7 +140,9 @@ fn import_seed_products(app: tauri::AppHandle) -> Result { } // Dedup ALWAYS runs (even if seed version matches) — fixes legacy duplicates. - // Fast: <0.2s with index. No-op if no dupes exist. + // Disable FK checks during dedup (refs reassigned before delete, but rusqlite enforces FK by default) + let _ = main_db.execute("PRAGMA foreign_keys = OFF", []); + let _ = main_db.execute( "CREATE INDEX IF NOT EXISTS idx_products_name_lower ON products(name_lower)", []); @@ -178,6 +180,8 @@ fn import_seed_products(app: tauri::AppHandle) -> Result { ON products(name_lower, source, COALESCE(store_id, '')) WHERE name_lower IS NOT NULL", []); + let _ = main_db.execute("PRAGMA foreign_keys = ON", []); + // Check seed version — skip import if already up to date let current_version: i64 = main_db.query_row( "SELECT COALESCE((SELECT value FROM profile WHERE key='seed_version'), '0')",