use std::sync::{Arc, RwLock};
pub use crate::database::OwnedEntry;
pub use crate::database::config::{
self, DbConfig, bloom_config, cleaner_config, compaction_config, config_error, index_config,
memtable_config, version_manager_config, wal_config,
};
use crate::database::db_engine::Engine;
pub use crate::database::db_engine::errors::EngineError;
pub use crate::database::iterator::DatabaseIterator;
mod database;
#[derive(Clone)]
pub struct Database {
db: Arc<RwLock<Engine>>,
}
impl Database {
pub fn new(config: Arc<DbConfig>) -> Result<Self, EngineError> {
let engine = Engine::new(config)?;
Ok(Database {
db: Arc::new(RwLock::new(engine)),
})
}
pub fn get(&self, key: &[u8]) -> Result<Option<database::OwnedEntry>, EngineError> {
self.db.read()?.find(key)
}
pub fn put(&self, key: &[u8], value: &[u8]) -> Result<u64, EngineError> {
self.db.write()?.write(key, value)
}
pub fn delete(&self, key: &[u8]) -> Result<u64, EngineError> {
self.db.write()?.write(key, &[])
}
pub fn iter(
&self,
start_key: Option<&[u8]>,
end_key: Option<&[u8]>,
) -> Result<Box<dyn DatabaseIterator>, EngineError> {
match (start_key, end_key) {
(Some(start), Some(end)) => {
if start > end {
return Err(EngineError::InvalidRange);
}
}
_ => {}
};
let engine = self.db.read()?;
engine.iterator(start_key, end_key)
}
}