From 3fa0c892e02a231e0862ee5333f749f81f5b23e1 Mon Sep 17 00:00:00 2001 From: TudbuT Date: Wed, 4 Jun 2025 10:19:36 +0200 Subject: [PATCH] add load_or_create --- Cargo.toml | 2 +- src/db.rs | 15 +++++++++++++-- src/storage.rs | 21 +++++++++++++++++---- 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 310cdf4..cb9c198 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "microdb" -version = "0.3.5" +version = "0.4.0" edition = "2021" description = "A very small in-program database with cache, disk storage, etc." license = "MIT" diff --git a/src/db.rs b/src/db.rs index 6cdcf38..6f12b3a 100644 --- a/src/db.rs +++ b/src/db.rs @@ -10,9 +10,20 @@ pub struct MicroDB { impl MicroDB { /// Loads a database. Can NOT be used to create one. - pub fn new(data: S, alloc: S, cache_period: u128) -> Result { + pub fn load(data: S, alloc: S, cache_period: u128) -> Result { Ok(Self { - storage: FAlloc::new(data, alloc, cache_period)?, + storage: FAlloc::load(data, alloc, cache_period)?, + }) + } + + pub fn load_or_create( + data: S, + alloc: S, + cache_period: u128, + block_size: usize, + ) -> Result { + Ok(Self { + storage: FAlloc::load_or_create(data, alloc, cache_period, block_size)?, }) } diff --git a/src/storage.rs b/src/storage.rs index f71a8bf..da79d64 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -358,8 +358,21 @@ impl FAlloc { Ok(Self { inner }) } + pub fn load_or_create( + data: S, + alloc: S, + cache_period: u128, + block_size: usize, + ) -> Result { + if fs::exists(alloc.to_string())? { + Self::load(data, alloc, cache_period) + } else { + Self::create(data, alloc, cache_period, block_size) + } + } + /// Loads a database. Can NOT be used to create one. - pub fn new(data: S, alloc: S, cache_period: u128) -> Result { + pub fn load(data: S, alloc: S, cache_period: u128) -> Result { Self::internal_new( File::options() .read(true) @@ -612,18 +625,18 @@ mod test { db.shutdown().unwrap(); } fn load() { - let db = FAlloc::new("test.dat", "test.alloc", 500).unwrap(); + let db = FAlloc::load("test.dat", "test.alloc", 500).unwrap(); assert_eq!(db.get("test").unwrap().unwrap(), vec![40_u8; 400]); db.shutdown().unwrap(); } fn delete_val() { - let db = FAlloc::new("test.dat", "test.alloc", 500).unwrap(); + let db = FAlloc::load("test.dat", "test.alloc", 500).unwrap(); db.set("test", vec![0; 0]).unwrap(); assert!(db.get("test").unwrap().is_none()); db.shutdown().unwrap(); } fn create_new_val() { - let db = FAlloc::new("test.dat", "test.alloc", 500).unwrap(); + let db = FAlloc::load("test.dat", "test.alloc", 500).unwrap(); db.set("test2", vec![40; 200]).unwrap(); assert_eq!(db.get("test2").unwrap().unwrap(), vec![40_u8; 200]); db.sync().unwrap();