use anyhow::Result;
use blvm_node::storage::database::{Database, Tree};
use std::path::Path;
use std::sync::Arc;
use crate::module::database::{open_module_db, run_migrations, MigrationUp};
#[derive(Clone)]
pub struct ModuleDb {
db: Arc<dyn Database>,
}
impl ModuleDb {
pub fn open<P: AsRef<Path>>(data_dir: P) -> Result<Self> {
let db = open_module_db(data_dir)?;
Ok(Self { db })
}
pub fn open_with_migrations<P: AsRef<Path>>(
data_dir: P,
migrations: &[(u32, MigrationUp)],
) -> Result<Self> {
let db = Self::open(data_dir)?;
db.run_migrations(migrations)?;
Ok(db)
}
pub fn open_or_temp<P: AsRef<Path>>(data_dir: P, module_name: &str) -> Result<Self> {
let data_dir = data_dir.as_ref().to_path_buf();
Self::open(&data_dir).or_else(|_| {
let temp = std::env::temp_dir().join(module_name);
let _ = std::fs::create_dir_all(&temp);
Self::open(&temp)
})
}
pub fn open_or_temp_with_migrations<P: AsRef<Path>>(
data_dir: P,
module_name: &str,
migrations: &[(u32, MigrationUp)],
) -> Result<Self> {
let db = Self::open_or_temp(data_dir, module_name)?;
let _ = db.run_migrations(migrations);
Ok(db)
}
pub fn run_migrations(&self, migrations: &[(u32, MigrationUp)]) -> Result<()> {
run_migrations(&self.db, migrations)
}
pub fn tree(&self, name: &str) -> Result<Arc<dyn Tree>> {
let t = self.db.open_tree(name)?;
Ok(Arc::from(t))
}
pub fn as_db(&self) -> Arc<dyn Database> {
Arc::clone(&self.db)
}
}