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