From a38a28a8361991304ba12044c5ac7a3814f209bd Mon Sep 17 00:00:00 2001 From: polv Date: Sat, 7 Mar 2026 09:03:11 +0700 Subject: [PATCH] reload after db upgrade logic --- src-core/src/db/yomitan_writer.rs | 28 +++++++++++++++++----- src-react/src/components/LoadingDialog.tsx | 6 +++-- src-tauri/src/command.rs | 18 ++++++-------- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src-core/src/db/yomitan_writer.rs b/src-core/src/db/yomitan_writer.rs index 3209821..4efffb5 100644 --- a/src-core/src/db/yomitan_writer.rs +++ b/src-core/src/db/yomitan_writer.rs @@ -176,7 +176,7 @@ impl YomitanWriter { self.create_materialized_views()?; self.attach_glossary()?; - let schema_version = "2"; + let schema_version = "2026-03-07"; let current_schema_version = { let mut stmt = self @@ -193,7 +193,7 @@ impl YomitanWriter { .query_row("SELECT MAX(id) FROM glossaries", [], |r| r.get::<_, i64>(0))? as usize; - let message = &format!("migrate to {}", YOMITAN_GLOSSARY_DBFILE); + let message = &format!("Migrate to {}", YOMITAN_GLOSSARY_DBFILE); progress_callback(YomitanProgress { message: message.to_string(), current: 0, @@ -232,15 +232,29 @@ impl YomitanWriter { message: message.to_string(), current: i, total, - steps: 0, + steps: i, }); } } } tx.commit()?; + progress_callback(YomitanProgress { + message: message.to_string(), + current: total, + total, + steps: total, + }); + self.hash_glossary()?; + progress_callback(YomitanProgress { + message: "Cleaning up old glossary".to_string(), + current: 0, + total: 0, + steps: total, + }); + let _timer = Timer::new(format!("cleanup for {}", YOMITAN_GLOSSARY_DBFILE)); self.conn.execute_batch( " @@ -250,9 +264,11 @@ impl YomitanWriter { )?; } - self.conn - .prepare("UPDATE schema_meta SET value = ?2 WHERE key = ?1")? - .execute(["schema_version", schema_version])?; + if v < schema_version.to_string() { + self.conn + .prepare("UPDATE schema_meta SET value = ?2 WHERE key = ?1")? + .execute(["schema_version", schema_version])?; + } } else { self.conn .prepare("INSERT INTO schema_meta (key, value) VALUES (?1, ?2)")? diff --git a/src-react/src/components/LoadingDialog.tsx b/src-react/src/components/LoadingDialog.tsx index 83192ee..789e1e4 100644 --- a/src-react/src/components/LoadingDialog.tsx +++ b/src-react/src/components/LoadingDialog.tsx @@ -34,6 +34,7 @@ interface Progress { message: string; current?: number; total?: number; + unit?: string; } function LoadingDialog() { @@ -139,9 +140,10 @@ function LoadingDialog() { listen("download-url-progress", ({ payload }) => { updateProgress({ - message: `Downloading ${payload.filepath} (MiB)`, + message: `Downloading ${payload.filepath}`, current: payload.downloaded >> 20, total: payload.content_length >> 20, + unit: "MiB", }); }); }, []); @@ -175,7 +177,7 @@ function LoadingDialog() { ? messages.map((m, i) => (

{m.total - ? `${m.message} (${m.current}/${m.total})` + ? `${m.message} (${(m.current || 0).toLocaleString()}/${m.total.toLocaleString()}${m.unit ? ` ${m.unit}` : ""})` : m.message}

)) diff --git a/src-tauri/src/command.rs b/src-tauri/src/command.rs index 445e07e..9e1cd19 100644 --- a/src-tauri/src/command.rs +++ b/src-tauri/src/command.rs @@ -1,4 +1,5 @@ use std::{ + cell::Cell, fs::{File, remove_file}, path::PathBuf, }; @@ -25,9 +26,6 @@ pub async fn init_yomitan( lang: String, state: tauri::State<'_, AppService>, ) -> Result<(), CJDicError> { - let mut new_dicts: Vec = vec![]; - let mut to_be_removed_dicts: Vec = vec![]; - let app_dir = app .path() .app_data_dir() @@ -56,25 +54,23 @@ pub async fn init_yomitan( .map(|d| app_dir.join(&d.filepath)) .collect(); - let mut r = state.load_yomitan_zip_dir( + let update_count = Cell::new(0usize); + + state.load_yomitan_zip_dir( zip_files, lang.as_str(), |r| { + update_count.set(update_count.get() + r.new_dicts.len() + r.to_be_removed_dicts.len()); app.emit("load-yomitan-dir", r).unwrap(); }, |r| { + update_count.set(update_count.get() + 1); app.emit("yomitan-import-progress", r).unwrap(); }, )?; - new_dicts.append(&mut r.new_dicts); - to_be_removed_dicts.append(&mut r.to_be_removed_dicts); - - if new_dicts.len() + to_be_removed_dicts.len() > 0 { - println!("Imported {:?}", new_dicts); - println!("Removed {:?}", to_be_removed_dicts); + if update_count.get() > 0 { println!("Request app restart?",); - // Request app restart anyway app.request_restart(); }