ckb_rocksdb/ops/
iter.rs

1use crate::{ColumnFamily, DBIterator, DBRawIterator, Direction, Error, IteratorMode, ReadOptions};
2
3pub trait Iterate {
4    fn get_raw_iter<'a: 'b, 'b>(&'a self, readopts: &ReadOptions) -> DBRawIterator<'b>;
5
6    fn get_iter<'a: 'b, 'b>(
7        &'a self,
8        readopts: &ReadOptions,
9        mode: IteratorMode<'_>,
10    ) -> DBIterator<'b> {
11        let mut rv = DBIterator {
12            raw: self.get_raw_iter(readopts),
13            direction: Direction::Forward, // blown away by set_mode()
14            just_seeked: false,
15        };
16        rv.set_mode(mode);
17        rv
18    }
19
20    fn iterator_opt<'a: 'b, 'b>(
21        &'a self,
22        mode: IteratorMode<'_>,
23        readopts: &ReadOptions,
24    ) -> DBIterator<'b> {
25        self.get_iter(readopts, mode)
26    }
27
28    fn iterator<'a: 'b, 'b>(&'a self, mode: IteratorMode<'_>) -> DBIterator<'b> {
29        let readopts = ReadOptions::default();
30        self.iterator_opt(mode, &readopts)
31    }
32
33    /// Opens an interator with `set_total_order_seek` enabled.
34    /// This must be used to iterate across prefixes when `set_memtable_factory` has been called
35    /// with a Hash-based implementation.
36    fn full_iterator<'a: 'b, 'b>(&'a self, mode: IteratorMode<'_>) -> DBIterator<'b> {
37        let mut opts = ReadOptions::default();
38        opts.set_total_order_seek(true);
39        self.get_iter(&opts, mode)
40    }
41
42    fn prefix_iterator<'a: 'b, 'b>(&'a self, prefix: &[u8]) -> DBIterator<'b> {
43        let mut opts = ReadOptions::default();
44        opts.set_prefix_same_as_start(true);
45        self.get_iter(&opts, IteratorMode::From(prefix, Direction::Forward))
46    }
47
48    fn raw_iterator<'a: 'b, 'b>(&'a self) -> DBRawIterator<'b> {
49        let opts = ReadOptions::default();
50        self.get_raw_iter(&opts)
51    }
52}
53
54pub trait IterateCF: Iterate {
55    fn get_raw_iter_cf<'a: 'b, 'b>(
56        &'a self,
57        cf_handle: &ColumnFamily,
58        readopts: &ReadOptions,
59    ) -> Result<DBRawIterator<'b>, Error>;
60
61    fn get_iter_cf<'a: 'b, 'b>(
62        &'a self,
63        cf_handle: &ColumnFamily,
64        readopts: &ReadOptions,
65        mode: IteratorMode<'_>,
66    ) -> Result<DBIterator<'b>, Error> {
67        let mut rv = DBIterator {
68            raw: self.get_raw_iter_cf(cf_handle, readopts)?,
69            direction: Direction::Forward, // blown away by set_mode()
70            just_seeked: false,
71        };
72        rv.set_mode(mode);
73        Ok(rv)
74    }
75
76    /// Opens an interator using the provided ReadOptions.
77    /// This is used when you want to iterate over a specific ColumnFamily with a modified ReadOptions
78    fn iterator_cf_opt<'a: 'b, 'b>(
79        &'a self,
80        cf_handle: &ColumnFamily,
81        mode: IteratorMode<'_>,
82        readopts: &ReadOptions,
83    ) -> Result<DBIterator<'b>, Error> {
84        self.get_iter_cf(cf_handle, readopts, mode)
85    }
86
87    fn iterator_cf<'a: 'b, 'b>(
88        &'a self,
89        cf_handle: &ColumnFamily,
90        mode: IteratorMode<'_>,
91    ) -> Result<DBIterator<'b>, Error> {
92        let opts = ReadOptions::default();
93        self.get_iter_cf(cf_handle, &opts, mode)
94    }
95
96    fn full_iterator_cf<'a: 'b, 'b>(
97        &'a self,
98        cf_handle: &ColumnFamily,
99        mode: IteratorMode<'_>,
100    ) -> Result<DBIterator<'b>, Error> {
101        let mut opts = ReadOptions::default();
102        opts.set_total_order_seek(true);
103        self.get_iter_cf(cf_handle, &opts, mode)
104    }
105
106    fn prefix_iterator_cf<'a: 'b, 'b>(
107        &'a self,
108        cf_handle: &ColumnFamily,
109        prefix: &[u8],
110    ) -> Result<DBIterator<'b>, Error> {
111        let mut opts = ReadOptions::default();
112        opts.set_prefix_same_as_start(true);
113        self.get_iter_cf(
114            cf_handle,
115            &opts,
116            IteratorMode::From(prefix, Direction::Forward),
117        )
118    }
119
120    fn raw_iterator_cf<'a: 'b, 'b>(
121        &'a self,
122        cf_handle: &ColumnFamily,
123    ) -> Result<DBRawIterator<'b>, Error> {
124        let opts = ReadOptions::default();
125        self.get_raw_iter_cf(cf_handle, &opts)
126    }
127}