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 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(&mut self, range: EncodedKeyRange, batch_size: u64) -> crate::Result<BoxedMultiVersionIter>;
49
50	fn range(&mut self, range: EncodedKeyRange) -> crate::Result<BoxedMultiVersionIter> {
51		self.range_batched(range, 1024)
52	}
53
54	fn range_rev_batched(
55		&mut self,
56		range: EncodedKeyRange,
57		batch_size: u64,
58	) -> crate::Result<BoxedMultiVersionIter>;
59
60	fn range_rev(&mut self, range: EncodedKeyRange) -> crate::Result<BoxedMultiVersionIter> {
61		self.range_rev_batched(range, 1024)
62	}
63
64	fn prefix(&mut self, prefix: &EncodedKey) -> crate::Result<BoxedMultiVersionIter>;
65
66	fn prefix_rev(&mut self, prefix: &EncodedKey) -> crate::Result<BoxedMultiVersionIter>;
67
68	fn read_as_of_version_exclusive(&mut self, version: CommitVersion) -> crate::Result<()>;
69
70	fn read_as_of_version_inclusive(&mut self, version: CommitVersion) -> crate::Result<()> {
71		self.read_as_of_version_exclusive(CommitVersion(version.0 + 1))
72	}
73}
74
75pub trait MultiVersionCommandTransaction: MultiVersionQueryTransaction {
76	fn set(&mut self, key: &EncodedKey, row: EncodedValues) -> crate::Result<()>;
77
78	fn remove(&mut self, key: &EncodedKey) -> crate::Result<()>;
79
80	fn commit(self) -> crate::Result<CommitVersion>;
81
82	fn rollback(self) -> crate::Result<()>;
83}