use alloc::string::String;
use crate::bytes::Bytes;
use crate::persistence::Database;
use super::{Bundle, BundleError, BundleManifest};
#[derive(Debug)]
pub struct SqliteBundle {
database: Database,
manifest: BundleManifest,
}
impl SqliteBundle {
pub fn open<P: AsRef<std::path::Path>>(path: P) -> Result<Self, BundleError> {
let path = path.as_ref();
let database = Database::open(path, true)?;
let manifest = BundleManifest::read(&database)?;
manifest.warn_on_version_mismatch();
Ok(Self { database, manifest })
}
pub fn manifest(&self) -> &BundleManifest {
&self.manifest
}
pub fn database(&self) -> &Database {
&self.database
}
}
impl Bundle for SqliteBundle {
fn get(&self, namespace: &str, key: &[u8]) -> Option<Bytes> {
self.database.get(namespace, key)
}
fn scan(&self, namespace: &str, visit: &mut dyn FnMut(&[u8], &[u8])) {
self.database.scan(namespace, visit)
}
fn namespaces(&self) -> alloc::vec::Vec<String> {
self.database.namespaces()
}
fn describe(&self) -> String {
alloc::format!(
"bundle '{}' at {:?}",
self.manifest.name,
self.database.path()
)
}
}