summaryrefslogtreecommitdiff
path: root/shared/src/store.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-01-26 17:12:43 +0100
committermetamuffin <metamuffin@disroot.org>2025-01-26 17:12:43 +0100
commitb7da5f50c6f97761f974dda8467d4819e6984323 (patch)
tree9b114c0f72a35fc95973cc31123e8fd73cf6ca4e /shared/src/store.rs
parent912987377c60a4ec18442a5c6edcbed1aba0b59a (diff)
downloadweareserver-b7da5f50c6f97761f974dda8467d4819e6984323.tar
weareserver-b7da5f50c6f97761f974dda8467d4819e6984323.tar.bz2
weareserver-b7da5f50c6f97761f974dda8467d4819e6984323.tar.zst
world: put cache option
Diffstat (limited to 'shared/src/store.rs')
-rw-r--r--shared/src/store.rs39
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(())
}
}