reifydb_core/interface/transaction/
interceptor.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;
5use reifydb_type::RowNumber;
6
7use crate::{
8	CommitVersion, TransactionId,
9	interceptor::{
10		Chain, NamespaceDefPostCreateInterceptor, NamespaceDefPostUpdateInterceptor,
11		NamespaceDefPreDeleteInterceptor, NamespaceDefPreUpdateInterceptor, PostCommitInterceptor,
12		PreCommitInterceptor, RingBufferDefPostCreateInterceptor, RingBufferDefPostUpdateInterceptor,
13		RingBufferDefPreDeleteInterceptor, RingBufferDefPreUpdateInterceptor, RingBufferPostDeleteInterceptor,
14		RingBufferPostInsertInterceptor, RingBufferPostUpdateInterceptor, RingBufferPreDeleteInterceptor,
15		RingBufferPreInsertInterceptor, RingBufferPreUpdateInterceptor, TableDefPostCreateInterceptor,
16		TableDefPostUpdateInterceptor, TableDefPreDeleteInterceptor, TableDefPreUpdateInterceptor,
17		TablePostDeleteInterceptor, TablePostInsertInterceptor, TablePostUpdateInterceptor,
18		TablePreDeleteInterceptor, TablePreInsertInterceptor, TablePreUpdateInterceptor,
19		ViewDefPostCreateInterceptor, ViewDefPostUpdateInterceptor, ViewDefPreDeleteInterceptor,
20		ViewDefPreUpdateInterceptor,
21	},
22	interface::{
23		CommandTransaction, NamespaceDef, RingBufferDef, RowChange, TableDef, ViewDef,
24		transaction::change::TransactionalDefChanges,
25	},
26	value::encoded::EncodedValues,
27};
28
29#[async_trait]
30pub trait TableInterceptor<CT: CommandTransaction> {
31	/// Intercept table pre-insert operations
32	async fn pre_insert(&mut self, table: &TableDef, rn: RowNumber, row: &EncodedValues) -> crate::Result<()>;
33
34	/// Intercept table post-insert operations
35	async fn post_insert(&mut self, table: &TableDef, id: RowNumber, row: &EncodedValues) -> crate::Result<()>;
36
37	/// Intercept table pre-update operations
38	async fn pre_update(&mut self, table: &TableDef, id: RowNumber, row: &EncodedValues) -> crate::Result<()>;
39
40	/// Intercept table post-update operations
41	async fn post_update(
42		&mut self,
43		table: &TableDef,
44		id: RowNumber,
45		row: &EncodedValues,
46		old_row: &EncodedValues,
47	) -> crate::Result<()>;
48
49	/// Intercept table pre-delete operations
50	async fn pre_delete(&mut self, table: &TableDef, id: RowNumber) -> crate::Result<()>;
51
52	/// Intercept table post-delete operations
53	async fn post_delete(
54		&mut self,
55		table: &TableDef,
56		id: RowNumber,
57		deleted_row: &EncodedValues,
58	) -> crate::Result<()>;
59}
60
61#[async_trait]
62pub trait RingBufferInterceptor<CT: CommandTransaction> {
63	/// Intercept ring buffer pre-insert operations
64	async fn pre_insert(&mut self, ringbuffer: &RingBufferDef, row: &EncodedValues) -> crate::Result<()>;
65
66	/// Intercept ring buffer post-insert operations
67	async fn post_insert(
68		&mut self,
69		ringbuffer: &RingBufferDef,
70		id: RowNumber,
71		row: &EncodedValues,
72	) -> crate::Result<()>;
73
74	/// Intercept ring buffer pre-update operations
75	async fn pre_update(
76		&mut self,
77		ringbuffer: &RingBufferDef,
78		id: RowNumber,
79		row: &EncodedValues,
80	) -> crate::Result<()>;
81
82	/// Intercept ring buffer post-update operations
83	async fn post_update(
84		&mut self,
85		ringbuffer: &RingBufferDef,
86		id: RowNumber,
87		row: &EncodedValues,
88		old_row: &EncodedValues,
89	) -> crate::Result<()>;
90
91	/// Intercept ring buffer pre-delete operations
92	async fn pre_delete(&mut self, ringbuffer: &RingBufferDef, id: RowNumber) -> crate::Result<()>;
93
94	/// Intercept ring buffer post-delete operations
95	async fn post_delete(
96		&mut self,
97		ringbuffer: &RingBufferDef,
98		id: RowNumber,
99		deleted_row: &EncodedValues,
100	) -> crate::Result<()>;
101}
102
103#[async_trait]
104pub trait NamespaceDefInterceptor<CT: CommandTransaction> {
105	/// Intercept namespace post-create operations
106	async fn post_create(&mut self, post: &NamespaceDef) -> crate::Result<()>;
107
108	/// Intercept namespace pre-update operations
109	async fn pre_update(&mut self, pre: &NamespaceDef) -> crate::Result<()>;
110
111	/// Intercept namespace post-update operations
112	async fn post_update(&mut self, pre: &NamespaceDef, post: &NamespaceDef) -> crate::Result<()>;
113
114	/// Intercept namespace pre-delete operations
115	async fn pre_delete(&mut self, pre: &NamespaceDef) -> crate::Result<()>;
116}
117
118#[async_trait]
119pub trait TableDefInterceptor<CT: CommandTransaction> {
120	/// Intercept table definition post-create operations
121	async fn post_create(&mut self, post: &TableDef) -> crate::Result<()>;
122
123	/// Intercept table definition pre-update operations
124	async fn pre_update(&mut self, pre: &TableDef) -> crate::Result<()>;
125
126	/// Intercept table definition post-update operations
127	async fn post_update(&mut self, pre: &TableDef, post: &TableDef) -> crate::Result<()>;
128
129	/// Intercept table definition pre-delete operations
130	async fn pre_delete(&mut self, pre: &TableDef) -> crate::Result<()>;
131}
132
133#[async_trait]
134pub trait ViewDefInterceptor<CT: CommandTransaction> {
135	/// Intercept view post-create operations
136	async fn post_create(&mut self, post: &ViewDef) -> crate::Result<()>;
137
138	/// Intercept view pre-update operations
139	async fn pre_update(&mut self, pre: &ViewDef) -> crate::Result<()>;
140
141	/// Intercept view post-update operations
142	async fn post_update(&mut self, pre: &ViewDef, post: &ViewDef) -> crate::Result<()>;
143
144	/// Intercept view pre-delete operations
145	async fn pre_delete(&mut self, pre: &ViewDef) -> crate::Result<()>;
146}
147
148#[async_trait]
149pub trait RingBufferDefInterceptor<CT: CommandTransaction> {
150	/// Intercept ring buffer definition post-create operations
151	async fn post_create(&mut self, post: &RingBufferDef) -> crate::Result<()>;
152
153	/// Intercept ring buffer definition pre-update operations
154	async fn pre_update(&mut self, pre: &RingBufferDef) -> crate::Result<()>;
155
156	/// Intercept ring buffer definition post-update operations
157	async fn post_update(&mut self, pre: &RingBufferDef, post: &RingBufferDef) -> crate::Result<()>;
158
159	/// Intercept ring buffer definition pre-delete operations
160	async fn pre_delete(&mut self, pre: &RingBufferDef) -> crate::Result<()>;
161}
162
163#[async_trait]
164pub trait TransactionInterceptor<CT: CommandTransaction> {
165	/// Intercept pre-commit operations
166	async fn pre_commit(&mut self) -> crate::Result<()>;
167
168	/// Intercept post-commit operations
169	async fn post_commit(
170		&mut self,
171		id: TransactionId,
172		version: CommitVersion,
173		changes: TransactionalDefChanges,
174		row_changes: Vec<RowChange>,
175	) -> crate::Result<()>;
176}
177
178/// Trait for accessing interceptor chains from transaction types
179pub trait WithInterceptors<CT: CommandTransaction> {
180	/// Access table pre-insert interceptor chain
181	fn table_pre_insert_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreInsertInterceptor<CT> + Send + Sync>;
182
183	/// Access table post-insert interceptor chain
184	fn table_post_insert_interceptors(
185		&mut self,
186	) -> &mut Chain<CT, dyn TablePostInsertInterceptor<CT> + Send + Sync>;
187
188	/// Access table pre-update interceptor chain
189	fn table_pre_update_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreUpdateInterceptor<CT> + Send + Sync>;
190
191	/// Access table post-update interceptor chain
192	fn table_post_update_interceptors(
193		&mut self,
194	) -> &mut Chain<CT, dyn TablePostUpdateInterceptor<CT> + Send + Sync>;
195
196	/// Access table pre-delete interceptor chain
197	fn table_pre_delete_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreDeleteInterceptor<CT> + Send + Sync>;
198
199	/// Access table post-delete interceptor chain
200	fn table_post_delete_interceptors(
201		&mut self,
202	) -> &mut Chain<CT, dyn TablePostDeleteInterceptor<CT> + Send + Sync>;
203
204	/// Access ring buffer pre-insert interceptor chain
205	fn ringbuffer_pre_insert_interceptors(
206		&mut self,
207	) -> &mut Chain<CT, dyn RingBufferPreInsertInterceptor<CT> + Send + Sync>;
208
209	/// Access ring buffer post-insert interceptor chain
210	fn ringbuffer_post_insert_interceptors(
211		&mut self,
212	) -> &mut Chain<CT, dyn RingBufferPostInsertInterceptor<CT> + Send + Sync>;
213
214	/// Access ring buffer pre-update interceptor chain
215	fn ringbuffer_pre_update_interceptors(
216		&mut self,
217	) -> &mut Chain<CT, dyn RingBufferPreUpdateInterceptor<CT> + Send + Sync>;
218
219	/// Access ring buffer post-update interceptor chain
220	fn ringbuffer_post_update_interceptors(
221		&mut self,
222	) -> &mut Chain<CT, dyn RingBufferPostUpdateInterceptor<CT> + Send + Sync>;
223
224	/// Access ring buffer pre-delete interceptor chain
225	fn ringbuffer_pre_delete_interceptors(
226		&mut self,
227	) -> &mut Chain<CT, dyn RingBufferPreDeleteInterceptor<CT> + Send + Sync>;
228
229	/// Access ring buffer post-delete interceptor chain
230	fn ringbuffer_post_delete_interceptors(
231		&mut self,
232	) -> &mut Chain<CT, dyn RingBufferPostDeleteInterceptor<CT> + Send + Sync>;
233
234	/// Access pre-commit interceptor chain
235	fn pre_commit_interceptors(&mut self) -> &mut Chain<CT, dyn PreCommitInterceptor<CT> + Send + Sync>;
236
237	/// Access post-commit interceptor chain
238	fn post_commit_interceptors(&mut self) -> &mut Chain<CT, dyn PostCommitInterceptor<CT> + Send + Sync>;
239
240	// Namespace definition interceptor chains
241	/// Access namespace post-create interceptor chain
242	fn namespace_def_post_create_interceptors(
243		&mut self,
244	) -> &mut Chain<CT, dyn NamespaceDefPostCreateInterceptor<CT> + Send + Sync>;
245
246	/// Access namespace pre-update interceptor chain
247	fn namespace_def_pre_update_interceptors(
248		&mut self,
249	) -> &mut Chain<CT, dyn NamespaceDefPreUpdateInterceptor<CT> + Send + Sync>;
250
251	/// Access namespace post-update interceptor chain
252	fn namespace_def_post_update_interceptors(
253		&mut self,
254	) -> &mut Chain<CT, dyn NamespaceDefPostUpdateInterceptor<CT> + Send + Sync>;
255
256	/// Access namespace pre-delete interceptor chain
257	fn namespace_def_pre_delete_interceptors(
258		&mut self,
259	) -> &mut Chain<CT, dyn NamespaceDefPreDeleteInterceptor<CT> + Send + Sync>;
260
261	// Table definition interceptor chains
262	/// Access table definition post-create interceptor chain
263	fn table_def_post_create_interceptors(
264		&mut self,
265	) -> &mut Chain<CT, dyn TableDefPostCreateInterceptor<CT> + Send + Sync>;
266
267	/// Access table definition pre-update interceptor chain
268	fn table_def_pre_update_interceptors(
269		&mut self,
270	) -> &mut Chain<CT, dyn TableDefPreUpdateInterceptor<CT> + Send + Sync>;
271
272	/// Access table definition post-update interceptor chain
273	fn table_def_post_update_interceptors(
274		&mut self,
275	) -> &mut Chain<CT, dyn TableDefPostUpdateInterceptor<CT> + Send + Sync>;
276
277	/// Access table definition pre-delete interceptor chain
278	fn table_def_pre_delete_interceptors(
279		&mut self,
280	) -> &mut Chain<CT, dyn TableDefPreDeleteInterceptor<CT> + Send + Sync>;
281
282	// View definition interceptor chains
283	/// Access view post-create interceptor chain
284	fn view_def_post_create_interceptors(
285		&mut self,
286	) -> &mut Chain<CT, dyn ViewDefPostCreateInterceptor<CT> + Send + Sync>;
287
288	/// Access view pre-update interceptor chain
289	fn view_def_pre_update_interceptors(
290		&mut self,
291	) -> &mut Chain<CT, dyn ViewDefPreUpdateInterceptor<CT> + Send + Sync>;
292
293	/// Access view post-update interceptor chain
294	fn view_def_post_update_interceptors(
295		&mut self,
296	) -> &mut Chain<CT, dyn ViewDefPostUpdateInterceptor<CT> + Send + Sync>;
297
298	/// Access view pre-delete interceptor chain
299	fn view_def_pre_delete_interceptors(
300		&mut self,
301	) -> &mut Chain<CT, dyn ViewDefPreDeleteInterceptor<CT> + Send + Sync>;
302
303	// Ring buffer definition interceptor chains
304	/// Access ring buffer definition post-create interceptor chain
305	fn ringbuffer_def_post_create_interceptors(
306		&mut self,
307	) -> &mut Chain<CT, dyn RingBufferDefPostCreateInterceptor<CT> + Send + Sync>;
308
309	/// Access ring buffer definition pre-update interceptor chain
310	fn ringbuffer_def_pre_update_interceptors(
311		&mut self,
312	) -> &mut Chain<CT, dyn RingBufferDefPreUpdateInterceptor<CT> + Send + Sync>;
313
314	/// Access ring buffer definition post-update interceptor chain
315	fn ringbuffer_def_post_update_interceptors(
316		&mut self,
317	) -> &mut Chain<CT, dyn RingBufferDefPostUpdateInterceptor<CT> + Send + Sync>;
318
319	/// Access ring buffer definition pre-delete interceptor chain
320	fn ringbuffer_def_pre_delete_interceptors(
321		&mut self,
322	) -> &mut Chain<CT, dyn RingBufferDefPreDeleteInterceptor<CT> + Send + Sync>;
323}