Skip to content
Snippets Groups Projects
Commit 3a4bcc05 authored by Éloïs's avatar Éloïs
Browse files

[feat] kv_typed: add method contains_key

parent 1fb29cab
No related branches found
No related tags found
1 merge request!1335Gva proto 2
......@@ -55,6 +55,7 @@ pub trait BackendCol: 'static + Clone + Debug + Send + Sync {
f: F,
) -> KvResult<Option<D>>;
fn clear(&mut self) -> KvResult<()>;
fn contains_key<K: Key>(&self, k: &K) -> KvResult<bool>;
fn count(&self) -> KvResult<usize>;
fn iter<K: Key, V: Value>(&self, range: RangeBytes) -> Self::Iter;
fn put<K: Key, V: Value>(&mut self, k: &K, value: &V) -> KvResult<()>;
......
......@@ -126,6 +126,10 @@ impl BackendCol for LevelDbCol {
.count())
}
#[inline(always)]
fn contains_key<K: Key>(&self, k: &K) -> KvResult<bool> {
k.as_bytes(|k_bytes| Ok(self.0.get(ReadOptions::new(), k_bytes)?.is_some()))
}
#[inline(always)]
fn get<K: Key, V: Value>(&self, k: &K) -> KvResult<Option<V>> {
k.as_bytes(|k_bytes| {
self.0
......
......@@ -241,6 +241,10 @@ impl BackendCol for MemCol {
Ok(self.tree.len())
}
#[inline(always)]
fn contains_key<K: Key>(&self, k: &K) -> KvResult<bool> {
k.as_bytes(|k_bytes| Ok(self.tree.contains_key(k_bytes)))
}
#[inline(always)]
fn get<K: Key, V: Value>(&self, k: &K) -> KvResult<Option<V>> {
k.as_bytes(|k_bytes| {
self.tree
......
......@@ -81,6 +81,10 @@ impl BackendCol for MemCol {
}
}
#[inline(always)]
fn contains_key<K: Key>(&self, _k: &K) -> KvResult<bool> {
Ok(self.0.is_some())
}
#[inline(always)]
fn get<K: Key, V: Value>(&self, _k: &K) -> KvResult<Option<V>> {
self.0
.as_ref()
......
......@@ -76,6 +76,10 @@ impl BackendCol for SledCol {
Ok(self.0.len())
}
#[inline(always)]
fn contains_key<K: Key>(&self, k: &K) -> KvResult<bool> {
k.as_bytes(|k_bytes| Ok(self.0.contains_key(k_bytes)?))
}
#[inline(always)]
fn get<K: Key, V: Value>(&self, k: &K) -> KvResult<Option<V>> {
k.as_bytes(|k_bytes| {
self.0
......
......@@ -6,6 +6,7 @@ pub trait DbCollectionRo: Sized {
type V: Value;
type Event: EventTrait<K = Self::K, V = Self::V>;
fn contains_key(&self, k: &Self::K) -> KvResult<bool>;
fn count(&self) -> KvResult<usize>;
fn get(&self, k: &Self::K) -> KvResult<Option<Self::V>>;
/// Don't worry about complex iter type. Use it like an `impl Iterator<Item=KvResult<(K, V)>>`.
......@@ -67,6 +68,11 @@ impl<BC: BackendCol, E: EventTrait> DbCollectionRo for ColRo<BC, E> {
type V = E::V;
type Event = E;
#[inline(always)]
fn contains_key(&self, k: &Self::K) -> KvResult<bool> {
let r = self.inner.read();
r.backend_col.contains_key(k)
}
#[inline(always)]
fn count(&self) -> KvResult<usize> {
let r = self.inner.read();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment