aboutsummaryrefslogtreecommitdiff
path: root/database/src/backends/rocksdb.rs
diff options
context:
space:
mode:
Diffstat (limited to 'database/src/backends/rocksdb.rs')
-rw-r--r--database/src/backends/rocksdb.rs30
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())
+ })))
}
}