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, RingBufferPostDeleteInterceptor, RingBufferPostInsertInterceptor,
12		RingBufferPostUpdateInterceptor, RingBufferPreDeleteInterceptor, RingBufferPreInsertInterceptor,
13		RingBufferPreUpdateInterceptor, TableDefPostCreateInterceptor, TableDefPostUpdateInterceptor,
14		TableDefPreDeleteInterceptor, TableDefPreUpdateInterceptor, TablePostDeleteInterceptor,
15		TablePostInsertInterceptor, TablePostUpdateInterceptor, TablePreDeleteInterceptor,
16		TablePreInsertInterceptor, TablePreUpdateInterceptor, ViewDefPostCreateInterceptor,
17		ViewDefPostUpdateInterceptor, ViewDefPreDeleteInterceptor, ViewDefPreUpdateInterceptor,
18	},
19	interface::{
20		CommandTransaction, NamespaceDef, RingBufferDef, TableDef, ViewDef,
21		transaction::change::TransactionalDefChanges,
22	},
23	value::encoded::EncodedValues,
24};
25
26pub trait TableInterceptor<CT: CommandTransaction> {
27	/// Intercept table pre-insert operations
28	fn pre_insert(&mut self, table: &TableDef, row: &EncodedValues) -> crate::Result<()>;
29
30	/// Intercept table post-insert operations
31	fn post_insert(&mut self, table: &TableDef, id: RowNumber, row: &EncodedValues) -> crate::Result<()>;
32
33	/// Intercept table pre-update operations
34	fn pre_update(&mut self, table: &TableDef, id: RowNumber, row: &EncodedValues) -> crate::Result<()>;
35
36	/// Intercept table post-update operations
37	fn post_update(
38		&mut self,
39		table: &TableDef,
40		id: RowNumber,
41		row: &EncodedValues,
42		old_row: &EncodedValues,
43	) -> crate::Result<()>;
44
45	/// Intercept table pre-delete operations
46	fn pre_delete(&mut self, table: &TableDef, id: RowNumber) -> crate::Result<()>;
47
48	/// Intercept table post-delete operations
49	fn post_delete(&mut self, table: &TableDef, id: RowNumber, deleted_row: &EncodedValues) -> crate::Result<()>;
50}
51
52pub trait RingBufferInterceptor<CT: CommandTransaction> {
53	/// Intercept ring buffer pre-insert operations
54	fn pre_insert(&mut self, ring_buffer: &RingBufferDef, row: &EncodedValues) -> crate::Result<()>;
55
56	/// Intercept ring buffer post-insert operations
57	fn post_insert(&mut self, ring_buffer: &RingBufferDef, id: RowNumber, row: &EncodedValues)
58	-> crate::Result<()>;
59
60	/// Intercept ring buffer pre-update operations
61	fn pre_update(&mut self, ring_buffer: &RingBufferDef, id: RowNumber, row: &EncodedValues) -> crate::Result<()>;
62
63	/// Intercept ring buffer post-update operations
64	fn post_update(
65		&mut self,
66		ring_buffer: &RingBufferDef,
67		id: RowNumber,
68		row: &EncodedValues,
69		old_row: &EncodedValues,
70	) -> crate::Result<()>;
71
72	/// Intercept ring buffer pre-delete operations
73	fn pre_delete(&mut self, ring_buffer: &RingBufferDef, id: RowNumber) -> crate::Result<()>;
74
75	/// Intercept ring buffer post-delete operations
76	fn post_delete(
77		&mut self,
78		ring_buffer: &RingBufferDef,
79		id: RowNumber,
80		deleted_row: &EncodedValues,
81	) -> crate::Result<()>;
82}
83
84pub trait NamespaceDefInterceptor<CT: CommandTransaction> {
85	/// Intercept namespace post-create operations
86	fn post_create(&mut self, post: &NamespaceDef) -> crate::Result<()>;
87
88	/// Intercept namespace pre-update operations
89	fn pre_update(&mut self, pre: &NamespaceDef) -> crate::Result<()>;
90
91	/// Intercept namespace post-update operations
92	fn post_update(&mut self, pre: &NamespaceDef, post: &NamespaceDef) -> crate::Result<()>;
93
94	/// Intercept namespace pre-delete operations
95	fn pre_delete(&mut self, pre: &NamespaceDef) -> crate::Result<()>;
96}
97
98pub trait TableDefInterceptor<CT: CommandTransaction> {
99	/// Intercept table definition post-create operations
100	fn post_create(&mut self, post: &TableDef) -> crate::Result<()>;
101
102	/// Intercept table definition pre-update operations
103	fn pre_update(&mut self, pre: &TableDef) -> crate::Result<()>;
104
105	/// Intercept table definition post-update operations
106	fn post_update(&mut self, pre: &TableDef, post: &TableDef) -> crate::Result<()>;
107
108	/// Intercept table definition pre-delete operations
109	fn pre_delete(&mut self, pre: &TableDef) -> crate::Result<()>;
110}
111
112pub trait ViewDefInterceptor<CT: CommandTransaction> {
113	/// Intercept view post-create operations
114	fn post_create(&mut self, post: &ViewDef) -> crate::Result<()>;
115
116	/// Intercept view pre-update operations
117	fn pre_update(&mut self, pre: &ViewDef) -> crate::Result<()>;
118
119	/// Intercept view post-update operations
120	fn post_update(&mut self, pre: &ViewDef, post: &ViewDef) -> crate::Result<()>;
121
122	/// Intercept view pre-delete operations
123	fn pre_delete(&mut self, pre: &ViewDef) -> crate::Result<()>;
124}
125
126pub trait TransactionInterceptor<CT: CommandTransaction> {
127	/// Intercept pre-commit operations
128	fn pre_commit(&mut self) -> crate::Result<()>;
129
130	/// Intercept post-commit operations
131	fn post_commit(
132		&mut self,
133		id: TransactionId,
134		version: CommitVersion,
135		changes: TransactionalDefChanges,
136	) -> crate::Result<()>;
137}
138
139/// Trait for accessing interceptor chains from transaction types
140pub trait WithInterceptors<CT: CommandTransaction> {
141	/// Access table pre-insert interceptor chain
142	fn table_pre_insert_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreInsertInterceptor<CT>>;
143
144	/// Access table post-insert interceptor chain
145	fn table_post_insert_interceptors(&mut self) -> &mut Chain<CT, dyn TablePostInsertInterceptor<CT>>;
146
147	/// Access table pre-update interceptor chain
148	fn table_pre_update_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreUpdateInterceptor<CT>>;
149
150	/// Access table post-update interceptor chain
151	fn table_post_update_interceptors(&mut self) -> &mut Chain<CT, dyn TablePostUpdateInterceptor<CT>>;
152
153	/// Access table pre-delete interceptor chain
154	fn table_pre_delete_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreDeleteInterceptor<CT>>;
155
156	/// Access table post-delete interceptor chain
157	fn table_post_delete_interceptors(&mut self) -> &mut Chain<CT, dyn TablePostDeleteInterceptor<CT>>;
158
159	/// Access ring buffer pre-insert interceptor chain
160	fn ring_buffer_pre_insert_interceptors(&mut self) -> &mut Chain<CT, dyn RingBufferPreInsertInterceptor<CT>>;
161
162	/// Access ring buffer post-insert interceptor chain
163	fn ring_buffer_post_insert_interceptors(&mut self) -> &mut Chain<CT, dyn RingBufferPostInsertInterceptor<CT>>;
164
165	/// Access ring buffer pre-update interceptor chain
166	fn ring_buffer_pre_update_interceptors(&mut self) -> &mut Chain<CT, dyn RingBufferPreUpdateInterceptor<CT>>;
167
168	/// Access ring buffer post-update interceptor chain
169	fn ring_buffer_post_update_interceptors(&mut self) -> &mut Chain<CT, dyn RingBufferPostUpdateInterceptor<CT>>;
170
171	/// Access ring buffer pre-delete interceptor chain
172	fn ring_buffer_pre_delete_interceptors(&mut self) -> &mut Chain<CT, dyn RingBufferPreDeleteInterceptor<CT>>;
173
174	/// Access ring buffer post-delete interceptor chain
175	fn ring_buffer_post_delete_interceptors(&mut self) -> &mut Chain<CT, dyn RingBufferPostDeleteInterceptor<CT>>;
176
177	/// Access pre-commit interceptor chain
178	fn pre_commit_interceptors(&mut self) -> &mut Chain<CT, dyn PreCommitInterceptor<CT>>;
179
180	/// Access post-commit interceptor chain
181	fn post_commit_interceptors(&mut self) -> &mut Chain<CT, dyn PostCommitInterceptor<CT>>;
182
183	// Namespace definition interceptor chains
184	/// Access namespace post-create interceptor chain
185	fn namespace_def_post_create_interceptors(
186		&mut self,
187	) -> &mut Chain<CT, dyn NamespaceDefPostCreateInterceptor<CT>>;
188
189	/// Access namespace pre-update interceptor chain
190	fn namespace_def_pre_update_interceptors(&mut self)
191	-> &mut Chain<CT, dyn NamespaceDefPreUpdateInterceptor<CT>>;
192
193	/// Access namespace post-update interceptor chain
194	fn namespace_def_post_update_interceptors(
195		&mut self,
196	) -> &mut Chain<CT, dyn NamespaceDefPostUpdateInterceptor<CT>>;
197
198	/// Access namespace pre-delete interceptor chain
199	fn namespace_def_pre_delete_interceptors(&mut self)
200	-> &mut Chain<CT, dyn NamespaceDefPreDeleteInterceptor<CT>>;
201
202	// Table definition interceptor chains
203	/// Access table definition post-create interceptor chain
204	fn table_def_post_create_interceptors(&mut self) -> &mut Chain<CT, dyn TableDefPostCreateInterceptor<CT>>;
205
206	/// Access table definition pre-update interceptor chain
207	fn table_def_pre_update_interceptors(&mut self) -> &mut Chain<CT, dyn TableDefPreUpdateInterceptor<CT>>;
208
209	/// Access table definition post-update interceptor chain
210	fn table_def_post_update_interceptors(&mut self) -> &mut Chain<CT, dyn TableDefPostUpdateInterceptor<CT>>;
211
212	/// Access table definition pre-delete interceptor chain
213	fn table_def_pre_delete_interceptors(&mut self) -> &mut Chain<CT, dyn TableDefPreDeleteInterceptor<CT>>;
214
215	// View definition interceptor chains
216	/// Access view post-create interceptor chain
217	fn view_def_post_create_interceptors(&mut self) -> &mut Chain<CT, dyn ViewDefPostCreateInterceptor<CT>>;
218
219	/// Access view pre-update interceptor chain
220	fn view_def_pre_update_interceptors(&mut self) -> &mut Chain<CT, dyn ViewDefPreUpdateInterceptor<CT>>;
221
222	/// Access view post-update interceptor chain
223	fn view_def_post_update_interceptors(&mut self) -> &mut Chain<CT, dyn ViewDefPostUpdateInterceptor<CT>>;
224
225	/// Access view pre-delete interceptor chain
226	fn view_def_pre_delete_interceptors(&mut self) -> &mut Chain<CT, dyn ViewDefPreDeleteInterceptor<CT>>;
227}