From e0e3a96d85743620ced8f25921775229143743b6 Mon Sep 17 00:00:00 2001 From: Henry Till Date: Thu, 25 Jan 2024 12:37:32 -0800 Subject: [PATCH 1/3] db: fix SELECT_LATEST_VERSION --- host/src/db.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/host/src/db.rs b/host/src/db.rs index be6aec1..54639dc 100644 --- a/host/src/db.rs +++ b/host/src/db.rs @@ -22,7 +22,7 @@ SELECT EXISTS const SELECT_LATEST_VERSION: &str = "\ SELECT major, minor, patch FROM schema_version -ORDER BY date_applied DESC +ORDER BY applied_at DESC LIMIT 1 "; From 51ced15f34c29c6417cb588f3a2116b89abdd58b Mon Sep 17 00:00:00 2001 From: Henry Till Date: Thu, 25 Jan 2024 12:39:44 -0800 Subject: [PATCH 2/3] run cargo add directories --- host/Cargo.lock | 170 +++++++++++++++++++++++++++++++++++++++++++++++- host/Cargo.toml | 1 + 2 files changed, 170 insertions(+), 1 deletion(-) diff --git a/host/Cargo.lock b/host/Cargo.lock index 3d3a8e6..aaa38d2 100644 --- a/host/Cargo.lock +++ b/host/Cargo.lock @@ -29,6 +29,12 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.4.1" @@ -50,6 +56,27 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -62,6 +89,17 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -93,6 +131,17 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + [[package]] name = "libsqlite3-sys" version = "0.27.0" @@ -114,6 +163,7 @@ checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" name = "noematic" version = "0.1.0" dependencies = [ + "directories", "regex", "rusqlite", "semver", @@ -128,6 +178,12 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "pkg-config" version = "0.3.28" @@ -152,6 +208,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.10.2" @@ -187,7 +263,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a78046161564f5e7cd9008aff3b2990b3850dc8e0349119b98e8f251e099f24d" dependencies = [ - "bitflags", + "bitflags 2.4.1", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -258,6 +334,26 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "unicode-ident" version = "1.0.12" @@ -276,6 +372,78 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "zerocopy" version = "0.7.32" diff --git a/host/Cargo.toml b/host/Cargo.toml index 6ed9d48..5fb2cee 100644 --- a/host/Cargo.toml +++ b/host/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +directories = "5.0.1" regex = "1.10.2" rusqlite = { version = "0.30.0", features = ["bundled"] } semver = { version = "1.0.20", features = ["serde"] } From 9b4984cf1bec749c68e44f409c216e393c83ab13 Mon Sep 17 00:00:00 2001 From: Henry Till Date: Thu, 25 Jan 2024 12:42:33 -0800 Subject: [PATCH 3/3] host: add persistence --- host/src/lib.rs | 6 ++++-- host/src/main.rs | 16 +++++++++++++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/host/src/lib.rs b/host/src/lib.rs index 96f2495..fb20f1e 100644 --- a/host/src/lib.rs +++ b/host/src/lib.rs @@ -1,6 +1,8 @@ mod db; pub mod message; +use std::path::Path; + use regex::Regex; use rusqlite::Connection; use serde_json::Value; @@ -85,8 +87,8 @@ fn make_process(re: Regex) -> impl Fn(Query) -> String { } impl Context { - pub fn new() -> Result { - let mut connection = Connection::open_in_memory()?; + pub fn new(db_path: impl AsRef) -> Result { + let mut connection = Connection::open(db_path)?; db::init_tables(&mut connection)?; let process_regex = Regex::new(r"\W+").unwrap(); let process = Box::new(make_process(process_regex)); diff --git a/host/src/main.rs b/host/src/main.rs index 9b94a54..7f796ee 100644 --- a/host/src/main.rs +++ b/host/src/main.rs @@ -1,5 +1,6 @@ use std::io::{self, BufReader, BufWriter, Read, Write}; +use directories::ProjectDirs; use serde_json::Value; use noematic::{ @@ -14,6 +15,7 @@ enum Error { Io(io::Error), Json(serde_json::Error), Noematic(noematic::Error), + MissingHomeDir, UnsupportedVersion, UnsupportedLength, } @@ -24,6 +26,7 @@ impl std::fmt::Display for Error { Error::Io(e) => write!(f, "IO error: {}", e), Error::Json(e) => write!(f, "JSON error: {}", e), Error::Noematic(e) => write!(f, "{}", e), + Error::MissingHomeDir => write!(f, "Missing home directory"), Error::UnsupportedVersion => write!(f, "Unsupported version"), Error::UnsupportedLength => write!(f, "Unsupported length"), } @@ -93,11 +96,22 @@ fn write_response(writer: &mut impl Write, response: Response) -> Result<(), Err Ok(()) } +fn get_project_dirs() -> Result { + ProjectDirs::from("com.github", "henrytill", "noematic").ok_or(Error::MissingHomeDir) +} + fn main() -> Result<(), Error> { let mut reader = BufReader::new(io::stdin()); let mut writer = BufWriter::new(io::stdout()); - let mut context = Context::new()?; + let db_path = { + let project_dirs: ProjectDirs = get_project_dirs()?; + let db_dir = project_dirs.data_dir(); + std::fs::create_dir_all(&db_dir)?; + db_dir.join("db.sqlite3") + }; + + let mut context = Context::new(db_path)?; while let Some(message) = read(&mut reader)? { let json: Value = serde_json::from_slice(&message)?;