use smallvec for db query buffering
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
76c75cc05a
commit
3ad6aa59f9
23 changed files with 173 additions and 98 deletions
|
@ -9,23 +9,25 @@ use conduit::{
|
|||
use futures::FutureExt;
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::ser;
|
||||
use crate::{keyval::KeyBuf, ser};
|
||||
|
||||
/// Returns true if the map contains the key.
|
||||
/// - key is serialized into allocated buffer
|
||||
/// - harder errors may not be reported
|
||||
#[inline]
|
||||
#[implement(super::Map)]
|
||||
pub fn contains<K>(self: &Arc<Self>, key: &K) -> impl Future<Output = bool> + Send + '_
|
||||
where
|
||||
K: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let mut buf = Vec::<u8>::with_capacity(64);
|
||||
let mut buf = KeyBuf::new();
|
||||
self.bcontains(key, &mut buf)
|
||||
}
|
||||
|
||||
/// Returns true if the map contains the key.
|
||||
/// - key is serialized into stack-buffer
|
||||
/// - harder errors will panic
|
||||
#[inline]
|
||||
#[implement(super::Map)]
|
||||
pub fn acontains<const MAX: usize, K>(self: &Arc<Self>, key: &K) -> impl Future<Output = bool> + Send + '_
|
||||
where
|
||||
|
@ -51,6 +53,7 @@ where
|
|||
|
||||
/// Returns Ok if the map contains the key.
|
||||
/// - key is raw
|
||||
#[inline]
|
||||
#[implement(super::Map)]
|
||||
pub fn exists<'a, K>(self: &'a Arc<Self>, key: &K) -> impl Future<Output = Result> + Send + 'a
|
||||
where
|
||||
|
|
|
@ -7,6 +7,7 @@ use rocksdb::DBPinnableSlice;
|
|||
use serde::Serialize;
|
||||
|
||||
use crate::{
|
||||
keyval::KeyBuf,
|
||||
ser,
|
||||
util::{is_incomplete, map_err, or_else},
|
||||
Handle,
|
||||
|
@ -18,11 +19,12 @@ type RocksdbResult<'a> = Result<Option<DBPinnableSlice<'a>>, rocksdb::Error>;
|
|||
/// asynchronously. The key is serialized into an allocated buffer to perform
|
||||
/// the query.
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn qry<K>(self: &Arc<Self>, key: &K) -> impl Future<Output = Result<Handle<'_>>> + Send
|
||||
where
|
||||
K: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let mut buf = Vec::<u8>::with_capacity(64);
|
||||
let mut buf = KeyBuf::new();
|
||||
self.bqry(key, &mut buf)
|
||||
}
|
||||
|
||||
|
@ -30,6 +32,7 @@ where
|
|||
/// asynchronously. The key is serialized into a fixed-sized buffer to perform
|
||||
/// the query. The maximum size is supplied as const generic parameter.
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn aqry<const MAX: usize, K>(self: &Arc<Self>, key: &K) -> impl Future<Output = Result<Handle<'_>>> + Send
|
||||
where
|
||||
K: Serialize + ?Sized + Debug,
|
||||
|
@ -69,11 +72,8 @@ where
|
|||
debug_assert!(matches!(cached, Ok(None)), "expected status Incomplete");
|
||||
let cmd = Cmd::Get(Get {
|
||||
map: self.clone(),
|
||||
key: key.as_ref().into(),
|
||||
res: None,
|
||||
key: key
|
||||
.as_ref()
|
||||
.try_into()
|
||||
.expect("failed to copy key into buffer"),
|
||||
});
|
||||
|
||||
self.db.pool.execute(cmd).boxed()
|
||||
|
|
|
@ -10,20 +10,25 @@ use conduit::implement;
|
|||
use rocksdb::WriteBatchWithTransaction;
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::{ser, util::or_else};
|
||||
use crate::{
|
||||
keyval::{KeyBuf, ValBuf},
|
||||
ser,
|
||||
util::or_else,
|
||||
};
|
||||
|
||||
/// Insert Key/Value
|
||||
///
|
||||
/// - Key is serialized
|
||||
/// - Val is serialized
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn put<K, V>(&self, key: K, val: V)
|
||||
where
|
||||
K: Serialize + Debug,
|
||||
V: Serialize,
|
||||
{
|
||||
let mut key_buf = Vec::new();
|
||||
let mut val_buf = Vec::new();
|
||||
let mut key_buf = KeyBuf::new();
|
||||
let mut val_buf = ValBuf::new();
|
||||
self.bput(key, val, (&mut key_buf, &mut val_buf));
|
||||
}
|
||||
|
||||
|
@ -32,12 +37,13 @@ where
|
|||
/// - Key is serialized
|
||||
/// - Val is raw
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn put_raw<K, V>(&self, key: K, val: V)
|
||||
where
|
||||
K: Serialize + Debug,
|
||||
V: AsRef<[u8]>,
|
||||
{
|
||||
let mut key_buf = Vec::new();
|
||||
let mut key_buf = KeyBuf::new();
|
||||
self.bput_raw(key, val, &mut key_buf);
|
||||
}
|
||||
|
||||
|
@ -46,12 +52,13 @@ where
|
|||
/// - Key is raw
|
||||
/// - Val is serialized
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn raw_put<K, V>(&self, key: K, val: V)
|
||||
where
|
||||
K: AsRef<[u8]>,
|
||||
V: Serialize,
|
||||
{
|
||||
let mut val_buf = Vec::new();
|
||||
let mut val_buf = ValBuf::new();
|
||||
self.raw_bput(key, val, &mut val_buf);
|
||||
}
|
||||
|
||||
|
@ -60,12 +67,13 @@ where
|
|||
/// - Key is serialized
|
||||
/// - Val is serialized to stack-buffer
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn put_aput<const VMAX: usize, K, V>(&self, key: K, val: V)
|
||||
where
|
||||
K: Serialize + Debug,
|
||||
V: Serialize,
|
||||
{
|
||||
let mut key_buf = Vec::new();
|
||||
let mut key_buf = KeyBuf::new();
|
||||
let mut val_buf = ArrayVec::<u8, VMAX>::new();
|
||||
self.bput(key, val, (&mut key_buf, &mut val_buf));
|
||||
}
|
||||
|
@ -75,13 +83,14 @@ where
|
|||
/// - Key is serialized to stack-buffer
|
||||
/// - Val is serialized
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn aput_put<const KMAX: usize, K, V>(&self, key: K, val: V)
|
||||
where
|
||||
K: Serialize + Debug,
|
||||
V: Serialize,
|
||||
{
|
||||
let mut key_buf = ArrayVec::<u8, KMAX>::new();
|
||||
let mut val_buf = Vec::new();
|
||||
let mut val_buf = ValBuf::new();
|
||||
self.bput(key, val, (&mut key_buf, &mut val_buf));
|
||||
}
|
||||
|
||||
|
@ -90,6 +99,7 @@ where
|
|||
/// - Key is serialized to stack-buffer
|
||||
/// - Val is serialized to stack-buffer
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn aput<const KMAX: usize, const VMAX: usize, K, V>(&self, key: K, val: V)
|
||||
where
|
||||
K: Serialize + Debug,
|
||||
|
@ -105,6 +115,7 @@ where
|
|||
/// - Key is serialized to stack-buffer
|
||||
/// - Val is raw
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn aput_raw<const KMAX: usize, K, V>(&self, key: K, val: V)
|
||||
where
|
||||
K: Serialize + Debug,
|
||||
|
@ -119,6 +130,7 @@ where
|
|||
/// - Key is raw
|
||||
/// - Val is serialized to stack-buffer
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn raw_aput<const VMAX: usize, K, V>(&self, key: K, val: V)
|
||||
where
|
||||
K: AsRef<[u8]>,
|
||||
|
|
|
@ -4,7 +4,10 @@ use conduit::{implement, Result};
|
|||
use futures::{Stream, StreamExt};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{keyval, keyval::Key, ser, stream};
|
||||
use crate::{
|
||||
keyval::{result_deserialize_key, serialize_key, Key},
|
||||
stream,
|
||||
};
|
||||
|
||||
#[implement(super::Map)]
|
||||
pub fn keys_from<'a, K, P>(&'a self, from: &P) -> impl Stream<Item = Result<Key<'_, K>>> + Send
|
||||
|
@ -12,8 +15,7 @@ where
|
|||
P: Serialize + ?Sized + Debug,
|
||||
K: Deserialize<'a> + Send,
|
||||
{
|
||||
self.keys_from_raw(from)
|
||||
.map(keyval::result_deserialize_key::<K>)
|
||||
self.keys_from_raw(from).map(result_deserialize_key::<K>)
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
|
@ -22,7 +24,7 @@ pub fn keys_from_raw<P>(&self, from: &P) -> impl Stream<Item = Result<Key<'_>>>
|
|||
where
|
||||
P: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let key = ser::serialize_to_vec(from).expect("failed to serialize query key");
|
||||
let key = serialize_key(from).expect("failed to serialize query key");
|
||||
self.raw_keys_from(&key)
|
||||
}
|
||||
|
||||
|
@ -32,8 +34,7 @@ where
|
|||
P: AsRef<[u8]> + ?Sized + Debug + Sync,
|
||||
K: Deserialize<'a> + Send,
|
||||
{
|
||||
self.raw_keys_from(from)
|
||||
.map(keyval::result_deserialize_key::<K>)
|
||||
self.raw_keys_from(from).map(result_deserialize_key::<K>)
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
|
|
|
@ -8,7 +8,7 @@ use futures::{
|
|||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{keyval, keyval::Key, ser};
|
||||
use crate::keyval::{result_deserialize_key, serialize_key, Key};
|
||||
|
||||
#[implement(super::Map)]
|
||||
pub fn keys_prefix<'a, K, P>(&'a self, prefix: &P) -> impl Stream<Item = Result<Key<'_, K>>> + Send
|
||||
|
@ -17,7 +17,7 @@ where
|
|||
K: Deserialize<'a> + Send,
|
||||
{
|
||||
self.keys_prefix_raw(prefix)
|
||||
.map(keyval::result_deserialize_key::<K>)
|
||||
.map(result_deserialize_key::<K>)
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
|
@ -26,7 +26,7 @@ pub fn keys_prefix_raw<P>(&self, prefix: &P) -> impl Stream<Item = Result<Key<'_
|
|||
where
|
||||
P: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let key = ser::serialize_to_vec(prefix).expect("failed to serialize query key");
|
||||
let key = serialize_key(prefix).expect("failed to serialize query key");
|
||||
self.raw_keys_from(&key)
|
||||
.try_take_while(move |k: &Key<'_>| future::ok(k.starts_with(&key)))
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ where
|
|||
K: Deserialize<'a> + Send + 'a,
|
||||
{
|
||||
self.raw_keys_prefix(prefix)
|
||||
.map(keyval::result_deserialize_key::<K>)
|
||||
.map(result_deserialize_key::<K>)
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
|
|
|
@ -4,18 +4,20 @@ use arrayvec::ArrayVec;
|
|||
use conduit::implement;
|
||||
use serde::Serialize;
|
||||
|
||||
use crate::{ser, util::or_else};
|
||||
use crate::{keyval::KeyBuf, ser, util::or_else};
|
||||
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn del<K>(&self, key: K)
|
||||
where
|
||||
K: Serialize + Debug,
|
||||
{
|
||||
let mut buf = Vec::<u8>::with_capacity(64);
|
||||
let mut buf = KeyBuf::new();
|
||||
self.bdel(key, &mut buf);
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
#[inline]
|
||||
pub fn adel<const MAX: usize, K>(&self, key: K)
|
||||
where
|
||||
K: Serialize + Debug,
|
||||
|
|
|
@ -4,7 +4,10 @@ use conduit::{implement, Result};
|
|||
use futures::{Stream, StreamExt};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{keyval, keyval::Key, ser, stream};
|
||||
use crate::{
|
||||
keyval::{result_deserialize_key, serialize_key, Key},
|
||||
stream,
|
||||
};
|
||||
|
||||
#[implement(super::Map)]
|
||||
pub fn rev_keys_from<'a, K, P>(&'a self, from: &P) -> impl Stream<Item = Result<Key<'_, K>>> + Send
|
||||
|
@ -13,7 +16,7 @@ where
|
|||
K: Deserialize<'a> + Send,
|
||||
{
|
||||
self.rev_keys_from_raw(from)
|
||||
.map(keyval::result_deserialize_key::<K>)
|
||||
.map(result_deserialize_key::<K>)
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
|
@ -22,7 +25,7 @@ pub fn rev_keys_from_raw<P>(&self, from: &P) -> impl Stream<Item = Result<Key<'_
|
|||
where
|
||||
P: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let key = ser::serialize_to_vec(from).expect("failed to serialize query key");
|
||||
let key = serialize_key(from).expect("failed to serialize query key");
|
||||
self.rev_raw_keys_from(&key)
|
||||
}
|
||||
|
||||
|
@ -33,7 +36,7 @@ where
|
|||
K: Deserialize<'a> + Send,
|
||||
{
|
||||
self.rev_raw_keys_from(from)
|
||||
.map(keyval::result_deserialize_key::<K>)
|
||||
.map(result_deserialize_key::<K>)
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
|
|
|
@ -8,7 +8,7 @@ use futures::{
|
|||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{keyval, keyval::Key, ser};
|
||||
use crate::keyval::{result_deserialize_key, serialize_key, Key};
|
||||
|
||||
#[implement(super::Map)]
|
||||
pub fn rev_keys_prefix<'a, K, P>(&'a self, prefix: &P) -> impl Stream<Item = Result<Key<'_, K>>> + Send
|
||||
|
@ -17,7 +17,7 @@ where
|
|||
K: Deserialize<'a> + Send,
|
||||
{
|
||||
self.rev_keys_prefix_raw(prefix)
|
||||
.map(keyval::result_deserialize_key::<K>)
|
||||
.map(result_deserialize_key::<K>)
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
|
@ -26,7 +26,7 @@ pub fn rev_keys_prefix_raw<P>(&self, prefix: &P) -> impl Stream<Item = Result<Ke
|
|||
where
|
||||
P: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let key = ser::serialize_to_vec(prefix).expect("failed to serialize query key");
|
||||
let key = serialize_key(prefix).expect("failed to serialize query key");
|
||||
self.rev_raw_keys_from(&key)
|
||||
.try_take_while(move |k: &Key<'_>| future::ok(k.starts_with(&key)))
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ where
|
|||
K: Deserialize<'a> + Send + 'a,
|
||||
{
|
||||
self.rev_raw_keys_prefix(prefix)
|
||||
.map(keyval::result_deserialize_key::<K>)
|
||||
.map(result_deserialize_key::<K>)
|
||||
}
|
||||
|
||||
#[implement(super::Map)]
|
||||
|
|
|
@ -4,7 +4,10 @@ use conduit::{implement, Result};
|
|||
use futures::stream::{Stream, StreamExt};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{keyval, keyval::KeyVal, ser, stream};
|
||||
use crate::{
|
||||
keyval::{result_deserialize, serialize_key, KeyVal},
|
||||
stream,
|
||||
};
|
||||
|
||||
/// Iterate key-value entries in the map starting from upper-bound.
|
||||
///
|
||||
|
@ -18,7 +21,7 @@ where
|
|||
V: Deserialize<'a> + Send,
|
||||
{
|
||||
self.rev_stream_from_raw(from)
|
||||
.map(keyval::result_deserialize::<K, V>)
|
||||
.map(result_deserialize::<K, V>)
|
||||
}
|
||||
|
||||
/// Iterate key-value entries in the map starting from upper-bound.
|
||||
|
@ -31,7 +34,7 @@ pub fn rev_stream_from_raw<P>(&self, from: &P) -> impl Stream<Item = Result<KeyV
|
|||
where
|
||||
P: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let key = ser::serialize_to_vec(from).expect("failed to serialize query key");
|
||||
let key = serialize_key(from).expect("failed to serialize query key");
|
||||
self.rev_raw_stream_from(&key)
|
||||
}
|
||||
|
||||
|
@ -47,7 +50,7 @@ where
|
|||
V: Deserialize<'a> + Send,
|
||||
{
|
||||
self.rev_raw_stream_from(from)
|
||||
.map(keyval::result_deserialize::<K, V>)
|
||||
.map(result_deserialize::<K, V>)
|
||||
}
|
||||
|
||||
/// Iterate key-value entries in the map starting from upper-bound.
|
||||
|
|
|
@ -8,7 +8,7 @@ use futures::{
|
|||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{keyval, keyval::KeyVal, ser};
|
||||
use crate::keyval::{result_deserialize, serialize_key, KeyVal};
|
||||
|
||||
/// Iterate key-value entries in the map where the key matches a prefix.
|
||||
///
|
||||
|
@ -22,7 +22,7 @@ where
|
|||
V: Deserialize<'a> + Send,
|
||||
{
|
||||
self.rev_stream_prefix_raw(prefix)
|
||||
.map(keyval::result_deserialize::<K, V>)
|
||||
.map(result_deserialize::<K, V>)
|
||||
}
|
||||
|
||||
/// Iterate key-value entries in the map where the key matches a prefix.
|
||||
|
@ -35,7 +35,7 @@ pub fn rev_stream_prefix_raw<P>(&self, prefix: &P) -> impl Stream<Item = Result<
|
|||
where
|
||||
P: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let key = ser::serialize_to_vec(prefix).expect("failed to serialize query key");
|
||||
let key = serialize_key(prefix).expect("failed to serialize query key");
|
||||
self.rev_raw_stream_from(&key)
|
||||
.try_take_while(move |(k, _): &KeyVal<'_>| future::ok(k.starts_with(&key)))
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ where
|
|||
V: Deserialize<'a> + Send + 'a,
|
||||
{
|
||||
self.rev_raw_stream_prefix(prefix)
|
||||
.map(keyval::result_deserialize::<K, V>)
|
||||
.map(result_deserialize::<K, V>)
|
||||
}
|
||||
|
||||
/// Iterate key-value entries in the map where the key matches a prefix.
|
||||
|
|
|
@ -4,7 +4,10 @@ use conduit::{implement, Result};
|
|||
use futures::stream::{Stream, StreamExt};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{keyval, keyval::KeyVal, ser, stream};
|
||||
use crate::{
|
||||
keyval::{result_deserialize, serialize_key, KeyVal},
|
||||
stream,
|
||||
};
|
||||
|
||||
/// Iterate key-value entries in the map starting from lower-bound.
|
||||
///
|
||||
|
@ -17,8 +20,7 @@ where
|
|||
K: Deserialize<'a> + Send,
|
||||
V: Deserialize<'a> + Send,
|
||||
{
|
||||
self.stream_from_raw(from)
|
||||
.map(keyval::result_deserialize::<K, V>)
|
||||
self.stream_from_raw(from).map(result_deserialize::<K, V>)
|
||||
}
|
||||
|
||||
/// Iterate key-value entries in the map starting from lower-bound.
|
||||
|
@ -31,7 +33,7 @@ pub fn stream_from_raw<P>(&self, from: &P) -> impl Stream<Item = Result<KeyVal<'
|
|||
where
|
||||
P: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let key = ser::serialize_to_vec(from).expect("failed to serialize query key");
|
||||
let key = serialize_key(from).expect("failed to serialize query key");
|
||||
self.raw_stream_from(&key)
|
||||
}
|
||||
|
||||
|
@ -46,8 +48,7 @@ where
|
|||
K: Deserialize<'a> + Send,
|
||||
V: Deserialize<'a> + Send,
|
||||
{
|
||||
self.raw_stream_from(from)
|
||||
.map(keyval::result_deserialize::<K, V>)
|
||||
self.raw_stream_from(from).map(result_deserialize::<K, V>)
|
||||
}
|
||||
|
||||
/// Iterate key-value entries in the map starting from lower-bound.
|
||||
|
|
|
@ -8,7 +8,7 @@ use futures::{
|
|||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{keyval, keyval::KeyVal, ser};
|
||||
use crate::keyval::{result_deserialize, serialize_key, KeyVal};
|
||||
|
||||
/// Iterate key-value entries in the map where the key matches a prefix.
|
||||
///
|
||||
|
@ -22,7 +22,7 @@ where
|
|||
V: Deserialize<'a> + Send,
|
||||
{
|
||||
self.stream_prefix_raw(prefix)
|
||||
.map(keyval::result_deserialize::<K, V>)
|
||||
.map(result_deserialize::<K, V>)
|
||||
}
|
||||
|
||||
/// Iterate key-value entries in the map where the key matches a prefix.
|
||||
|
@ -35,7 +35,7 @@ pub fn stream_prefix_raw<P>(&self, prefix: &P) -> impl Stream<Item = Result<KeyV
|
|||
where
|
||||
P: Serialize + ?Sized + Debug,
|
||||
{
|
||||
let key = ser::serialize_to_vec(prefix).expect("failed to serialize query key");
|
||||
let key = serialize_key(prefix).expect("failed to serialize query key");
|
||||
self.raw_stream_from(&key)
|
||||
.try_take_while(move |(k, _): &KeyVal<'_>| future::ok(k.starts_with(&key)))
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ where
|
|||
V: Deserialize<'a> + Send + 'a,
|
||||
{
|
||||
self.raw_stream_prefix(prefix)
|
||||
.map(keyval::result_deserialize::<K, V>)
|
||||
.map(result_deserialize::<K, V>)
|
||||
}
|
||||
|
||||
/// Iterate key-value entries in the map where the key matches a prefix.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue