From d3d11356ee59858dcf26fa66ad2b6c9c4ac13a61 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 6 Oct 2024 22:15:19 +0000 Subject: [PATCH] add serialized insert interface Signed-off-by: Jason Volk --- src/database/map/insert.rs | 187 +++++++++++++++++++++++++++++++++++-- src/database/map/remove.rs | 12 +-- 2 files changed, 186 insertions(+), 13 deletions(-) diff --git a/src/database/map/insert.rs b/src/database/map/insert.rs index 953c9c94..39a0c422 100644 --- a/src/database/map/insert.rs +++ b/src/database/map/insert.rs @@ -1,21 +1,194 @@ -use std::{convert::AsRef, fmt::Debug}; +//! Insert a Key+Value into the database. +//! +//! Overloads are provided for the user to choose the most efficient +//! serialization or bypass for pre=serialized (raw) inputs. +use std::{convert::AsRef, fmt::Debug, io::Write}; + +use arrayvec::ArrayVec; use conduit::implement; use rocksdb::WriteBatchWithTransaction; +use serde::Serialize; -use crate::util::or_else; +use crate::{ser, util::or_else}; +/// Insert Key/Value +/// +/// - Key is serialized +/// - Val is serialized #[implement(super::Map)] -#[tracing::instrument(skip(self, value), fields(%self), level = "trace")] -pub fn insert(&self, key: &K, value: &V) +pub fn put(&self, key: K, val: V) where - K: AsRef<[u8]> + ?Sized + Debug, - V: AsRef<[u8]> + ?Sized, + K: Serialize + Debug, + V: Serialize, +{ + let mut key_buf = Vec::new(); + let mut val_buf = Vec::new(); + self.bput(key, val, (&mut key_buf, &mut val_buf)); +} + +/// Insert Key/Value +/// +/// - Key is serialized +/// - Val is raw +#[implement(super::Map)] +pub fn put_raw(&self, key: K, val: V) +where + K: Serialize + Debug, + V: AsRef<[u8]>, +{ + let mut key_buf = Vec::new(); + self.bput_raw(key, val, &mut key_buf); +} + +/// Insert Key/Value +/// +/// - Key is raw +/// - Val is serialized +#[implement(super::Map)] +pub fn raw_put(&self, key: K, val: V) +where + K: AsRef<[u8]>, + V: Serialize, +{ + let mut val_buf = Vec::new(); + self.raw_bput(key, val, &mut val_buf); +} + +/// Insert Key/Value +/// +/// - Key is serialized +/// - Val is serialized to stack-buffer +#[implement(super::Map)] +pub fn put_aput(&self, key: K, val: V) +where + K: Serialize + Debug, + V: Serialize, +{ + let mut key_buf = Vec::new(); + let mut val_buf = ArrayVec::::new(); + self.bput(key, val, (&mut key_buf, &mut val_buf)); +} + +/// Insert Key/Value +/// +/// - Key is serialized to stack-buffer +/// - Val is serialized +#[implement(super::Map)] +pub fn aput_put(&self, key: K, val: V) +where + K: Serialize + Debug, + V: Serialize, +{ + let mut key_buf = ArrayVec::::new(); + let mut val_buf = Vec::new(); + self.bput(key, val, (&mut key_buf, &mut val_buf)); +} + +/// Insert Key/Value +/// +/// - Key is serialized to stack-buffer +/// - Val is serialized to stack-buffer +#[implement(super::Map)] +pub fn aput(&self, key: K, val: V) +where + K: Serialize + Debug, + V: Serialize, +{ + let mut key_buf = ArrayVec::::new(); + let mut val_buf = ArrayVec::::new(); + self.bput(key, val, (&mut key_buf, &mut val_buf)); +} + +/// Insert Key/Value +/// +/// - Key is serialized to stack-buffer +/// - Val is raw +#[implement(super::Map)] +pub fn aput_raw(&self, key: K, val: V) +where + K: Serialize + Debug, + V: AsRef<[u8]>, +{ + let mut key_buf = ArrayVec::::new(); + self.bput_raw(key, val, &mut key_buf); +} + +/// Insert Key/Value +/// +/// - Key is raw +/// - Val is serialized to stack-buffer +#[implement(super::Map)] +pub fn raw_aput(&self, key: K, val: V) +where + K: AsRef<[u8]>, + V: Serialize, +{ + let mut val_buf = ArrayVec::::new(); + self.raw_bput(key, val, &mut val_buf); +} + +/// Insert Key/Value +/// +/// - Key is serialized to supplied buffer +/// - Val is serialized to supplied buffer +#[implement(super::Map)] +pub fn bput(&self, key: K, val: V, mut buf: (Bk, Bv)) +where + K: Serialize + Debug, + V: Serialize, + Bk: Write + AsRef<[u8]>, + Bv: Write + AsRef<[u8]>, +{ + let val = ser::serialize(&mut buf.1, val).expect("failed to serialize insertion val"); + self.bput_raw(key, val, &mut buf.0); +} + +/// Insert Key/Value +/// +/// - Key is serialized to supplied buffer +/// - Val is raw +#[implement(super::Map)] +pub fn bput_raw(&self, key: K, val: V, mut buf: Bk) +where + K: Serialize + Debug, + V: AsRef<[u8]>, + Bk: Write + AsRef<[u8]>, +{ + let key = ser::serialize(&mut buf, key).expect("failed to serialize insertion key"); + self.insert(&key, val); +} + +/// Insert Key/Value +/// +/// - Key is raw +/// - Val is serialized to supplied buffer +#[implement(super::Map)] +pub fn raw_bput(&self, key: K, val: V, mut buf: Bv) +where + K: AsRef<[u8]>, + V: Serialize, + Bv: Write + AsRef<[u8]>, +{ + let val = ser::serialize(&mut buf, val).expect("failed to serialize insertion val"); + self.insert(&key, val); +} + +/// Insert Key/Value +/// +/// - Key is raw +/// - Val is raw +#[implement(super::Map)] +#[tracing::instrument(skip_all, fields(%self), level = "trace")] +pub fn insert(&self, key: &K, val: V) +where + K: AsRef<[u8]> + ?Sized, + V: AsRef<[u8]>, { let write_options = &self.write_options; self.db .db - .put_cf_opt(&self.cf(), key, value, write_options) + .put_cf_opt(&self.cf(), key, val, write_options) .or_else(or_else) .expect("database insert error"); diff --git a/src/database/map/remove.rs b/src/database/map/remove.rs index 10bb2ff0..42eaa477 100644 --- a/src/database/map/remove.rs +++ b/src/database/map/remove.rs @@ -7,18 +7,18 @@ use serde::Serialize; use crate::{ser, util::or_else}; #[implement(super::Map)] -pub fn del(&self, key: &K) +pub fn del(&self, key: K) where - K: Serialize + ?Sized + Debug, + K: Serialize + Debug, { let mut buf = Vec::::with_capacity(64); self.bdel(key, &mut buf); } #[implement(super::Map)] -pub fn adel(&self, key: &K) +pub fn adel(&self, key: K) where - K: Serialize + ?Sized + Debug, + K: Serialize + Debug, { let mut buf = ArrayVec::::new(); self.bdel(key, &mut buf); @@ -26,9 +26,9 @@ where #[implement(super::Map)] #[tracing::instrument(skip(self, buf), fields(%self), level = "trace")] -pub fn bdel(&self, key: &K, buf: &mut B) +pub fn bdel(&self, key: K, buf: &mut B) where - K: Serialize + ?Sized + Debug, + K: Serialize + Debug, B: Write + AsRef<[u8]>, { let key = ser::serialize(buf, key).expect("failed to serialize deletion key");