reifydb_core/interface/transaction/
multi.rs1use async_trait::async_trait;
5
6use crate::{
7 CommitVersion, EncodedKey, EncodedKeyRange, TransactionId,
8 interface::{MultiVersionValues, WithEventBus},
9 value::encoded::EncodedValues,
10};
11
12#[derive(Debug, Clone)]
14pub struct MultiVersionBatch {
15 pub items: Vec<MultiVersionValues>,
17 pub has_more: bool,
19}
20
21impl MultiVersionBatch {
22 pub fn empty() -> Self {
24 Self {
25 items: Vec::new(),
26 has_more: false,
27 }
28 }
29
30 pub fn is_empty(&self) -> bool {
32 self.items.is_empty()
33 }
34}
35
36#[async_trait]
37pub trait MultiVersionTransaction: WithEventBus + Send + Sync + Clone + 'static {
38 type Query: MultiVersionQueryTransaction;
39 type Command: MultiVersionCommandTransaction;
40
41 async fn begin_query(&self) -> crate::Result<Self::Query>;
42
43 async fn begin_command(&self) -> crate::Result<Self::Command>;
44}
45
46#[async_trait]
47pub trait MultiVersionQueryTransaction: Send + Sync {
48 fn version(&self) -> CommitVersion;
49
50 fn id(&self) -> TransactionId;
51
52 async fn get(&mut self, key: &EncodedKey) -> crate::Result<Option<MultiVersionValues>>;
53
54 async fn contains_key(&mut self, key: &EncodedKey) -> crate::Result<bool>;
55
56 async fn range_batch(&mut self, range: EncodedKeyRange, batch_size: u64) -> crate::Result<MultiVersionBatch>;
57
58 async fn range(&mut self, range: EncodedKeyRange) -> crate::Result<MultiVersionBatch> {
59 self.range_batch(range, 1024).await
60 }
61
62 async fn range_rev_batch(
63 &mut self,
64 range: EncodedKeyRange,
65 batch_size: u64,
66 ) -> crate::Result<MultiVersionBatch>;
67
68 async fn range_rev(&mut self, range: EncodedKeyRange) -> crate::Result<MultiVersionBatch> {
69 self.range_rev_batch(range, 1024).await
70 }
71
72 async fn prefix(&mut self, prefix: &EncodedKey) -> crate::Result<MultiVersionBatch> {
73 self.range(EncodedKeyRange::prefix(prefix)).await
74 }
75
76 async fn prefix_rev(&mut self, prefix: &EncodedKey) -> crate::Result<MultiVersionBatch> {
77 self.range_rev(EncodedKeyRange::prefix(prefix)).await
78 }
79
80 async fn read_as_of_version_exclusive(&mut self, version: CommitVersion) -> crate::Result<()>;
81
82 async fn read_as_of_version_inclusive(&mut self, version: CommitVersion) -> crate::Result<()> {
83 self.read_as_of_version_exclusive(CommitVersion(version.0 + 1)).await
84 }
85}
86
87#[async_trait]
88pub trait MultiVersionCommandTransaction: MultiVersionQueryTransaction {
89 async fn set(&mut self, key: &EncodedKey, row: EncodedValues) -> crate::Result<()>;
90
91 async fn remove(&mut self, key: &EncodedKey) -> crate::Result<()>;
92
93 async fn commit(&mut self) -> crate::Result<CommitVersion>;
94
95 async fn rollback(&mut self) -> crate::Result<()>;
96}