1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use std::sync::Arc;
use engine_traits::{self, Error, Result};
use rocksdb::{DBIterator, SeekKey as RawSeekKey, DB};
pub struct RocksEngineIterator(DBIterator<Arc<DB>>);
impl RocksEngineIterator {
pub fn from_raw(iter: DBIterator<Arc<DB>>) -> RocksEngineIterator {
RocksEngineIterator(iter)
}
pub fn sequence(&self) -> Option<u64> {
self.0.sequence()
}
}
impl engine_traits::Iterator for RocksEngineIterator {
fn seek(&mut self, key: engine_traits::SeekKey) -> Result<bool> {
let k: RocksSeekKey = key.into();
self.0.seek(k.into_raw()).map_err(Error::Engine)
}
fn seek_for_prev(&mut self, key: engine_traits::SeekKey) -> Result<bool> {
let k: RocksSeekKey = key.into();
self.0.seek_for_prev(k.into_raw()).map_err(Error::Engine)
}
fn prev(&mut self) -> Result<bool> {
#[cfg(not(feature = "nortcheck"))]
if !self.valid()? {
return Err(Error::Engine("Iterator invalid".to_string()));
}
self.0.prev().map_err(Error::Engine)
}
fn next(&mut self) -> Result<bool> {
#[cfg(not(feature = "nortcheck"))]
if !self.valid()? {
return Err(Error::Engine("Iterator invalid".to_string()));
}
self.0.next().map_err(Error::Engine)
}
fn key(&self) -> &[u8] {
#[cfg(not(feature = "nortcheck"))]
assert!(self.valid().unwrap());
self.0.key()
}
fn value(&self) -> &[u8] {
#[cfg(not(feature = "nortcheck"))]
assert!(self.valid().unwrap());
self.0.value()
}
fn valid(&self) -> Result<bool> {
self.0.valid().map_err(Error::Engine)
}
}
pub struct RocksSeekKey<'a>(RawSeekKey<'a>);
impl<'a> RocksSeekKey<'a> {
pub fn into_raw(self) -> RawSeekKey<'a> {
self.0
}
}
impl<'a> From<engine_traits::SeekKey<'a>> for RocksSeekKey<'a> {
fn from(key: engine_traits::SeekKey<'a>) -> Self {
let k = match key {
engine_traits::SeekKey::Start => RawSeekKey::Start,
engine_traits::SeekKey::End => RawSeekKey::End,
engine_traits::SeekKey::Key(k) => RawSeekKey::Key(k),
};
RocksSeekKey(k)
}
}