sdk

Radroots SDK and bindings
git clone https://radroots.dev/git/sdk.git
Log | Files | Refs | README

commit da9525d37943bb014084885d3259de473e79e7f3
parent 3491f2beee0f055f24aa0fd7663fa57b2f3f6695
Author: triesap <tyson@radroots.org>
Date:   Wed, 15 Jul 2026 02:11:31 +0000

sqlite: align SDK bundled runtime

- update SDK SQLx usage to 0.9 with sqlite-bundled features
- patch libsqlite3-sys to the shared SQLite 3.53.3 source crate
- make private-store query helpers satisfy SQLx 0.9 safe SQL bounds
- refresh the SDK lockfile against the new runtime dependency floor

Diffstat:
MCargo.lock | 98++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
MCargo.toml | 5++++-
Mcrates/sdk/Cargo.toml | 2+-
Mcrates/sdk/src/private_store.rs | 4++--
Mcrates/sdk/tests/unit/private_store_tests.rs | 2+-
5 files changed, 70 insertions(+), 41 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock @@ -662,9 +662,9 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be" dependencies = [ "futures-core", "futures-sink", @@ -678,6 +678,12 @@ 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 = "form_urlencoded" version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -863,9 +869,18 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.2.0", ] [[package]] @@ -885,20 +900,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" -dependencies = [ - "hashbrown 0.14.5", -] - -[[package]] -name = "hashlink" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "824e001ac4f3012dd16a264bec811403a67ca9deb6c102fc5049b32c4574b35f" dependencies = [ - "hashbrown 0.15.5", + "hashbrown 0.16.1", ] [[package]] @@ -1256,9 +1262,7 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libsqlite3-sys" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +version = "0.37.0" dependencies = [ "cc", "pkg-config", @@ -2405,17 +2409,27 @@ dependencies = [ ] [[package]] +name = "rsqlite-vfs" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51c9ae4df8a7fba42103df5c621fa3c37eccf3a3c650879e90fc48b11cc192c" +dependencies = [ + "hashbrown 0.16.1", + "thiserror 2.0.18", +] + +[[package]] name = "rusqlite" -version = "0.32.1" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +checksum = "a0d2b0146dd9661bf67bb107c0bb2a55064d556eeb3fc314151b957f313bcd4e" dependencies = [ "bitflags", "fallible-iterator", "fallible-streaming-iterator", - "hashlink 0.9.1", "libsqlite3-sys", "smallvec", + "sqlite-wasm-rs", ] [[package]] @@ -2738,10 +2752,22 @@ dependencies = [ ] [[package]] +name = "sqlite-wasm-rs" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc3efc0da82635d7e1ced0053bbbfa8c7ab9645d0bf36ceb4f7127bb85315d75" +dependencies = [ + "cc", + "js-sys", + "rsqlite-vfs", + "wasm-bindgen", +] + +[[package]] name = "sqlx" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +checksum = "378620ccc25c62c89d8be1c819e76a88d59bdcc3304733330788948e619bfd71" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2750,12 +2776,13 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +checksum = "05b44e85bf579a8eeb4ceaa77a3a523baf2bf0e9bac7e40f405d537b5d2d5ccb" dependencies = [ "base64 0.22.1", "bytes", + "cfg-if", "crc", "crossbeam-queue", "either", @@ -2764,12 +2791,11 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.5", - "hashlink 0.10.0", + "hashbrown 0.16.1", + "hashlink 0.11.1", "indexmap", "log", "memchr", - "once_cell", "percent-encoding", "serde", "sha2", @@ -2783,9 +2809,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +checksum = "bd2b84f2bc39a5705ef27ec785a11c934a41bbd4a24941e257927cddc26b60bf" dependencies = [ "proc-macro2", "quote", @@ -2796,15 +2822,15 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +checksum = "fb8d96de5fdc85a5c4ec813432b523ec637e80ba98f046555f75f7908ddac7c3" dependencies = [ + "cfg-if", "dotenvy", "either", "heck", "hex", - "once_cell", "proc-macro2", "quote", "serde", @@ -2819,12 +2845,13 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +checksum = "488e99c397a62007e4229aec669a179816339afc6d2620ca6fa420dbee2e982c" dependencies = [ "atoi", "flume", + "form_urlencoded", "futures-channel", "futures-core", "futures-executor", @@ -2834,7 +2861,6 @@ dependencies = [ "log", "percent-encoding", "serde", - "serde_urlencoded", "sqlx-core", "thiserror 2.0.18", "tracing", diff --git a/Cargo.toml b/Cargo.toml @@ -77,10 +77,13 @@ serde = { version = "1", default-features = false, features = [ serde_json = { version = "1", default-features = false, features = ["alloc"] } serde-wasm-bindgen = { version = "0.6" } sha2 = { version = "0.10", default-features = false } -sqlx = { version = "0.8.6", default-features = false } +sqlx = { version = "0.9.0", default-features = false } tempfile = { version = "3" } tokio = { version = "1" } tokio-tungstenite = "0.26.2" uuid = { version = "1.22.0", features = ["v4", "v7"] } wasm-bindgen = { version = "0.2" } wasm-bindgen-test = { version = "0.3" } + +[patch.crates-io] +libsqlite3-sys = { path = "../lib/crates/libsqlite3_sys_3_53_3" } diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml @@ -163,7 +163,7 @@ serde_json = { workspace = true, optional = true, default-features = false, feat sha2 = { workspace = true, optional = true } sqlx = { workspace = true, optional = true, default-features = false, features = [ "runtime-tokio", - "sqlite", + "sqlite-bundled", ] } tokio = { workspace = true, optional = true, features = ["macros", "rt", "sync", "time"] } uuid = { workspace = true, optional = true } diff --git a/crates/sdk/src/private_store.rs b/crates/sdk/src/private_store.rs @@ -272,7 +272,7 @@ async fn ensure_farm_location_label_column(pool: &SqlitePool) -> Result<(), Radr Ok(()) } -async fn query_i64(pool: &SqlitePool, sql: &str) -> Result<i64, RadrootsSdkError> { +async fn query_i64(pool: &SqlitePool, sql: &'static str) -> Result<i64, RadrootsSdkError> { let row = sqlx::query(sql) .fetch_one(pool) .await @@ -280,7 +280,7 @@ async fn query_i64(pool: &SqlitePool, sql: &str) -> Result<i64, RadrootsSdkError row.try_get(0).map_err(private_store_error) } -async fn query_string(pool: &SqlitePool, sql: &str) -> Result<String, RadrootsSdkError> { +async fn query_string(pool: &SqlitePool, sql: &'static str) -> Result<String, RadrootsSdkError> { let row = sqlx::query(sql) .fetch_one(pool) .await diff --git a/crates/sdk/tests/unit/private_store_tests.rs b/crates/sdk/tests/unit/private_store_tests.rs @@ -72,7 +72,7 @@ async fn private_farm_location_row_decode_reports_each_missing_column() { .collect::<Vec<_>>() .join(", "); let sql = format!("SELECT {select}"); - let row = sqlx::query(sql.as_str()) + let row = sqlx::query(sqlx::AssertSqlSafe(sql)) .fetch_one(store.pool()) .await .expect("row");