Просмотр исходного кода

app: replaced sled-overlay with kvdb-overlay

x 1 день назад
Родитель
Сommit
6e35c0d670

+ 156 - 106
bin/app/Cargo.lock

@@ -1237,6 +1237,12 @@ version = "1.12.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
 
+[[package]]
+name = "byteview"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d74937895e761d5984206f82ca8ff7725d0fd8021921011921894b41ab1b9f7"
+
 [[package]]
 name = "camino"
 version = "1.2.4"
@@ -1492,6 +1498,12 @@ dependencies = [
  "memchr",
 ]
 
+[[package]]
+name = "compare"
+version = "0.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea0095f6103c2a8b44acd6fd15960c801dafebf02e21940360833e0673f48ba7"
+
 [[package]]
 name = "compression-codecs"
 version = "0.4.38"
@@ -1703,6 +1715,16 @@ dependencies = [
  "crossbeam-utils",
 ]
 
+[[package]]
+name = "crossbeam-skiplist"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
 [[package]]
 name = "crossbeam-utils"
 version = "0.8.22"
@@ -1858,11 +1880,12 @@ dependencies = [
  "halo2_gadgets",
  "halo2_proofs",
  "httparse",
+ "kvdb-overlay",
  "libc",
  "monero",
  "nu-ansi-term",
  "num-bigint",
- "parking_lot 0.12.5",
+ "parking_lot",
  "pin-project-lite",
  "primitive-types",
  "quinn-smol",
@@ -1871,7 +1894,6 @@ dependencies = [
  "semver",
  "serde",
  "sha2 0.11.0",
- "sled-overlay",
  "smol",
  "socket2",
  "structopt",
@@ -1924,10 +1946,11 @@ dependencies = [
  "glam",
  "image",
  "indoc",
+ "kvdb-overlay",
  "miniquad",
  "ndk-context",
  "open",
- "parking_lot 0.12.5",
+ "parking_lot",
  "parley",
  "peniko",
  "qoi",
@@ -1936,7 +1959,6 @@ dependencies = [
  "regex",
  "rodio",
  "semver",
- "sled-overlay",
  "smol",
  "swash",
  "thiserror 2.0.18",
@@ -1984,6 +2006,7 @@ dependencies = [
  "darkfi-serial",
  "halo2_gadgets",
  "hashbrown 0.17.1",
+ "kvdb-overlay",
  "lazy_static",
  "num",
  "num-bigint",
@@ -1992,7 +2015,6 @@ dependencies = [
  "rand 0.8.7",
  "rand_core 0.6.4",
  "sha2 0.11.0",
- "sled-overlay",
  "subtle",
  "thiserror 2.0.18",
 ]
@@ -2006,10 +2028,10 @@ dependencies = [
  "bridgetree",
  "darkfi-derive",
  "futures-lite",
+ "kvdb-overlay",
  "num-bigint",
  "pasta_curves",
  "semver",
- "sled-overlay",
  "url",
 ]
 
@@ -2078,6 +2100,7 @@ dependencies = [
  "easy-parallel",
  "futures",
  "futures-rustls",
+ "kvdb-overlay",
  "libc",
  "rand 0.8.7",
  "rustls-pemfile",
@@ -2085,7 +2108,6 @@ dependencies = [
  "serde",
  "signal-hook",
  "signal-hook-async-std",
- "sled-overlay",
  "smol",
  "structopt",
  "structopt-toml",
@@ -2210,7 +2232,21 @@ dependencies = [
  "hashbrown 0.14.5",
  "lock_api",
  "once_cell",
- "parking_lot_core 0.9.12",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "dashmap"
+version = "6.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+ "hashbrown 0.14.5",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core",
 ]
 
 [[package]]
@@ -2494,9 +2530,11 @@ dependencies = [
  "darkfi_money_contract",
  "easy-parallel",
  "futures",
+ "kvdb-overlay",
  "lazy_static",
  "libc",
  "linenoise-rs",
+ "log",
  "num-bigint",
  "prettytable-rs",
  "rand 0.8.7",
@@ -2504,7 +2542,6 @@ dependencies = [
  "serde",
  "signal-hook",
  "signal-hook-async-std",
- "sled-overlay",
  "smol",
  "structopt",
  "structopt-toml",
@@ -2980,6 +3017,23 @@ dependencies = [
  "static_assertions",
 ]
 
+[[package]]
+name = "fjall"
+version = "3.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5427b70d8592043024955a4a40b5cf44af323fdad7c1f62848a01ec7806709e"
+dependencies = [
+ "byteorder-lite",
+ "byteview",
+ "dashmap 6.2.1",
+ "flume",
+ "log",
+ "lsm-tree",
+ "lz4_flex",
+ "tempfile",
+ "xxhash-rust",
+]
+
 [[package]]
 name = "flate2"
 version = "1.1.9"
@@ -3041,6 +3095,15 @@ version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "749cff877dc1af878a0b31a41dd221a753634401ea0ef2f87b62d3171522485a"
 
+[[package]]
+name = "flume"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e139bc46ca777eb5efaf62df0ab8cc5fd400866427e56c68b22e414e53bd3be"
+dependencies = [
+ "spin",
+]
+
 [[package]]
 name = "fnv"
 version = "1.0.7"
@@ -3123,16 +3186,6 @@ dependencies = [
  "walkdir",
 ]
 
-[[package]]
-name = "fs2"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
-dependencies = [
- "libc",
- "winapi",
-]
-
 [[package]]
 name = "fs4"
 version = "0.13.1"
@@ -3188,13 +3241,13 @@ dependencies = [
  "easy-parallel",
  "equix",
  "futures",
+ "kvdb-overlay",
  "num-bigint",
  "rand 0.8.7",
  "serde",
  "sha2 0.11.0",
  "signal-hook",
  "signal-hook-async-std",
- "sled-overlay",
  "smol",
  "structopt",
  "structopt-toml",
@@ -3324,15 +3377,6 @@ dependencies = [
  "slab",
 ]
 
-[[package]]
-name = "fxhash"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
-dependencies = [
- "byteorder",
-]
-
 [[package]]
 name = "genawaiter"
 version = "0.99.1"
@@ -4134,15 +4178,6 @@ dependencies = [
  "hybrid-array",
 ]
 
-[[package]]
-name = "instant"
-version = "0.1.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
-dependencies = [
- "cfg-if",
-]
-
 [[package]]
 name = "interpolate_name"
 version = "0.2.4"
@@ -4154,6 +4189,15 @@ dependencies = [
  "syn 2.0.118",
 ]
 
+[[package]]
+name = "interval-heap"
+version = "0.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11274e5e8e89b8607cfedc2910b6626e998779b48a019151c7604d0adcb86ac6"
+dependencies = [
+ "compare",
+]
+
 [[package]]
 name = "intl-memoizer"
 version = "0.5.3"
@@ -4435,6 +4479,16 @@ dependencies = [
  "log",
 ]
 
+[[package]]
+name = "kvdb-overlay"
+version = "0.1.0"
+source = "git+https://git.dark.fi/darkrenaissance/kvdb-overlay#52ff2bf06e800e098b32089acff7e2fa1dcfa30d"
+dependencies = [
+ "fjall",
+ "tempfile",
+ "thiserror 2.0.18",
+]
+
 [[package]]
 name = "lazy_static"
 version = "1.5.0"
@@ -4652,11 +4706,36 @@ version = "0.1.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154"
 
+[[package]]
+name = "lsm-tree"
+version = "3.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03c4da84fa3a8638fb26d4432bfeb69a1b560905ee2980134d8993e2cfa0dbf3"
+dependencies = [
+ "byteorder-lite",
+ "byteview",
+ "crossbeam-skiplist",
+ "enum_dispatch",
+ "interval-heap",
+ "log",
+ "lz4_flex",
+ "quick_cache",
+ "rustc-hash 2.1.3",
+ "self_cell",
+ "sfa",
+ "tempfile",
+ "varint-rs",
+ "xxhash-rust",
+]
+
 [[package]]
 name = "lz4_flex"
 version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e"
+dependencies = [
+ "twox-hash",
+]
 
 [[package]]
 name = "mach2"
@@ -5403,17 +5482,6 @@ version = "2.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
 
-[[package]]
-name = "parking_lot"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core 0.8.6",
-]
-
 [[package]]
 name = "parking_lot"
 version = "0.12.5"
@@ -5421,21 +5489,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
 dependencies = [
  "lock_api",
- "parking_lot_core 0.9.12",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
-dependencies = [
- "cfg-if",
- "instant",
- "libc",
- "redox_syscall 0.2.16",
- "smallvec",
- "winapi",
+ "parking_lot_core",
 ]
 
 [[package]]
@@ -5446,7 +5500,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
 dependencies = [
  "cfg-if",
  "libc",
- "redox_syscall 0.5.18",
+ "redox_syscall",
  "smallvec",
  "windows-link",
 ]
@@ -5749,7 +5803,7 @@ dependencies = [
  "atomic 0.5.3",
  "crossbeam-queue",
  "futures",
- "parking_lot 0.12.5",
+ "parking_lot",
  "pin-project",
  "static_assertions",
  "thiserror 1.0.69",
@@ -6031,6 +6085,16 @@ version = "2.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
 
+[[package]]
+name = "quick_cache"
+version = "0.6.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9c6658afe513a3b484e3abfdaa0d03ef3c0bbf017542c178dd55f94eb3051f9"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.16.1",
+]
+
 [[package]]
 name = "quinn-proto-smol"
 version = "0.12.0"
@@ -6220,7 +6284,7 @@ dependencies = [
  "cfg-if",
  "libc",
  "nasm-rs",
- "parking_lot 0.12.5",
+ "parking_lot",
  "paste",
  "raw-cpuid",
  "static_assertions",
@@ -6358,15 +6422,6 @@ version = "0.5.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430"
 
-[[package]]
-name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags 1.3.2",
-]
-
 [[package]]
 name = "redox_syscall"
 version = "0.5.18"
@@ -6954,6 +7009,17 @@ dependencies = [
  "syn 2.0.118",
 ]
 
+[[package]]
+name = "sfa"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1296838937cab56cd6c4eeeb8718ec777383700c33f060e2869867bd01d1175"
+dependencies = [
+ "byteorder-lite",
+ "log",
+ "xxhash-rust",
+]
+
 [[package]]
 name = "sha1"
 version = "0.10.7"
@@ -7215,31 +7281,6 @@ version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
 
-[[package]]
-name = "sled"
-version = "0.34.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f96b4737c2ce5987354855aed3797279def4ebf734436c6aa4552cf8e169935"
-dependencies = [
- "crc32fast",
- "crossbeam-epoch",
- "crossbeam-utils",
- "fs2",
- "fxhash",
- "libc",
- "log",
- "parking_lot 0.11.2",
-]
-
-[[package]]
-name = "sled-overlay"
-version = "0.1.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "719b8db2a2b2798bc015c45613040c4dbc552dca6c605d8796248ba587afa7fe"
-dependencies = [
- "sled",
-]
-
 [[package]]
 name = "slotmap"
 version = "1.1.1"
@@ -7307,6 +7348,9 @@ name = "spin"
 version = "0.9.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+dependencies = [
+ "lock_api",
+]
 
 [[package]]
 name = "spki"
@@ -9389,7 +9433,7 @@ dependencies = [
  "num-bigint",
  "num-traits",
  "pack1",
- "parking_lot 0.12.5",
+ "parking_lot",
  "pastey 0.2.3",
  "polling",
  "rand 0.9.5",
@@ -9465,7 +9509,7 @@ checksum = "ea1abf8f42cf5c40f9777982c8dfda776242397250eb48f99d524c383b1b641a"
 dependencies = [
  "bindgen",
  "env_logger",
- "parking_lot 0.12.5",
+ "parking_lot",
  "tracing",
  "tracing-appender",
  "tracing-subscriber",
@@ -9517,7 +9561,7 @@ dependencies = [
  "bindgen",
  "env_logger",
  "genawaiter",
- "parking_lot 0.12.5",
+ "parking_lot",
  "tracing",
  "tracing-appender",
  "tracing-subscriber",
@@ -9792,6 +9836,12 @@ version = "1.12.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0"
 
+[[package]]
+name = "varint-rs"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa6c38708f6257f1ec2ca7e5a11f9bbf58a27d7060078b6b333624968183d96"
+
 [[package]]
 name = "vcpkg"
 version = "0.2.15"
@@ -10626,7 +10676,7 @@ dependencies = [
  "asynchronous-codec",
  "bytes",
  "crossbeam-queue",
- "dashmap",
+ "dashmap 5.5.3",
  "futures-channel",
  "futures-io",
  "futures-task",
@@ -10634,7 +10684,7 @@ dependencies = [
  "log",
  "num-traits",
  "once_cell",
- "parking_lot 0.12.5",
+ "parking_lot",
  "rand 0.8.7",
  "regex",
  "thiserror 1.0.69",

+ 1 - 1
bin/app/Cargo.toml

@@ -40,7 +40,7 @@ futures = "0.3.32"
 async-recursion = "1.1.1"
 colored = "3.1.1"
 #rustpython-vm = "0.3.1"
-sled-overlay = "0.1.20"
+kvdb-overlay = {git = "https://git.dark.fi/darkrenaissance/kvdb-overlay", version = "0.1.0"}
 url = "2.5.8"
 semver = "1.0.28"
 chrono = "0.4.44"

+ 4 - 4
bin/app/src/app/mod.rs

@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use sled_overlay::sled;
+use kvdb_overlay::Database;
 use smol::Task;
 use std::sync::{
     atomic::{AtomicBool, Ordering},
@@ -92,12 +92,12 @@ impl App {
 
     /// Does not require miniquad to be init. Created the scene graph tree / schema and all
     /// the objects.
-    pub async fn setup(&self, db: sled::Db) -> Result<Option<i32>, Error> {
+    pub async fn setup(&self, db: Database) -> Result<Option<i32>, Error> {
         t!("App::setup()");
 
         let setting_root = SceneNode::new("setting", SceneNodeType::SettingRoot);
         let setting_root = setting_root.setup_null();
-        let settings_tree = db.open_tree("settings").unwrap();
+        let settings_tree = db.open_tree_default("settings").unwrap();
 
         let flags_tree = db.open_tree("app_flags").unwrap();
         let is_first_time = !flags_tree.contains_key(IS_FIRST_TIME_KEY).unwrap();
@@ -110,7 +110,7 @@ impl App {
         /*
         let settings = Arc::new(PluginSettings {
             setting_root: setting_root.clone(),
-            sled_tree: settings_tree,
+            kvdb_tree: settings_tree,
         });
         */
 

+ 7 - 7
bin/app/src/app/schema/chat.rs

@@ -19,7 +19,7 @@
 use darkfi_serial::{Decodable, Encodable};
 #[cfg(feature = "enable-plugin-darkirc")]
 use irc2::Privmsg;
-use sled_overlay::sled;
+use kvdb_overlay::{Database, Tree};
 use std::{sync::Arc, time::UNIX_EPOCH};
 
 #[cfg(feature = "enable-plugin-darkirc")]
@@ -193,7 +193,7 @@ pub async fn make(
     ex: &ExecutorPtr,
     content: SceneNodePtr,
     channel: &str,
-    db: &sled::Db,
+    db: &Database,
     i18n_fish: &I18nBabelFish,
     emoji_meshes: emoji_picker::EmojiMeshesPtr,
     redraw: RedrawTrigger,
@@ -616,11 +616,11 @@ pub async fn make(
     }
 
     let tree_name = channel.to_string() + "__chat_tree";
-    let chat_tree = db.open_tree(tree_name.as_bytes()).unwrap();
+    let chat_tree = db.open_tree_default(&tree_name).unwrap();
     //if chat_tree.is_empty() {
     //    populate_tree(&chat_tree);
     //}
-    debug!(target: "app", "Loaded {channel} history: {} lines", chat_tree.len());
+    debug!(target: "app", "Loaded {channel} history: {} lines", chat_tree.len().unwrap());
     let chatview_node = node
         .setup(|me| {
             ChatView::new(
@@ -1637,7 +1637,7 @@ pub async fn make(
 
 // Just for testing
 #[allow(dead_code)]
-pub(super) fn populate_tree(tree: &sled::Tree) {
+pub(super) fn populate_tree(tree: &Tree) {
     use chrono::{NaiveDate, NaiveDateTime};
     let chat_txt = include_str!("../../../data/chat.txt");
     for line in chat_txt.lines() {
@@ -1664,8 +1664,8 @@ pub(super) fn populate_tree(tree: &sled::Tree) {
         let mut val = vec![];
         msg.encode(&mut val).unwrap();
 
-        tree.insert(&key, val).unwrap();
+        tree.insert(&key, &val).unwrap();
     }
     // O(n)
-    debug!(target: "app::schema", "populated db with {} lines", tree.len());
+    debug!(target: "app::schema", "populated db with {} lines", tree.len().unwrap());
 }

+ 4 - 5
bin/app/src/app/schema/menu/channel.rs

@@ -18,8 +18,8 @@
 
 use bs58;
 use darkfi_serial::{async_trait, deserialize, Encodable, SerialDecodable, SerialEncodable};
+use kvdb_overlay::{Database, Tree};
 use rand::{rngs::OsRng, Rng};
-use sled_overlay::sled;
 use ui_consts::*;
 
 macro_rules! d { ($($arg:tt)*) => { debug!(target: "app::channel", $($arg)*); } }
@@ -168,8 +168,8 @@ pub async fn make(
     window_scale: PropertyFloat32,
     contact_is_visible: PropertyBool,
     channel_is_visible: PropertyBool,
-    channels_tree: sled::Tree,
-    db: &sled::Db,
+    channels_tree: Tree,
+    db: &Database,
     emoji_meshes: EmojiMeshesPtr,
 ) -> SceneNodePtr {
     let mut cc = expr::Compiler::new();
@@ -1589,8 +1589,7 @@ pub async fn make(
 
             let key = name;
 
-            channels_tree2.insert(key, val).unwrap();
-            let _ = channels_tree2.flush_async().await;
+            channels_tree2.insert(key.as_bytes(), &val).unwrap();
 
             let atom = &mut redraw2.make_guard(gfxtag!("add_channel"));
             menu_prop2.push_str(atom, Role::App, &channel_name).unwrap();

+ 4 - 5
bin/app/src/app/schema/menu/contact.rs

@@ -18,7 +18,7 @@
 
 use bs58;
 use darkfi_serial::{async_trait, deserialize, Encodable, SerialDecodable, SerialEncodable};
-use sled_overlay::sled;
+use kvdb_overlay::{Database, Tree};
 use ui_consts::*;
 
 macro_rules! d { ($($arg:tt)*) => { debug!(target: "app::contact", $($arg)*); } }
@@ -168,8 +168,8 @@ pub async fn make(
     window_scale: PropertyFloat32,
     contact_is_visible: PropertyBool,
     channel_is_visible: PropertyBool,
-    contacts_tree: sled::Tree,
-    db: &sled::Db,
+    contacts_tree: Tree,
+    db: &Database,
     emoji_meshes: EmojiMeshesPtr,
 ) -> SceneNodePtr {
     let mut cc = expr::Compiler::new();
@@ -1500,8 +1500,7 @@ pub async fn make(
             let contact = Contact { name: name.clone(), public };
             let mut val = vec![];
             contact.encode(&mut val).unwrap();
-            contacts_tree2.insert(name.as_str(), val).unwrap();
-            let _ = contacts_tree2.flush_async().await;
+            contacts_tree2.insert(name.as_bytes(), &val).unwrap();
 
             let contact_name = format!("@{}", name);
             let atom = &mut redraw2.make_guard(gfxtag!("add_contact"));

+ 4 - 4
bin/app/src/app/schema/menu/mod.rs

@@ -17,7 +17,7 @@
  */
 
 use darkfi_serial::deserialize;
-use sled_overlay::sled;
+use kvdb_overlay::{Database, Tree};
 use std::io::Write;
 use ui_consts::*;
 
@@ -113,9 +113,9 @@ pub async fn make(
     app: &App,
     content: SceneNodePtr,
     i18n_fish: &I18nBabelFish,
-    channels_tree: sled::Tree,
-    contacts_tree: sled::Tree,
-    db: &sled::Db,
+    channels_tree: Tree,
+    contacts_tree: Tree,
+    db: &Database,
     emoji_meshes: EmojiMeshesPtr,
 ) {
     let window_scale = PropertyFloat32::wrap(

+ 10 - 10
bin/app/src/app/schema/mod.rs

@@ -16,11 +16,12 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
+use std::{fs::File, io::Write};
+
 use darkfi::system::msleep;
 use darkfi_serial::{deserialize, Encodable};
 use indoc::indoc;
-use sled_overlay::sled;
-use std::io::Write;
+use kvdb_overlay::Database;
 
 use crate::{
     app::{
@@ -204,7 +205,7 @@ pub fn write_joined_channels(items: &[String]) {
     let _ = std::fs::write(get_joined_channels_filename(), items.join("\n"));
 }
 
-pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db: sled::Db) {
+pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db: Database) {
     let mut cc = Compiler::new();
     cc.add_const_f32("NETSTATUS_ICON_SIZE", NETSTATUS_ICON_SIZE);
     cc.add_const_f32("SETTINGS_ICON_SIZE", SETTINGS_ICON_SIZE);
@@ -811,18 +812,17 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
         }
     });
 
-    let channels_tree = db.open_tree("channels").expect("cannot open channels tree");
-    let contacts_tree = db.open_tree("contacts").expect("cannot open contacts tree");
+    let channels_tree = db.open_tree_default("channels").expect("cannot open channels tree");
+    let contacts_tree = db.open_tree_default("contacts").expect("cannot open contacts tree");
 
     // Initialize default channels if tree is empty
-    if channels_tree.is_empty() {
+    if channels_tree.is_empty().unwrap() {
         for channel_name in DEFAULT_CHANNELS {
             let channel = Channel { name: channel_name.to_string(), secret: None };
             let mut val = vec![];
             channel.encode(&mut val).unwrap();
-            channels_tree.insert(channel_name, val).unwrap();
+            channels_tree.insert(channel_name.to_string().as_bytes(), &val).unwrap();
         }
-        let _ = channels_tree.flush_async().await;
     }
 
     // Seed the joined-channels file with defaults on first run.
@@ -844,8 +844,8 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish, db
     for name in read_joined_channels() {
         let bare = if name.starts_with('#') || name.starts_with('@') { &name[1..] } else { &name };
         let in_tree = match name.chars().next() {
-            Some('#') => channels_tree.contains_key(bare).unwrap_or(false),
-            Some('@') => contacts_tree.contains_key(bare).unwrap_or(false),
+            Some('#') => channels_tree.contains_key(bare.to_string().as_bytes()).unwrap_or(false),
+            Some('@') => contacts_tree.contains_key(bare.to_string().as_bytes()).unwrap_or(false),
             _ => false,
         };
         if !in_tree {

+ 1 - 3
bin/app/src/app/schema/test.rs

@@ -18,8 +18,6 @@
 
 #![allow(unused_imports, unused_variables, dead_code)]
 
-use sled_overlay::sled;
-
 use super::chat::populate_tree;
 use crate::{
     app::{
@@ -372,7 +370,7 @@ pub async fn make(app: &App, window: SceneNodePtr, i18n_fish: &I18nBabelFish) {
         prop.set_f32(atom, Role::App, 3, 1.).unwrap();
     }
 
-    let db = sled::open(get_chatdb_path()).expect("cannot open sleddb");
+    let db = kvdb_overlay::Database::open_default(&get_chatdb_path()).expect("cannot open kvdb");
     let chat_tree = db.open_tree(b"chat").unwrap();
     if chat_tree.is_empty() {
         populate_tree(&chat_tree);

+ 5 - 7
bin/app/src/error.rs

@@ -16,8 +16,6 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use sled_overlay::sled;
-
 pub type Result<T> = std::result::Result<T, Error>;
 
 #[repr(u8)]
@@ -116,8 +114,8 @@ pub enum Error {
     #[error("Unexpected token found")]
     UnexpectedToken = 38,
 
-    #[error("Sled database error")]
-    SledDbErr = 39,
+    #[error("Key-value database error")]
+    KvdbErr = 39,
 
     #[error("Service failed")]
     ServiceFailed = 40,
@@ -144,8 +142,8 @@ pub enum Error {
     ContactNotFound = 47,
 }
 
-impl From<sled::Error> for Error {
-    fn from(_: sled::Error) -> Error {
-        Error::SledDbErr
+impl From<kvdb_overlay::Error> for Error {
+    fn from(_: kvdb_overlay::Error) -> Error {
+        Error::KvdbErr
     }
 }

+ 2 - 2
bin/app/src/logger.rs

@@ -36,7 +36,7 @@ use darkfi::util::logger::{EventFormatter, Level, TargetFilter};
 const LOGFILE_MAXSIZE: usize = 5_000_000;
 
 static MUTED_TARGETS: &[&'static str] = &[
-    "sled",
+    "fjall",
     "rustls",
     "async_io",
     "polling",
@@ -120,7 +120,7 @@ pub fn setup_logging() -> Option<WorkerGuard> {
             .with_filter(
                 TargetFilter::default()
                     .ignore_targets([
-                        "sled",
+                        "fjall",
                         "rustls",
                         "async_io",
                         "polling",

+ 4 - 4
bin/app/src/main.rs

@@ -67,10 +67,10 @@ use {
     // Local imports
     app::schema::get_main_db_path,
     gfx::Renderer,
+    // Global imports
+    kvdb_overlay::Database,
     prop::{PropertyBool, PropertyStr, Role},
     scene::Slot,
-    // Global imports
-    sled_overlay::sled,
     std::io::Cursor,
     ui::chatview,
     url::Url,
@@ -156,7 +156,7 @@ impl God {
         std::env::set_current_dir(basename).unwrap();
 
         let db_path = get_main_db_path();
-        let db = sled::open(&db_path).expect("Sled DB failed to open");
+        let db = Database::open_default(&db_path).expect("KVDB failed to open");
 
         let bg_ex = Arc::new(smol::Executor::new());
         let fg_ex = Arc::new(smol::Executor::new());
@@ -277,7 +277,7 @@ async fn load_plugins(
     sg_root: SceneNodePtr,
     redraw: crate::ui::RedrawTrigger,
     cv: Arc<CondVar>,
-    db: sled::Db,
+    db: Database,
 ) {
     let plugin = SceneNode::new("plugin", SceneNodeType::PluginRoot);
     let plugin = plugin.setup_null();

+ 14 - 15
bin/app/src/plugin/darkirc.rs

@@ -48,8 +48,8 @@ use irc2::{
     irc::{server::MAX_NICK_LEN, IrcChannel, IrcContact},
     pad, unpad, Privmsg,
 };
+use kvdb_overlay::{Database, Tree};
 use parking_lot::Mutex as SyncMutex;
-use sled_overlay::sled;
 
 use crate::{
     app::schema::{
@@ -174,9 +174,9 @@ pub struct DarkIrc {
     nick: PropertyStr,
     pub channels: RwLock<HashMap<String, IrcChannel>>,
     pub contacts: RwLock<HashMap<String, IrcContact>>,
-    channels_tree: sled::Tree,
-    contacts_tree: sled::Tree,
-    nick_tree: sled::Tree,
+    channels_tree: Tree,
+    contacts_tree: Tree,
+    nick_tree: Tree,
     dm_secret: SecretKey,
     settings: PluginSettings,
     ex: ExecutorPtr,
@@ -187,7 +187,7 @@ impl DarkIrc {
         node: SceneNodeWeak,
         sg_root: SceneNodePtr,
         ex: ExecutorPtr,
-        db: sled::Db,
+        db: Database,
     ) -> Result<Pimpl> {
         let node_ref = &node.upgrade().unwrap();
         let nick = PropertyStr::wrap(node_ref, Role::Internal, "nick", 0).unwrap();
@@ -197,17 +197,17 @@ impl DarkIrc {
 
         i!("Starting DarkIRC backend");
 
-        let setting_tree = db.open_tree("darkirc_settings")?;
+        let setting_tree = evgr_db.open_tree_default("settings")?;
         i!("Opened darkirc_settings tree from unified db");
 
         // Use the unified db for reading channels (UI stores channels there)
-        let channels_tree = db.open_tree("channels")?;
+        let channels_tree = db.open_tree_default("channels")?;
         i!("Opened channels tree from unified db");
 
-        let contacts_tree = db.open_tree("contacts")?;
+        let contacts_tree = db.open_tree_default("contacts")?;
         i!("Opened contacts tree from unified db");
 
-        let nick_tree = db.open_tree("nick")?;
+        let nick_tree = db.open_tree_default("nick")?;
         i!("Opened nick tree from unified db");
 
         let dm_secret = Self::load_or_create_dm_identity(&db);
@@ -223,7 +223,7 @@ impl DarkIrc {
             .unwrap();
         i!("DM identity public key (share with contacts): {dm_public_b58}");
 
-        let settings = PluginSettings { setting_root, sled_tree: setting_tree };
+        let settings = PluginSettings { setting_root, kvdb_tree: setting_tree };
 
         let mut p2p_settings: NetSettings = Default::default();
         p2p_settings.magic_bytes = MagicBytes([251, 229, 199, 181]);
@@ -771,17 +771,16 @@ impl DarkIrc {
     }
 
     /// Load (or generate on first run) the single global DM identity key.
-    fn load_or_create_dm_identity(db: &sled::Db) -> SecretKey {
-        let tree = db.open_tree("dm_identity").expect("cannot open dm_identity tree");
+    fn load_or_create_dm_identity(db: &Database) -> SecretKey {
+        let tree = db.open_tree_default("dm_identity").expect("cannot open dm_identity tree");
         if let Ok(Some(stored)) = tree.get(b"secret") {
             if stored.len() == 32 {
-                let arr: [u8; 32] = stored.as_ref().try_into().unwrap();
+                let arr: [u8; 32] = stored.try_into().unwrap();
                 return SecretKey::from_bytes(arr);
             }
         }
         let bytes: [u8; 32] = rand::random();
-        let _ = tree.insert(b"secret", bytes.to_vec());
-        let _ = tree.flush();
+        let _ = tree.insert(b"secret", &bytes);
         SecretKey::from_bytes(bytes)
     }
 

+ 6 - 6
bin/app/src/plugin/fud.rs

@@ -33,7 +33,7 @@ use fud::{
     util::{hash_to_string, FileSelection},
     Fud,
 };
-use sled_overlay::sled;
+use kvdb_overlay::Database;
 use smol::lock::Mutex;
 use std::{
     collections::HashSet,
@@ -145,16 +145,16 @@ impl FudPlugin {
 
         i!("Starting Fud backend");
         let db_path = get_db_path();
-        let db = match sled::open(&db_path) {
+        let db = match Database::open_default(&db_path) {
             Ok(db) => db,
             Err(err) => {
-                e!("Sled database '{}' failed to open: {err}!", db_path.display());
-                return Err(Error::SledDbErr)
+                e!("Kvdb database '{}' failed to open: {err}!", db_path.display());
+                return Err(Error::KvdbErr)
             }
         };
 
-        let setting_tree = db.open_tree("settings")?;
-        let settings = PluginSettings { setting_root, sled_tree: setting_tree };
+        let setting_tree = db.open_tree_default("settings")?;
+        let settings = PluginSettings { setting_root, kvdb_tree: setting_tree };
 
         let mut fud_settings: FudSettings = Default::default();
         fud_settings.base_dir = basedir.to_string_lossy().to_string();

+ 28 - 35
bin/app/src/plugin/mod.rs

@@ -16,7 +16,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use sled_overlay::sled;
+use kvdb_overlay::Tree;
 use std::{array::TryFromSliceError, string::FromUtf8Error, sync::Arc};
 
 #[cfg(feature = "enable-plugin-darkirc")]
@@ -53,7 +53,7 @@ use crate::{
 #[cfg(any(feature = "enable-plugin-darkirc", feature = "enable-plugin-fud"))]
 pub struct PluginSettings {
     pub setting_root: SceneNodePtr,
-    pub sled_tree: sled::Tree,
+    pub kvdb_tree: Tree,
 }
 
 #[cfg(any(feature = "enable-plugin-darkirc", feature = "enable-plugin-fud"))]
@@ -114,7 +114,7 @@ impl PluginSettings {
         }
     }
 
-    // For all settings, copy the value from sled into the setting node's value property
+    // For all settings, copy the value from kvdb into the setting node's value property
     pub fn load_settings(&self) {
         let atom = &mut PropertyAtomicGuard::none();
         for setting_node in self.setting_root.get_children().iter() {
@@ -125,20 +125,18 @@ impl PluginSettings {
             let value = setting_node.get_property("value").clone().unwrap();
             match value.typ {
                 PropertyType::Bool => {
-                    let sled_result = self.sled_tree.get(setting_node.name.as_str());
-                    if let Ok(Some(sled_value)) = sled_result {
+                    let kvdb_result = self.kvdb_tree.get(setting_node.name.as_bytes());
+                    if let Ok(Some(kvdb_value)) = kvdb_result {
                         setting_node
-                            .set_property_bool(atom, Role::User, "value", sled_value[0] != 0)
+                            .set_property_bool(atom, Role::User, "value", kvdb_value[0] != 0)
                             .unwrap();
                     }
                 }
                 PropertyType::Uint32 => {
-                    let sled_result = self.sled_tree.get(setting_node.name.as_str());
-                    if let Ok(Some(sled_value)) = sled_result {
-                        if sled_value.len() == 4 {
-                            let bytes: Result<[u8; 4], TryFromSliceError> =
-                                sled_value.as_ref().try_into();
-                            if let Ok(b) = bytes {
+                    let kvdb_result = self.kvdb_tree.get(setting_node.name.as_bytes());
+                    if let Ok(Some(kvdb_value)) = kvdb_result {
+                        if kvdb_value.len() == 4 {
+                            if let Ok(b) = kvdb_value.try_into() {
                                 setting_node
                                     .set_property_u32(
                                         atom,
@@ -152,12 +150,10 @@ impl PluginSettings {
                     }
                 }
                 PropertyType::Float32 => {
-                    let sled_result = self.sled_tree.get(setting_node.name.as_str());
-                    if let Ok(Some(sled_value)) = sled_result {
-                        if sled_value.len() == 4 {
-                            let bytes: Result<[u8; 4], TryFromSliceError> =
-                                sled_value.as_ref().try_into();
-                            if let Ok(b) = bytes {
+                    let kvdb_result = self.kvdb_tree.get(setting_node.name.as_bytes());
+                    if let Ok(Some(kvdb_value)) = kvdb_result {
+                        if kvdb_value.len() == 4 {
+                            if let Ok(b) = kvdb_value.try_into() {
                                 setting_node
                                     .set_property_f32(
                                         atom,
@@ -171,10 +167,10 @@ impl PluginSettings {
                     }
                 }
                 PropertyType::Str => {
-                    let sled_result = self.sled_tree.get(setting_node.name.as_str());
-                    if let Ok(Some(sled_value)) = sled_result {
+                    let kvdb_result = self.kvdb_tree.get(setting_node.name.as_bytes());
+                    if let Ok(Some(kvdb_value)) = kvdb_result {
                         let string: Result<String, FromUtf8Error> =
-                            String::from_utf8(sled_value.to_vec());
+                            String::from_utf8(kvdb_value.to_vec());
                         if let Ok(s) = string {
                             setting_node.set_property_str(atom, Role::User, "value", s).unwrap();
                         }
@@ -185,7 +181,7 @@ impl PluginSettings {
         }
     }
 
-    // Save all settings to sled
+    // Save all settings to kvdb
     pub fn save_settings(&self) {
         for setting_node in self.setting_root.get_children().iter() {
             if setting_node.typ != SceneNodeType::Setting {
@@ -196,32 +192,29 @@ impl PluginSettings {
             match value.typ {
                 PropertyType::Bool => {
                     let value_bytes = if value.get_bool(0).unwrap() { 1u8 } else { 0u8 };
-                    self.sled_tree
-                        .insert(setting_node.name.as_str(), sled::IVec::from(vec![value_bytes]))
+                    self.kvdb_tree
+                        .insert(setting_node.name.as_bytes(), &vec![value_bytes])
                         .unwrap();
                 }
                 PropertyType::Uint32 => {
-                    self.sled_tree
+                    self.kvdb_tree
                         .insert(
-                            setting_node.name.as_str(),
-                            sled::IVec::from(value.get_u32(0).unwrap().to_le_bytes().as_ref()),
+                            setting_node.name.as_bytes(),
+                            value.get_u32(0).unwrap().to_le_bytes().as_ref(),
                         )
                         .unwrap();
                 }
                 PropertyType::Float32 => {
-                    self.sled_tree
+                    self.kvdb_tree
                         .insert(
-                            setting_node.name.as_str(),
-                            sled::IVec::from(value.get_f32(0).unwrap().to_le_bytes().as_ref()),
+                            setting_node.name.as_bytes(),
+                            value.get_f32(0).unwrap().to_le_bytes().as_ref(),
                         )
                         .unwrap();
                 }
                 PropertyType::Str => {
-                    self.sled_tree
-                        .insert(
-                            setting_node.name.as_str(),
-                            sled::IVec::from(value.get_str(0).unwrap().as_bytes()),
-                        )
+                    self.kvdb_tree
+                        .insert(setting_node.name.as_bytes(), value.get_str(0).unwrap().as_bytes())
                         .unwrap();
                 }
                 _ => {}

+ 4 - 5
bin/app/src/ui/chatview/mod.rs

@@ -23,11 +23,11 @@ use async_trait::async_trait;
 use atomic_float::AtomicF32;
 use darkfi::system::{msleep, CondVar};
 use darkfi_serial::{deserialize, Decodable, Encodable, SerialDecodable, SerialEncodable};
+use kvdb_overlay::Tree;
 use miniquad::{KeyCode, KeyMods, MouseButton, TouchPhase};
 use parking_lot::Mutex as SyncMutex;
 use rand::{rngs::OsRng, Rng};
 use regex::Regex;
-use sled_overlay::sled;
 use std::{
     collections::VecDeque,
     io::Cursor,
@@ -223,7 +223,7 @@ pub struct ChatView {
     redraw: RedrawTrigger,
     sg_root: SceneNodePtr,
 
-    tree: sled::Tree,
+    tree: Tree,
     msgbuf: AsyncMutex<MessageBuffer>,
     dc_key: u64,
 
@@ -290,7 +290,7 @@ pub struct ChatView {
 impl ChatView {
     pub async fn new(
         node: SceneNodeWeak,
-        tree: sled::Tree,
+        tree: Tree,
         window_scale: PropertyFloat32,
         renderer: Renderer,
         redraw: RedrawTrigger,
@@ -719,8 +719,7 @@ impl ChatView {
         let mut val = vec![];
         msg.encode(&mut val).unwrap();
 
-        self.tree.insert(&key, val).unwrap();
-        let _ = self.tree.flush_async().await;
+        self.tree.insert(&key, &val).unwrap();
         true
     }
     #[instrument(target = "ui::chatview")]