use std::{path::PathBuf, sync::Arc};
use wdev::Device;
use wkv::WedbStore;
use super::{
garnet_database::GarnetDatabase, i_database_manager::IDatabaseManager,
multi_database_manager::MultiDatabaseManager, single_database_manager::SingleDatabaseManager,
};
pub enum DatabaseManager<D: Device> {
Single(SingleDatabaseManager<D>),
Multi(MultiDatabaseManager<D>),
}
impl<D: Device> DatabaseManager<D> {
pub fn database_count(&self) -> usize {
match self {
Self::Single(_) => 1,
Self::Multi(m) => m.get_databases_snapshot().len(),
}
}
pub fn try_default_database(&self) -> Option<Arc<GarnetDatabase<D>>> {
match self {
Self::Single(s) => Some(Arc::clone(&s.db)),
Self::Multi(m) => m.try_get_database(0),
}
}
}
impl DatabaseManagerFactory {
fn build<D: Device>(
multi: bool,
store: Arc<WedbStore<D>>,
checkpoint_root: PathBuf,
default_db: Arc<GarnetDatabase<D>>,
) -> DatabaseManager<D> {
if multi {
let manager = MultiDatabaseManager::new(store, checkpoint_root);
manager.databases.pin().insert(0, default_db);
DatabaseManager::Multi(manager)
} else {
DatabaseManager::Single(SingleDatabaseManager::new(checkpoint_root, default_db))
}
}
}
pub struct DatabaseManagerFactory;
impl DatabaseManagerFactory {
pub fn create_database_manager<D: Device>(
multi: bool,
store: Arc<WedbStore<D>>,
checkpoint_root: PathBuf,
default_db: Arc<GarnetDatabase<D>>,
) -> DatabaseManager<D> {
Self::build(multi, store, checkpoint_root, default_db)
}
pub fn should_create_multiple_database_manager(num_databases: usize) -> bool {
num_databases > 1
}
}