From 2d4e686d022ba211d10346231b7e1ca2c07eedea Mon Sep 17 00:00:00 2001 From: polv Date: Sat, 21 Feb 2026 15:15:18 +0700 Subject: [PATCH] test that sqlite actually runs --- src-tauri/Cargo.lock | 149 ++++++++++++++++++++++++++++++++++++++++- src-tauri/Cargo.toml | 3 + src-tauri/src/db.rs | 29 ++++++++ src-tauri/src/lib.rs | 64 +++++++++++++++++- src-tauri/src/state.rs | 6 ++ src/App.vue | 8 ++- 6 files changed, 252 insertions(+), 7 deletions(-) create mode 100644 src-tauri/src/db.rs create mode 100644 src-tauri/src/state.rs diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index a1720c2..0fc0023 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -445,6 +445,9 @@ dependencies = [ name = "cjdic2" version = "0.1.0" dependencies = [ + "r2d2", + "r2d2_sqlite", + "rusqlite", "serde", "serde_json", "tauri", @@ -877,6 +880,18 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "2.3.0" @@ -930,6 +945,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "foreign-types" version = "0.5.0" @@ -1385,7 +1406,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -1393,6 +1414,18 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "hashlink" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0b22561a9c04a7cb1a302c013e0259cd3b4bb619f145b32f72b8b4bcbed230" +dependencies = [ + "hashbrown 0.16.1", +] [[package]] name = "heck" @@ -1896,6 +1929,16 @@ dependencies = [ "libc", ] +[[package]] +name = "libsqlite3-sys" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95b4103cffefa72eb8428cb6b47d6627161e51c2739fc5e3b734584157bc642a" +dependencies = [ + "pkg-config", + "vcpkg", +] + [[package]] name = "linux-raw-sys" version = "0.11.0" @@ -2749,6 +2792,28 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r2d2" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" +dependencies = [ + "log", + "parking_lot", + "scheduled-thread-pool", +] + +[[package]] +name = "r2d2_sqlite" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2ebd03c29250cdf191da93a35118b4567c2ef0eacab54f65e058d6f4c9965f6" +dependencies = [ + "r2d2", + "rusqlite", + "uuid", +] + [[package]] name = "rand" version = "0.7.3" @@ -2774,6 +2839,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -2794,6 +2869,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + [[package]] name = "rand_core" version = "0.5.1" @@ -2812,6 +2897,15 @@ dependencies = [ "getrandom 0.2.17", ] +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "rand_hc" version = "0.2.0" @@ -2939,6 +3033,31 @@ dependencies = [ "web-sys", ] +[[package]] +name = "rsqlite-vfs" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a1f2315036ef6b1fbacd1972e8ee7688030b0a2121edfc2a6550febd41574d" +dependencies = [ + "hashbrown 0.16.1", + "thiserror 2.0.18", +] + +[[package]] +name = "rusqlite" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c93dd1c9683b438c392c492109cb702b8090b2bfc8fed6f6e4eb4523f17af3" +dependencies = [ + "bitflags 2.11.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", + "sqlite-wasm-rs", +] + [[package]] name = "rustc_version" version = "0.4.1" @@ -2976,6 +3095,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scheduled-thread-pool" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" +dependencies = [ + "parking_lot", +] + [[package]] name = "schemars" version = "0.8.22" @@ -3334,6 +3462,18 @@ dependencies = [ "system-deps", ] +[[package]] +name = "sqlite-wasm-rs" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4206ed3a67690b9c29b77d728f6acc3ce78f16bf846d83c94f76400320181b" +dependencies = [ + "cc", + "js-sys", + "rsqlite-vfs", + "wasm-bindgen", +] + [[package]] name = "stable_deref_trait" version = "1.2.1" @@ -4207,10 +4347,17 @@ checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" dependencies = [ "getrandom 0.4.1", "js-sys", + "rand 0.9.2", "serde_core", "wasm-bindgen", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version-compare" version = "0.2.1" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 733d230..17b080a 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -22,4 +22,7 @@ tauri = { version = "2", features = [] } tauri-plugin-opener = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" +r2d2_sqlite = "0.32.0" +rusqlite = "0.38.0" +r2d2 = "0.8.10" diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs new file mode 100644 index 0000000..3ea20a5 --- /dev/null +++ b/src-tauri/src/db.rs @@ -0,0 +1,29 @@ +use serde::Serialize; + +use crate::state; + +#[derive(Serialize)] +pub struct SearchRow { + a: i32, + b: i32, +} + +#[tauri::command] +pub fn get_db(state: tauri::State) -> Result, String> { + let conn = state.conn.lock().map_err(|e| e.to_string())?; + let mut stmt = conn.prepare("SELECT a, b FROM test").map_err(|e| e.to_string())?; + + let rows = stmt.query_map([], |r| { + Ok(SearchRow { + a: r.get(0)?, + b: r.get(1)?, + }) + }).map_err(|e| e.to_string())?; + + let mut out = Vec::new(); + for r in rows { + out.push(r.map_err(|e| e.to_string())?); + } + + Ok(out) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 4a277ef..055048b 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,3 +1,10 @@ +use tauri::Manager; +use rusqlite::Connection; +use std::sync::Mutex; + +mod db; +mod state; + // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ #[tauri::command] fn greet(name: &str) -> String { @@ -8,7 +15,58 @@ fn greet(name: &str) -> String { pub fn run() { tauri::Builder::default() .plugin(tauri_plugin_opener::init()) - .invoke_handler(tauri::generate_handler![greet]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + .setup(|app| { + let cfg_dir = app.path().app_config_dir(); + let app_dir = cfg_dir + .unwrap_or_else(|_| std::env::current_dir().unwrap_or_else(|_| std::path::PathBuf::from("."))); + + std::fs::create_dir_all(&app_dir)?; + + let db_path = app_dir.join("cjdic.db"); + let is_new = !db_path.exists(); + println!("{:?}", db_path); + + let conn = Connection::open(&db_path)?; + + if is_new { + conn.execute_batch("CREATE TABLE test (a, b);")?; + let mut stmt = conn.prepare("INSERT INTO test VALUES (?1, ?2)")?; + stmt.insert([1, 2])?; + stmt.insert([3, 4])?; + } + + app.manage(state::AppState{ + conn: Mutex::new(conn), + }); + Ok(()) + }) + .invoke_handler(tauri::generate_handler![greet, db::get_db]) + .build(tauri::generate_context!()) + .expect("error while running tauri application") + .run(|_app_handle, event| match event { + tauri::RunEvent::ExitRequested { .. } => { + // api.prevent_exit(); + // let handle = app_handle.clone(); + + // if let Some(state) = app_handle.try_state::() { + // if let Ok(conn) = state.conn.lock() { + // if let Err(e) = (|| -> Result<(), rusqlite::Error> { + // conn.execute_batch("PRAGMA optimize;")?; + // conn.execute("PRAGMA wal_checkpoint(FULL);", [])?; + + // let (_busy, _log, _checkpointed): (i32, i32, i32) = + // conn.query_row("PRAGMA wal_checkpoint(FULL);", [], |row| { + // Ok((row.get(0)?, row.get(1)?, row.get(2)?)) + // })?; + // Ok(()) + // })() { + // eprintln!("Shutdown SQL failed: {e}"); + // } + // } + // } + + // handle.exit(0); + } + _ => {} + }); } diff --git a/src-tauri/src/state.rs b/src-tauri/src/state.rs new file mode 100644 index 0000000..540b91d --- /dev/null +++ b/src-tauri/src/state.rs @@ -0,0 +1,6 @@ +use rusqlite::Connection; +use std::sync::Mutex; + +pub struct AppState { + pub conn: Mutex +} \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index b209212..b437c17 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,6 +9,10 @@ async function greet() { // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ greetMsg.value = await invoke("greet", { name: name.value }); } + +invoke<{ a: number; b: number }[]>("get_db").then((r) => { + name.value = JSON.stringify(r); +});