Improve usability of wrapped tables

This commit is contained in:
Olivier 'reivilibre' 2022-03-25 19:23:11 +00:00
parent 538d15d2d0
commit 237b4a7ecb
2 changed files with 51 additions and 8 deletions

View File

@ -3,6 +3,7 @@ use crate::environment::Txn;
use crate::wrapper::ByteWrapper;
use anyhow::Context;
use libmdbx::{TransactionKind, RW};
use std::borrow::Borrow;
pub struct WrappedTable<K, V> {
pub raw: RawTable<[u8], [u8]>,
@ -14,11 +15,11 @@ impl<K: ByteWrapper, V: ByteWrapper> WrappedTable<K, V> {
pub fn get<'txn, TK: TransactionKind>(
&self,
txn: &Txn<'txn, TK>,
k: impl AsRef<K::Item>,
k: impl Borrow<K::Item>,
) -> anyhow::Result<Option<V::Item>> {
let k_bytes = self
.k_wrapper
.dump_to_db_bytes(k.as_ref())
.dump_to_db_bytes(k.borrow())
.context("whilst converting key to bytes")?;
self.raw
@ -30,16 +31,16 @@ impl<K: ByteWrapper, V: ByteWrapper> WrappedTable<K, V> {
pub fn put<'txn>(
&self,
txn: &Txn<'txn, RW>,
k: impl AsRef<K::Item>,
v: impl AsRef<V::Item>,
k: impl Borrow<K::Item>,
v: impl Borrow<V::Item>,
) -> anyhow::Result<()> {
let k_bytes = self
.k_wrapper
.dump_to_db_bytes(k.as_ref())
.dump_to_db_bytes(k.borrow())
.context("whilst converting key to bytes")?;
let v_bytes = self
.v_wrapper
.dump_to_db_bytes(v.as_ref())
.dump_to_db_bytes(v.borrow())
.context("whilst converting value to bytes")?;
self.raw.put(txn, k_bytes, v_bytes)?;
@ -50,11 +51,11 @@ impl<K: ByteWrapper, V: ByteWrapper> WrappedTable<K, V> {
pub fn delete<'txn>(
&self,
txn: &Txn<'txn, RW>,
k: impl AsRef<K::Item>,
k: impl Borrow<K::Item>,
) -> anyhow::Result<bool> {
let k_bytes = self
.k_wrapper
.dump_to_db_bytes(k.as_ref())
.dump_to_db_bytes(k.borrow())
.context("whilst converting key to bytes")?;
self.raw.delete(txn, k_bytes)

View File

@ -17,6 +17,14 @@ pub struct SerdeBareWrapper<T> {
phantom: PhantomData<T>,
}
impl<T> Default for SerdeBareWrapper<T> {
fn default() -> Self {
SerdeBareWrapper {
phantom: Default::default(),
}
}
}
impl<T: Serialize + DeserializeOwned> ByteWrapper for SerdeBareWrapper<T> {
type Item = T;
@ -58,6 +66,40 @@ impl<T: ByteWrapper> ByteWrapper for CompressorWrapper<T> {
}
}
impl<T> CompressorWrapper<T> {
pub fn new_with(inner: T) -> anyhow::Result<Self> {
let compressor = Compressor::new(13)?;
let decompressor = Decompressor::new()?;
Ok(CompressorWrapper {
inner,
compressor: Mutex::new(compressor),
decompressor: Mutex::new(decompressor),
})
}
pub fn new() -> anyhow::Result<Self>
where
T: Default,
{
let inner: T = Default::default();
Self::new_with(inner)
}
}
impl ByteWrapper for String {
type Item = String;
fn load_from_db_bytes(&self, bytes: &[u8]) -> anyhow::Result<Self::Item> {
Ok(std::str::from_utf8(bytes)?.to_string())
}
fn dump_to_db_bytes(&self, item: &Self::Item) -> anyhow::Result<Vec<u8>> {
Ok(item.as_bytes().to_vec())
}
}
impl<T: ByteWrapper> ByteWrapper for Arc<T> {
type Item = T::Item;