use std::sync::Arc;
use crate::{
engine::Engine,
error::{Error, Result},
key_composer::KeyComposer,
wedb::{
DbBatch, IntoOptId, Namespace, WeDb,
core::{WeDbInner, db_rm_impl},
},
};
pub struct Db<E: Engine> {
pub kc: KeyComposer,
pub(crate) inner: Arc<WeDbInner<E>>,
}
impl<E: Engine> Clone for Db<E> {
#[inline(always)]
fn clone(&self) -> Self {
Self {
kc: self.kc,
inner: self.inner.clone(),
}
}
}
impl<E: Engine> Db<E> {
#[inline(always)]
pub fn data(&self) -> &E::Partition {
&self.inner.data
}
#[inline(always)]
pub fn meta(&self) -> &E::Partition {
&self.inner.meta
}
#[inline(always)]
pub const fn kc(&self) -> KeyComposer {
self.kc
}
#[inline(always)]
pub fn engine(&self) -> &E {
&self.inner.engine
}
#[inline(always)]
pub fn batch(&self) -> DbBatch<E> {
DbBatch::new(
self.inner.data.clone(),
self.inner.meta.clone(),
self.inner.engine.batch(),
)
}
#[inline(always)]
pub fn batch_with_capacity(&self, capacity: usize) -> DbBatch<E> {
DbBatch::new(
self.inner.data.clone(),
self.inner.meta.clone(),
self.inner.engine.batch_with_capacity(capacity),
)
}
#[inline(always)]
pub const fn ns_id(&self) -> u64 {
self.kc.ns_id()
}
#[inline(always)]
pub const fn id(&self) -> u64 {
self.kc.db()
}
#[inline(always)]
pub const fn is_default(&self) -> bool {
self.kc.is_default()
}
#[inline(always)]
pub fn ns(&self) -> Namespace<E> {
Namespace {
id: self.ns_id(),
inner: self.inner.clone(),
}
}
#[inline(always)]
pub fn wedb(&self) -> WeDb<E> {
WeDb {
inner: self.inner.clone(),
}
}
}
impl<E: Engine> Db<E>
where
Error: From<E::Error>,
{
#[inline]
pub fn select(&self, db_id: impl IntoOptId) -> Result<Db<E>> {
self.ns().db(db_id)
}
#[inline]
pub fn with_ns(&self, ns_id: impl IntoOptId) -> Result<Db<E>> {
self.wedb().ns(ns_id)?.db(self.id())
}
#[inline]
pub fn rm(&self) -> Result<u64> {
let count = db_rm_impl::<E>(
&self.inner.data,
&self.inner.meta,
&self.inner.engine,
self.ns_id(),
self.id(),
)?;
Ok(count)
}
}