use std::io;
use crate::FAlloc;
use crate::data::*;
pub struct MicroDB {
storage: FAlloc,
}
impl MicroDB {
pub fn load<S: ToString>(data: S, alloc: S, cache_period: u128) -> Result<Self, io::Error> {
Ok(Self {
storage: FAlloc::load(data, alloc, cache_period)?,
})
}
pub fn load_or_create<S: ToString>(
data: S,
alloc: S,
cache_period: u128,
block_size: usize,
) -> Result<Self, io::Error> {
Ok(Self {
storage: FAlloc::load_or_create(data, alloc, cache_period, block_size)?,
})
}
pub fn create<S: ToString>(
data: S,
alloc: S,
cache_period: u128,
block_size: usize,
) -> Result<Self, io::Error> {
Ok(Self {
storage: FAlloc::create(data, alloc, cache_period, block_size)?,
})
}
pub fn sensible_cache_period(
requests_per_second: f64,
ram_gb: f64,
average_object_size_mb: f64,
safety: f64,
) -> u128 {
(100_000.0 * (1.01 - safety) / 1.01 * ram_gb
/ (requests_per_second * average_object_size_mb)) as u128
}
pub fn sync(&self) -> Result<(), io::Error> {
self.storage.sync()
}
pub fn save(&self) -> Result<(), io::Error> {
self.storage.save()
}
pub fn shutdown_here(&self) -> Result<(), io::Error> {
self.storage.shutdown_here()
}
pub fn shutdown(self) -> Result<(), io::Error> {
self.storage.shutdown()
}
pub fn get_paths<P: Path>(&self, path: Option<P>) -> Result<Vec<String>, io::Error> {
if let Some(path) = path {
self.storage.paths(Some(&path.to_db_path()))
} else {
self.storage.paths(None)
}
}
pub fn get_all_paths<P: Path>(&self, path: Option<P>) -> Result<Vec<String>, io::Error> {
if let Some(path) = path {
self.storage.all_paths(Some(&path.to_db_path()))
} else {
self.storage.all_paths(None)
}
}
pub fn get_paths_of<T: ComObj, P: Path>(&self, path: P) -> Result<Vec<String>, io::Error> {
T::paths(path, self)
}
pub fn set_raw<T: RawObj, P: Path>(&self, path: P, object: T) -> Result<(), io::Error> {
let path = path.to_db_path();
self.storage.delete_substructure(&path)?; self.storage.set(&path, object.to_db())
}
pub fn set_raw_hard<T: RawObj, P: Path>(&self, path: P, object: T) -> Result<(), io::Error> {
self.storage.set(&path.to_db_path(), object.to_db())
}
pub fn set_com<T: ComObj, P: Path>(&self, path: P, object: T) -> Result<(), io::Error> {
self.storage
.delete_substructure(&path.clone().to_db_path())?; T::to_db(object, path, self)
}
pub fn set_com_hard<T: ComObj, P: Path>(&self, path: P, object: T) -> Result<(), io::Error> {
T::to_db(object, path, self)
}
pub fn get_raw<T: RawObj, P: Path>(&self, path: P) -> Result<Option<T>, io::Error> {
Ok(self.storage.get(&path.to_db_path())?.and_then(T::from_db))
}
pub fn get_com<T: ComObj, P: Path>(&self, path: P) -> Result<Option<T>, io::Error> {
T::from_db(path, self)
}
pub fn remove<P: Path>(&self, path: P) -> Result<(), io::Error> {
let path = path.to_db_path();
self.storage.delete_substructure(&path)?;
self.storage.set(&path, Vec::new())
}
pub fn remove_raw<P: Path>(&self, path: P) -> Result<(), io::Error> {
self.storage.set(&path.to_db_path(), Vec::new())
}
pub fn remove_com<T: ComObj, P: Path>(&self, path: P) -> Result<(), io::Error> {
T::remove(path, self)
}
}
#[macro_export]
macro_rules! extract {
($val:expr) => {
if let Some(x) = $val? {
x
} else {
return Ok(None);
}
};
}