ckb_db/
iter.rs

1//! RocksDB iterator wrapper base on DBIter
2use 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
11/// An iterator over a column family, with specifiable ranges and direction.
12pub trait DBIterator {
13    /// Opens an iterator using the provided IteratorMode.
14    /// This is used when you want to iterate over a specific ColumnFamily
15    fn iter(&self, col: Col, mode: IteratorMode) -> Result<DBIter> {
16        let opts = ReadOptions::default();
17        self.iter_opt(col, mode, &opts)
18    }
19
20    /// Opens an iterator using the provided IteratorMode and ReadOptions.
21    /// This is used when you want to iterate over a specific ColumnFamily with a modified ReadOptions
22    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}