From b7da5f50c6f97761f974dda8467d4819e6984323 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sun, 26 Jan 2025 17:12:43 +0100 Subject: world: put cache option --- shared/src/store.rs | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'shared') diff --git a/shared/src/store.rs b/shared/src/store.rs index 548a402..ddcee2c 100644 --- a/shared/src/store.rs +++ b/shared/src/store.rs @@ -37,13 +37,15 @@ pub enum ResourceStore { } impl ResourceStore { pub fn new_env() -> Result { - if var("WEARECHAT_RES_CACHE_USE_REDB").is_ok() { - ResourceStore::new_redb( + if var("WEARECHAT_RES_CACHE_USE_MEMORY").is_ok() { + Ok(Self::new_memory()) + } else if var("WEARECHAT_RES_CACHE_USE_REDB").is_ok() { + Self::new_redb( &xdg::BaseDirectories::with_prefix("wearechat")? .place_cache_file("resources.db")?, ) } else { - ResourceStore::new_filesystem( + Self::new_filesystem( &xdg::BaseDirectories::with_prefix("wearechat")? .create_cache_directory("resources")?, ) @@ -112,19 +114,38 @@ impl ResourceStore { } ResourceStore::Filesystem(root) => { let path = fs_cache_path(&root, key); - let path_temp = path.with_extension("part"); - File::create(&path_temp)?.write_all(value)?; - rename(path_temp, path)?; + if !path.exists() { + let path_temp = path.with_extension("part"); + File::create(&path_temp)?.write_all(value)?; + rename(path_temp, path)?; + } } } Ok(key) } - pub fn iter(&self, mut cb: impl FnMut(Resource, &[u8])) -> Result<()> { + pub fn iter(&self, mut cb: impl FnMut(Resource, usize)) -> Result<()> { match self { ResourceStore::Redb(_database) => todo!(), - ResourceStore::Filesystem(_root) => todo!(), + ResourceStore::Filesystem(_root) => { + for e in _root.read_dir()? { + let e = e?; + let k = e.file_name(); + let k = k.to_string_lossy(); + let m = e.metadata()?.len(); + let mut r = [0; 32]; + for i in 0..32 { + r[i] = u8::from_str_radix(&k[i * 2..(i + 1) * 2], 16)? + } + cb(Resource(r, PhantomData), m as usize) + } + Ok(()) + } ResourceStore::Memory(mutex) => { - mutex.lock().unwrap().iter().for_each(|(k, v)| cb(*k, v)); + mutex + .lock() + .unwrap() + .iter() + .for_each(|(k, v)| cb(*k, v.len())); Ok(()) } } -- cgit v1.2.3-70-g09d2