1use skipdb_core::rev_range::RevRange;
2
3use super::*;
4
5pub 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 #[inline]
32 pub fn version(&self) -> u64 {
33 self.rtm.version()
34 }
35
36 #[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 #[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 #[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 #[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 #[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 #[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}