1use crate::db::cf_handle;
3use crate::{
4 Result, RocksDB, RocksDBSnapshot, RocksDBTransaction, RocksDBTransactionSnapshot,
5 internal_error,
6};
7use ckb_db_schema::Col;
8pub use rocksdb::{DBIterator as DBIter, Direction, IteratorMode};
9use rocksdb::{ReadOptions, ops::IterateCF};
10
11pub trait DBIterator {
13 fn iter(&self, col: Col, mode: IteratorMode) -> Result<DBIter> {
16 let opts = ReadOptions::default();
17 self.iter_opt(col, mode, &opts)
18 }
19
20 fn iter_opt(&self, col: Col, mode: IteratorMode, readopts: &ReadOptions) -> Result<DBIter>;
23}
24
25impl DBIterator for RocksDB {
26 fn iter_opt(&self, col: Col, mode: IteratorMode, readopts: &ReadOptions) -> Result<DBIter> {
27 let cf = cf_handle(&self.inner, col)?;
28 self.inner
29 .iterator_cf_opt(cf, mode, readopts)
30 .map_err(internal_error)
31 }
32}
33
34impl DBIterator for RocksDBTransaction {
35 fn iter_opt(&self, col: Col, mode: IteratorMode, readopts: &ReadOptions) -> Result<DBIter> {
36 let cf = cf_handle(&self.db, col)?;
37 self.inner
38 .iterator_cf_opt(cf, mode, readopts)
39 .map_err(internal_error)
40 }
41}
42
43impl<'a> DBIterator for RocksDBTransactionSnapshot<'a> {
44 fn iter_opt(&self, col: Col, mode: IteratorMode, readopts: &ReadOptions) -> Result<DBIter> {
45 let cf = cf_handle(&self.db, col)?;
46 self.inner
47 .iterator_cf_opt(cf, mode, readopts)
48 .map_err(internal_error)
49 }
50}
51
52impl DBIterator for RocksDBSnapshot {
53 fn iter_opt(&self, col: Col, mode: IteratorMode, readopts: &ReadOptions) -> Result<DBIter> {
54 let cf = cf_handle(&self.db, col)?;
55 self.iterator_cf_opt(cf, mode, readopts)
56 .map_err(internal_error)
57 }
58}