2024-07-02 22:40:58 +00:00
|
|
|
use std::{ops::Index, sync::Arc};
|
2024-05-28 06:59:50 +00:00
|
|
|
|
2024-07-02 22:40:58 +00:00
|
|
|
use conduit::{Result, Server};
|
2024-05-28 06:59:50 +00:00
|
|
|
|
2024-07-01 20:54:38 +00:00
|
|
|
use crate::{cork::Cork, maps, maps::Maps, Engine, Map};
|
2024-05-28 06:59:50 +00:00
|
|
|
|
|
|
|
pub struct Database {
|
|
|
|
pub db: Arc<Engine>,
|
|
|
|
pub map: Maps,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Database {
|
|
|
|
/// Load an existing database or create a new one.
|
|
|
|
pub async fn open(server: &Arc<Server>) -> Result<Self> {
|
|
|
|
let db = Engine::open(server)?;
|
|
|
|
Ok(Self {
|
|
|
|
db: db.clone(),
|
|
|
|
map: maps::open(&db)?,
|
|
|
|
})
|
|
|
|
}
|
2024-07-01 20:54:38 +00:00
|
|
|
|
2024-07-03 20:06:43 +00:00
|
|
|
#[inline]
|
2024-07-01 20:54:38 +00:00
|
|
|
#[must_use]
|
|
|
|
pub fn cork(&self) -> Cork { Cork::new(&self.db, false, false) }
|
|
|
|
|
2024-07-03 20:06:43 +00:00
|
|
|
#[inline]
|
2024-07-01 20:54:38 +00:00
|
|
|
#[must_use]
|
|
|
|
pub fn cork_and_flush(&self) -> Cork { Cork::new(&self.db, true, false) }
|
|
|
|
|
2024-07-03 20:06:43 +00:00
|
|
|
#[inline]
|
2024-07-01 20:54:38 +00:00
|
|
|
#[must_use]
|
|
|
|
pub fn cork_and_sync(&self) -> Cork { Cork::new(&self.db, true, true) }
|
2024-05-28 06:59:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
impl Index<&str> for Database {
|
|
|
|
type Output = Arc<Map>;
|
|
|
|
|
|
|
|
fn index(&self, name: &str) -> &Self::Output {
|
|
|
|
self.map
|
|
|
|
.get(name)
|
|
|
|
.expect("column in database does not exist")
|
|
|
|
}
|
|
|
|
}
|