From e300796fc2c1ca9efb5cd8e20d8f1e63f4694abe Mon Sep 17 00:00:00 2001 From: Roman Zeyde Date: Tue, 3 Jul 2018 14:44:28 +0300 Subject: [PATCH] Add scanning DBStore prefix iterator --- src/store.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/store.rs b/src/store.rs index b15f39b..23824f6 100644 --- a/src/store.rs +++ b/src/store.rs @@ -94,6 +94,39 @@ impl DBStore { info!("finished full compaction"); store } + + pub fn iter_scan(&self, prefix: &[u8]) -> ScanIterator { + ScanIterator { + prefix: prefix.to_vec(), + iter: self.db.prefix_iterator(prefix), + done: false, + } + } +} + +pub struct ScanIterator { + prefix: Vec, + iter: rocksdb::DBIterator, + done: bool, +} + +impl Iterator for ScanIterator { + type Item = Row; + + fn next(&mut self) -> Option { + if self.done { + return None; + } + let (key, value) = self.iter.next()?; + if !key.starts_with(&self.prefix) { + self.done = true; + return None; + } + Some(Row { + key: key.to_vec(), + value: value.to_vec(), + }) + } } impl ReadStore for DBStore {