skipdb/
read.rs

1use skipdb_core::rev_range::RevRange;
2
3use super::*;
4
5/// A read only transaction over the [`OptimisticDb`],
6pub struct ReadTransaction<K, V, I, C> {
7  pub(crate) db: I,
8  pub(crate) rtm: Rtm<K, V, C, BTreePwm<K, V>>,
9}
10
11impl<K, V, I, C> ReadTransaction<K, V, I, C> {
12  #[inline]
13  pub(super) fn new(db: I, rtm: Rtm<K, V, C, BTreePwm<K, V>>) -> Self {
14    Self { db, rtm }
15  }
16}
17
18impl<K, V, I, C> ReadTransaction<K, V, I, C>
19where
20  K: Ord,
21  I: Database<K, V>,
22{
23  /// Returns the version of the transaction.
24  #[inline]
25  pub fn version(&self) -> u64 {
26    self.rtm.version()
27  }
28
29  /// Get a value from the database.
30  #[inline]
31  pub fn get<Q>(&self, key: &Q) -> Option<Ref<'_, K, V>>
32  where
33    K: Borrow<Q>,
34    Q: Ord + ?Sized,
35  {
36    let version = self.rtm.version();
37    self.db.as_inner().get(key, version).map(Into::into)
38  }
39
40  /// Returns true if the given key exists in the database.
41  #[inline]
42  pub fn contains_key<Q>(&self, key: &Q) -> bool
43  where
44    K: Borrow<Q>,
45    Q: Ord + ?Sized,
46  {
47    let version = self.rtm.version();
48    self.db.as_inner().contains_key(key, version)
49  }
50
51  /// Returns an iterator over the entries of the database.
52  #[inline]
53  pub fn iter(&self) -> Iter<'_, K, V> {
54    let version = self.rtm.version();
55    self.db.as_inner().iter(version)
56  }
57
58  /// Returns a reverse iterator over the entries of the database.
59  #[inline]
60  pub fn iter_rev(&self) -> RevIter<'_, K, V> {
61    let version = self.rtm.version();
62    self.db.as_inner().iter_rev(version)
63  }
64
65  /// Returns an iterator over the subset of entries of the database.
66  #[inline]
67  pub fn range<Q, R>(&self, range: R) -> Range<'_, Q, R, K, V>
68  where
69    K: Borrow<Q>,
70    R: RangeBounds<Q>,
71    Q: Ord + ?Sized,
72  {
73    let version = self.rtm.version();
74    self.db.as_inner().range(range, version)
75  }
76
77  /// Returns an iterator over the subset of entries of the database in reverse order.
78  #[inline]
79  pub fn range_rev<Q, R>(&self, range: R) -> RevRange<'_, Q, R, K, V>
80  where
81    K: Borrow<Q>,
82    R: RangeBounds<Q>,
83    Q: Ord + ?Sized,
84  {
85    let version = self.rtm.version();
86    self.db.as_inner().range_rev(range, version)
87  }
88}