diff options
Diffstat (limited to 'cache/src/backends/filesystem.rs')
| -rw-r--r-- | cache/src/backends/filesystem.rs | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/cache/src/backends/filesystem.rs b/cache/src/backends/filesystem.rs index 39fb7a2..9a9db9c 100644 --- a/cache/src/backends/filesystem.rs +++ b/cache/src/backends/filesystem.rs @@ -4,12 +4,11 @@ Copyright (C) 2025 metamuffin <metamuffin.org> */ -use crate::{CacheKey, Config, backends::CacheStorage}; +use crate::{Config, backends::CacheStorage}; use anyhow::Result; -use base64::Engine; use rand::random; use std::{ - fs::{File, rename}, + fs::{File, create_dir_all, rename}, io::{ErrorKind, Read, Write}, path::PathBuf, }; @@ -20,25 +19,22 @@ impl Filesystem { pub fn new(config: &Config) -> Self { Self(config.path.clone()) } - fn path(&self, key: CacheKey) -> PathBuf { - let filename = base64::engine::general_purpose::URL_SAFE.encode(key.0); - let filename = &filename[..30]; // 180 bits - self.0.join(filename) - } fn temp_path(&self) -> PathBuf { self.0.join(format!("temp-{:016x}", random::<u128>())) } } impl CacheStorage for Filesystem { - fn store(&self, key: CacheKey, value: &[u8]) -> Result<()> { + fn store(&self, key: String, value: &[u8]) -> Result<()> { let temp = self.temp_path(); + let out = self.0.join(&key); + create_dir_all(out.parent().unwrap())?; File::create(&temp)?.write_all(value)?; - rename(temp, self.path(key))?; + rename(temp, out)?; Ok(()) } - fn read(&self, key: CacheKey) -> Result<Option<Vec<u8>>> { - match File::open(self.path(key)) { + fn read(&self, key: &str) -> Result<Option<Vec<u8>>> { + match File::open(self.0.join(key)) { Ok(mut f) => { let mut data = Vec::new(); f.read_to_end(&mut data)?; |