reifydb_core/interface/transaction/
multi.rs

1// Copyright (c) reifydb.com 2025
2// This file is licensed under the AGPL-3.0-or-later, see license.md file
3
4use async_trait::async_trait;
5
6use crate::{
7	CommitVersion, EncodedKey, EncodedKeyRange, TransactionId,
8	interface::{MultiVersionValues, WithEventBus},
9	value::encoded::EncodedValues,
10};
11
12/// A batch of multi-version values with continuation info.
13#[derive(Debug, Clone)]
14pub struct MultiVersionBatch {
15	/// The values in this batch.
16	pub items: Vec<MultiVersionValues>,
17	/// Whether there are more items after this batch.
18	pub has_more: bool,
19}
20
21impl MultiVersionBatch {
22	/// Creates an empty batch with no more results.
23	pub fn empty() -> Self {
24		Self {
25			items: Vec::new(),
26			has_more: false,
27		}
28	}
29
30	/// Returns true if this batch contains no items.
31	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}