diff options
Diffstat (limited to 'database/src/backends/rocksdb.rs')
| -rw-r--r-- | database/src/backends/rocksdb.rs | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/database/src/backends/rocksdb.rs b/database/src/backends/rocksdb.rs index cdcb60a..92c6a6d 100644 --- a/database/src/backends/rocksdb.rs +++ b/database/src/backends/rocksdb.rs @@ -6,7 +6,7 @@ use crate::backends::{Db, ReadTransaction, WriteTransaction, WriteTxnFunction}; use anyhow::Result; -use rocksdb::{ErrorKind, OptimisticTransactionDB}; +use rocksdb::{Direction, ErrorKind, IteratorMode, OptimisticTransactionDB}; use std::path::Path; pub struct Rocksdb { @@ -57,17 +57,23 @@ impl ReadTransaction for rocksdb::Transaction<'_, OptimisticTransactionDB> { fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>> { Ok(self.get(key)?) } - fn next(&self, key: &[u8]) -> Result<Option<Vec<u8>>> { - let mut it = self.raw_iterator(); - it.seek_for_prev(key); - it.next(); - Ok(it.key().map(Vec::from)) - } - fn prev(&self, key: &[u8]) -> Result<Option<Vec<u8>>> { - let mut it = self.raw_iterator(); - it.seek(key); - it.prev(); - Ok(it.key().map(Vec::from)) + fn iter<'a>( + &'a self, + key: &[u8], + reverse: bool, + ) -> Result<Box<dyn Iterator<Item = Result<Vec<u8>>> + 'a>> { + let mut iter = self.iterator(IteratorMode::Start); + iter.set_mode(IteratorMode::From( + key, + if reverse { + Direction::Reverse + } else { + Direction::Forward + }, + )); + Ok(Box::new(iter.map(|e| { + e.map(|(k, _)| k.into_vec()).map_err(|e| e.into()) + }))) } } |