diff options
author | metamuffin <metamuffin@disroot.org> | 2025-01-26 17:12:43 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-01-26 17:12:43 +0100 |
commit | b7da5f50c6f97761f974dda8467d4819e6984323 (patch) | |
tree | 9b114c0f72a35fc95973cc31123e8fd73cf6ca4e /shared | |
parent | 912987377c60a4ec18442a5c6edcbed1aba0b59a (diff) | |
download | weareserver-b7da5f50c6f97761f974dda8467d4819e6984323.tar weareserver-b7da5f50c6f97761f974dda8467d4819e6984323.tar.bz2 weareserver-b7da5f50c6f97761f974dda8467d4819e6984323.tar.zst |
world: put cache option
Diffstat (limited to 'shared')
-rw-r--r-- | shared/src/store.rs | 39 |
1 files changed, 30 insertions, 9 deletions
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<Self> { - 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(()) } } |