diff --git a/src-core/src/db/yomitan_writer.rs b/src-core/src/db/yomitan_writer.rs index 3a33f9e..4cfe055 100644 --- a/src-core/src/db/yomitan_writer.rs +++ b/src-core/src/db/yomitan_writer.rs @@ -83,7 +83,6 @@ impl YomitanWriter { pub fn create_schema( &mut self, - tokenizer: Tokenizer, progress_callback: impl Fn(YomitanProgress), ) -> Result<(), CJDicError> { self.conn.execute_batch( @@ -176,25 +175,6 @@ impl YomitanWriter { self.attach_db(DbChild::YomitanGlossary)?; self.attach_db(DbChild::Search)?; - let search_max_id = { - let mut stmt = self.conn.prepare(&format!( - "SELECT COALESCE(MAX(id), 0) FROM {}.terms", - DBSCHEMA[DbChild::Search] - ))?; - let mut rows = stmt.query([])?; - - if let Some(r) = rows.next()? { - r.get(0)? - } else { - 0 - } - }; - if search_max_id == 0 { - let mut search_db = SearchDatabase::new(&mut self.conn); - search_db.reset_db()?; - search_db.regenerate_yomitan("main", tokenizer.clone(), &progress_callback)?; - } - let schema_version = "2026-03-08"; let current_schema_version = { let mut stmt = self @@ -807,6 +787,18 @@ impl YomitanWriter { Ok(()) } + + pub fn make_search_db( + &mut self, + tokenizer: Tokenizer, + progress_callback: impl Fn(YomitanProgress), + ) -> Result<(), CJDicError> { + let mut search_db = SearchDatabase::new(&mut self.conn); + search_db.reset_db()?; + search_db.regenerate_yomitan("main", tokenizer.clone(), &progress_callback)?; + + Ok(()) + } } fn intern( diff --git a/src-core/src/service.rs b/src-core/src/service.rs index 9dfe310..110a1a4 100644 --- a/src-core/src/service.rs +++ b/src-core/src/service.rs @@ -121,7 +121,7 @@ impl AppService { progress_callback: impl Fn(YomitanProgress), ) -> Result { let mut writer = YomitanWriter::new(self.db.dir.clone())?; - writer.create_schema(self.tokenizer.clone(), &progress_callback)?; + writer.create_schema(&progress_callback)?; Ok(writer) } @@ -187,7 +187,7 @@ impl AppService { { let mut writer = YomitanWriter::new(self.db.dir.clone())?; - writer.create_schema(self.tokenizer.clone(), &import_callback)?; + writer.create_schema(&import_callback)?; } { @@ -208,6 +208,8 @@ impl AppService { Self::import_yomitan_zip_file(&mut writer, *zip_file, lang, &import_callback)?; } } + + writer.make_search_db(self.tokenizer.clone(), &import_callback)?; } Ok(LoadYomitanZipDirResult { diff --git a/src-core/src/tokenizer.rs b/src-core/src/tokenizer.rs index d675639..19ab94b 100644 --- a/src-core/src/tokenizer.rs +++ b/src-core/src/tokenizer.rs @@ -1,7 +1,6 @@ -use std::path::Path; +use std::{fs::File, io::BufReader, path::Path}; use serde::Serialize; -use vibrato_rkyv::CacheStrategy; use crate::CJDicError; @@ -28,8 +27,9 @@ pub struct Tokenizer { impl Tokenizer { pub fn new(vibrato_dict: impl AsRef) -> Result { - let dictionary = - vibrato_rkyv::Dictionary::from_zstd(vibrato_dict, CacheStrategy::GlobalCache)?; + let file = BufReader::new(File::open(vibrato_dict)?); + let reader = zstd::Decoder::new(file)?; + let dictionary = vibrato_rkyv::Dictionary::read(reader)?; Ok(Self { ja_tokenizer: vibrato_rkyv::Tokenizer::new(dictionary), }) diff --git a/src-react/src/components/LoadingDialog.tsx b/src-react/src/components/LoadingDialog.tsx index 789e1e4..03522bd 100644 --- a/src-react/src/components/LoadingDialog.tsx +++ b/src-react/src/components/LoadingDialog.tsx @@ -46,17 +46,17 @@ function LoadingDialog() { if (isInit.current) return; isInit.current = true; - // empty query warmup - // no need to await - invoke("search_yomitan", { - qTerm: "", - qReading: "", - limit: 1, - offset: 0, - }); - document.body.style.pointerEvents = "none"; downloadAssets().finally(() => { + // empty query warmup + // no need to await + invoke("search_yomitan", { + qTerm: "", + qReading: "", + limit: 1, + offset: 0, + }); + document.body.style.pointerEvents = ""; const elFirstInput = document.querySelector( 'input[type="text"]', diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 31e51f6..a5efa75 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -29,7 +29,7 @@ pub fn run() { let bytes = app.fs().read(&resource_path)?; // Write to app's cache dir, which IS a real writable filesystem path on Android - let cache_dir = app.path().cache_dir()?; + let cache_dir = app.path().app_cache_dir()?.join("vibrato"); create_dir_all(&cache_dir)?; let dict_path = cache_dir.join("system.dic.zst"); fs::write(&dict_path, &bytes)?;