reifydb_core/interface/transaction/
multi.rs1use crate::{
5 CommitVersion, EncodedKey, EncodedKeyRange, TransactionId,
6 interface::{MultiVersionValues, WithEventBus},
7 value::encoded::EncodedValues,
8};
9
10pub type BoxedMultiVersionIter<'a> = Box<dyn Iterator<Item = MultiVersionValues> + Send + 'a>;
11
12pub trait MultiVersionTransaction: WithEventBus + Send + Sync + Clone + 'static {
13 type Query: MultiVersionQueryTransaction;
14 type Command: MultiVersionCommandTransaction;
15
16 fn begin_query(&self) -> crate::Result<Self::Query>;
17
18 fn begin_command(&self) -> crate::Result<Self::Command>;
19
20 fn with_query<F, R>(&self, f: F) -> crate::Result<R>
21 where
22 F: FnOnce(&mut Self::Query) -> crate::Result<R>,
23 {
24 let mut tx = self.begin_query()?;
25 f(&mut tx)
26 }
27
28 fn with_command<F, R>(&self, f: F) -> crate::Result<R>
29 where
30 F: FnOnce(&mut Self::Command) -> crate::Result<R>,
31 {
32 let mut tx = self.begin_command()?;
33 let result = f(&mut tx)?;
34 let _version = tx.commit()?;
35 Ok(result)
36 }
37}
38
39pub trait MultiVersionQueryTransaction {
40 fn version(&self) -> CommitVersion;
41
42 fn id(&self) -> TransactionId;
43
44 fn get(&mut self, key: &EncodedKey) -> crate::Result<Option<MultiVersionValues>>;
45
46 fn contains_key(&mut self, key: &EncodedKey) -> crate::Result<bool>;
47
48 fn range_batched(
49 &mut self,
50 range: EncodedKeyRange,
51 batch_size: u64,
52 ) -> crate::Result<BoxedMultiVersionIter<'_>>;
53
54 fn range(&mut self, range: EncodedKeyRange) -> crate::Result<BoxedMultiVersionIter<'_>> {
55 self.range_batched(range, 1024)
56 }
57
58 fn range_rev_batched(
59 &mut self,
60 range: EncodedKeyRange,
61 batch_size: u64,
62 ) -> crate::Result<BoxedMultiVersionIter<'_>>;
63
64 fn range_rev(&mut self, range: EncodedKeyRange) -> crate::Result<BoxedMultiVersionIter<'_>> {
65 self.range_rev_batched(range, 1024)
66 }
67
68 fn prefix(&mut self, prefix: &EncodedKey) -> crate::Result<BoxedMultiVersionIter<'_>>;
69
70 fn prefix_rev(&mut self, prefix: &EncodedKey) -> crate::Result<BoxedMultiVersionIter<'_>>;
71
72 fn read_as_of_version_exclusive(&mut self, version: CommitVersion) -> crate::Result<()>;
73
74 fn read_as_of_version_inclusive(&mut self, version: CommitVersion) -> crate::Result<()> {
75 self.read_as_of_version_exclusive(CommitVersion(version.0 + 1))
76 }
77}
78
79pub trait MultiVersionCommandTransaction: MultiVersionQueryTransaction {
80 fn set(&mut self, key: &EncodedKey, row: EncodedValues) -> crate::Result<()>;
81
82 fn remove(&mut self, key: &EncodedKey) -> crate::Result<()>;
83
84 fn commit(self) -> crate::Result<CommitVersion>;
85
86 fn rollback(self) -> crate::Result<()>;
87}