use std::fs;
use std::io;
use std::path::{Path, PathBuf};
use tracing::info;
#[derive(Debug, Clone)]
pub struct StoragePathManager {
root_dir: PathBuf,
}
impl StoragePathManager {
pub fn new<P: AsRef<Path>>(root: P) -> Self {
Self {
root_dir: root.as_ref().to_path_buf(),
}
}
pub fn root_dir(&self) -> &Path {
&self.root_dir
}
pub fn wos_dir(&self) -> io::Result<PathBuf> {
let p = self.root_dir.join("wos");
fs::create_dir_all(&p)?;
Ok(p)
}
pub fn ros_dir(&self) -> io::Result<PathBuf> {
let p = self.root_dir.join("ros");
fs::create_dir_all(&p)?;
Ok(p)
}
pub fn cold_ec_dir(&self) -> io::Result<PathBuf> {
let p = self.root_dir.join("cold_ec");
fs::create_dir_all(&p)?;
Ok(p)
}
pub fn wal_path(&self) -> PathBuf {
self.root_dir.join("wal.log")
}
pub fn encrypted_wal_path(&self) -> PathBuf {
self.root_dir.join("wal.enc.log")
}
pub fn columnar_cache_dir(&self) -> io::Result<PathBuf> {
let p = self.root_dir.join("columnar_cache");
fs::create_dir_all(&p)?;
Ok(p)
}
pub fn l2_cache_dir(&self) -> io::Result<PathBuf> {
let p = self.root_dir.join("l2_cache");
fs::create_dir_all(&p)?;
Ok(p)
}
pub fn temp_dir(&self) -> io::Result<PathBuf> {
let p = self.root_dir.join("tmp");
fs::create_dir_all(&p)?;
Ok(p)
}
pub fn cleanup_orphans(&self) -> io::Result<()> {
let tmp = self.root_dir.join("tmp");
if tmp.exists() {
info!("Cleaning up orphan temporary files in {:?}", tmp);
fs::remove_dir_all(&tmp).ok();
fs::create_dir_all(&tmp)?;
}
Ok(())
}
}