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