use std::sync::Arc;
use crate::db::V07Inner;
use crate::storage::v4::engine::Engine;
use crate::Result;
#[derive(Clone)]
pub struct Namespace {
inner: Arc<V07Inner>,
ns_id: u32,
name: Box<str>,
}
impl Namespace {
pub(crate) fn new(inner: Arc<V07Inner>, ns_id: u32, name: Box<str>) -> Self {
Self { inner, ns_id, name }
}
fn engine(&self) -> &Engine {
&self.inner.engine
}
#[must_use]
pub fn name(&self) -> &str {
&self.name
}
pub fn insert(&self, key: impl Into<Vec<u8>>, value: impl Into<Vec<u8>>) -> Result<()> {
let key = key.into();
let value = value.into();
self.engine().insert(self.ns_id, &key, &value, 0)
}
pub fn get(&self, key: impl AsRef<[u8]>) -> Result<Option<Vec<u8>>> {
let key = key.as_ref();
let cached = self.engine().get(self.ns_id, key)?;
Ok(cached.map(|c| c.value.to_vec()))
}
pub fn remove(&self, key: impl AsRef<[u8]>) -> Result<Option<Vec<u8>>> {
let key = key.as_ref();
let previous = self.engine().get(self.ns_id, key)?;
let _did = self.engine().remove(self.ns_id, key)?;
Ok(previous.map(|c| c.value.to_vec()))
}
pub fn contains_key(&self, key: impl AsRef<[u8]>) -> Result<bool> {
Ok(self.engine().get(self.ns_id, key.as_ref())?.is_some())
}
pub fn len(&self) -> Result<usize> {
let count = self.engine().record_count(self.ns_id)?;
usize::try_from(count).map_err(|_| {
crate::Error::InvalidConfig("namespace record count exceeds usize on this target")
})
}
pub fn is_empty(&self) -> Result<bool> {
Ok(self.len()? == 0)
}
pub fn clear(&self) -> Result<()> {
self.engine().clear_namespace(self.ns_id)
}
pub fn iter(&self) -> Result<NamespaceIter> {
let snapshot = self.engine().collect_records(self.ns_id)?;
Ok(NamespaceIter {
inner: snapshot.into_iter(),
})
}
pub fn keys(&self) -> Result<NamespaceKeyIter> {
let snapshot = self.engine().collect_records(self.ns_id)?;
Ok(NamespaceKeyIter {
inner: snapshot.into_iter(),
})
}
}
pub struct NamespaceIter {
inner: std::vec::IntoIter<(Vec<u8>, Vec<u8>, u64)>,
}
impl Iterator for NamespaceIter {
type Item = (Vec<u8>, Vec<u8>);
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(k, v, _)| (k, v))
}
}
pub struct NamespaceKeyIter {
inner: std::vec::IntoIter<(Vec<u8>, Vec<u8>, u64)>,
}
impl Iterator for NamespaceKeyIter {
type Item = Vec<u8>;
fn next(&mut self) -> Option<Self::Item> {
self.inner.next().map(|(k, _, _)| k)
}
}