reifydb_core/interface/transaction/
transaction.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 super::change::TransactionalDefChanges;
5use crate::{
6	EncodedKey,
7	interface::{
8		CdcQueryTransaction, MultiVersionCommandTransaction, MultiVersionQueryTransaction,
9		SingleVersionCommandTransaction, SingleVersionQueryTransaction,
10	},
11};
12
13pub trait CommandTransaction: MultiVersionCommandTransaction + QueryTransaction {
14	type SingleVersionCommand<'a>: SingleVersionCommandTransaction
15	where
16		Self: 'a;
17
18	fn begin_single_command<'a, I>(&self, keys: I) -> crate::Result<Self::SingleVersionCommand<'_>>
19	where
20		I: IntoIterator<Item = &'a EncodedKey>;
21
22	fn with_single_command<'a, I, F, R>(&self, keys: I, f: F) -> crate::Result<R>
23	where
24		I: IntoIterator<Item = &'a EncodedKey>,
25		F: FnOnce(&mut Self::SingleVersionCommand<'_>) -> crate::Result<R>,
26	{
27		let mut tx = self.begin_single_command(keys)?;
28		let result = f(&mut tx)?;
29		tx.commit()?;
30		Ok(result)
31	}
32
33	/// Get reference to catalog changes for this transaction
34	fn get_changes(&self) -> &TransactionalDefChanges;
35}
36
37pub trait QueryTransaction: MultiVersionQueryTransaction {
38	type SingleVersionQuery<'a>: SingleVersionQueryTransaction
39	where
40		Self: 'a;
41
42	type CdcQuery<'a>: CdcQueryTransaction
43	where
44		Self: 'a;
45
46	fn begin_single_query<'a, I>(&self, keys: I) -> crate::Result<Self::SingleVersionQuery<'_>>
47	where
48		I: IntoIterator<Item = &'a EncodedKey>;
49
50	fn begin_cdc_query(&self) -> crate::Result<Self::CdcQuery<'_>>;
51
52	fn with_single_query<'a, I, F, R>(&self, keys: I, f: F) -> crate::Result<R>
53	where
54		I: IntoIterator<Item = &'a EncodedKey>,
55		F: FnOnce(&mut Self::SingleVersionQuery<'_>) -> crate::Result<R>,
56	{
57		let mut tx = self.begin_single_query(keys)?;
58		let result = f(&mut tx)?;
59		Ok(result)
60	}
61
62	fn with_cdc_query<F, R>(&self, f: F) -> crate::Result<R>
63	where
64		F: FnOnce(&mut Self::CdcQuery<'_>) -> crate::Result<R>,
65	{
66		let mut tx = self.begin_cdc_query()?;
67		let result = f(&mut tx)?;
68		Ok(result)
69	}
70}