diff options
Diffstat (limited to 'src/db/sled_adapter.rs')
-rw-r--r-- | src/db/sled_adapter.rs | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/src/db/sled_adapter.rs b/src/db/sled_adapter.rs index 617b4844..6e375f03 100644 --- a/src/db/sled_adapter.rs +++ b/src/db/sled_adapter.rs @@ -4,10 +4,11 @@ use std::sync::{Arc, RwLock}; use arc_swap::ArcSwapOption; use sled::transaction::{ - ConflictableTransactionError, TransactionError, Transactional, TransactionalTree, UnabortableTransactionError + ConflictableTransactionError, TransactionError, Transactional, TransactionalTree, + UnabortableTransactionError, }; -use crate::{Error, IDb, ITx, ITxFn, Result, TxError, TxFnResult, TxResult, Value, Db}; +use crate::{Db, Error, IDb, ITx, ITxFn, Result, TxError, TxFnResult, TxResult, Value, ValueIter}; impl From<sled::Error> for Error { fn from(e: sled::Error) -> Error { @@ -58,12 +59,45 @@ impl IDb for SledDb { let tree = self.get_tree(tree)?; Ok(tree.get(key)?.map(|v| v.to_vec().into())) } + fn put(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()> { let tree = self.get_tree(tree)?; tree.insert(key, value)?; Ok(()) } + fn range<'a>( + &'a self, + tree: usize, + start: Option<&[u8]>, + reverse: bool, + ) -> Result<ValueIter<'a>> { + let tree = self.get_tree(tree)?; + if reverse { + match start { + Some(start) => Ok(Box::new(tree.range(..=start).rev().map(|v| { + v.map(|(x, y)| (x.to_vec().into(), y.to_vec().into())) + .map_err(Into::into) + }))), + None => Ok(Box::new(tree.iter().rev().map(|v| { + v.map(|(x, y)| (x.to_vec().into(), y.to_vec().into())) + .map_err(Into::into) + }))), + } + } else { + match start { + Some(start) => Ok(Box::new(tree.range(start..).map(|v| { + v.map(|(x, y)| (x.to_vec().into(), y.to_vec().into())) + .map_err(Into::into) + }))), + None => Ok(Box::new(tree.iter().map(|v| { + v.map(|(x, y)| (x.to_vec().into(), y.to_vec().into())) + .map_err(Into::into) + }))), + } + } + } + fn transaction(&self, f: &dyn ITxFn) -> TxResult<(), ()> { let trees = self.trees.read().unwrap(); let res = trees.0.transaction(|txtrees| { @@ -76,7 +110,10 @@ impl IDb for SledDb { assert!(tx.err.into_inner().is_none()); Ok(()) } - TxFnResult::Abort => Err(ConflictableTransactionError::Abort(())), + TxFnResult::Abort => { + assert!(tx.err.into_inner().is_none()); + Err(ConflictableTransactionError::Abort(())) + } TxFnResult::Err => { let err_arc = tx .err @@ -117,14 +154,18 @@ impl<'a> SledTx<'a> { impl<'a> ITx<'a> for SledTx<'a> { fn get(&self, tree: usize, key: &[u8]) -> Result<Option<Value<'a>>> { - let tree = self.trees.get(tree) + let tree = self + .trees + .get(tree) .ok_or(Error("invalid tree id".into()))?; let tmp = self.save_error(tree.get(key))?; Ok(tmp.map(|v| v.to_vec().into())) } fn put(&self, tree: usize, key: &[u8], value: &[u8]) -> Result<()> { - let tree = self.trees.get(tree) + let tree = self + .trees + .get(tree) .ok_or(Error("invalid tree id".into()))?; self.save_error(tree.insert(key, value))?; Ok(()) |