1use 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 async fn pre_insert(&mut self, table: &TableDef, rn: RowNumber, row: &EncodedValues) -> crate::Result<()>;
33
34 async fn post_insert(&mut self, table: &TableDef, id: RowNumber, row: &EncodedValues) -> crate::Result<()>;
36
37 async fn pre_update(&mut self, table: &TableDef, id: RowNumber, row: &EncodedValues) -> crate::Result<()>;
39
40 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 async fn pre_delete(&mut self, table: &TableDef, id: RowNumber) -> crate::Result<()>;
51
52 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 async fn pre_insert(&mut self, ringbuffer: &RingBufferDef, row: &EncodedValues) -> crate::Result<()>;
65
66 async fn post_insert(
68 &mut self,
69 ringbuffer: &RingBufferDef,
70 id: RowNumber,
71 row: &EncodedValues,
72 ) -> crate::Result<()>;
73
74 async fn pre_update(
76 &mut self,
77 ringbuffer: &RingBufferDef,
78 id: RowNumber,
79 row: &EncodedValues,
80 ) -> crate::Result<()>;
81
82 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 async fn pre_delete(&mut self, ringbuffer: &RingBufferDef, id: RowNumber) -> crate::Result<()>;
93
94 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 async fn post_create(&mut self, post: &NamespaceDef) -> crate::Result<()>;
107
108 async fn pre_update(&mut self, pre: &NamespaceDef) -> crate::Result<()>;
110
111 async fn post_update(&mut self, pre: &NamespaceDef, post: &NamespaceDef) -> crate::Result<()>;
113
114 async fn pre_delete(&mut self, pre: &NamespaceDef) -> crate::Result<()>;
116}
117
118#[async_trait]
119pub trait TableDefInterceptor<CT: CommandTransaction> {
120 async fn post_create(&mut self, post: &TableDef) -> crate::Result<()>;
122
123 async fn pre_update(&mut self, pre: &TableDef) -> crate::Result<()>;
125
126 async fn post_update(&mut self, pre: &TableDef, post: &TableDef) -> crate::Result<()>;
128
129 async fn pre_delete(&mut self, pre: &TableDef) -> crate::Result<()>;
131}
132
133#[async_trait]
134pub trait ViewDefInterceptor<CT: CommandTransaction> {
135 async fn post_create(&mut self, post: &ViewDef) -> crate::Result<()>;
137
138 async fn pre_update(&mut self, pre: &ViewDef) -> crate::Result<()>;
140
141 async fn post_update(&mut self, pre: &ViewDef, post: &ViewDef) -> crate::Result<()>;
143
144 async fn pre_delete(&mut self, pre: &ViewDef) -> crate::Result<()>;
146}
147
148#[async_trait]
149pub trait RingBufferDefInterceptor<CT: CommandTransaction> {
150 async fn post_create(&mut self, post: &RingBufferDef) -> crate::Result<()>;
152
153 async fn pre_update(&mut self, pre: &RingBufferDef) -> crate::Result<()>;
155
156 async fn post_update(&mut self, pre: &RingBufferDef, post: &RingBufferDef) -> crate::Result<()>;
158
159 async fn pre_delete(&mut self, pre: &RingBufferDef) -> crate::Result<()>;
161}
162
163#[async_trait]
164pub trait TransactionInterceptor<CT: CommandTransaction> {
165 async fn pre_commit(&mut self) -> crate::Result<()>;
167
168 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
178pub trait WithInterceptors<CT: CommandTransaction> {
180 fn table_pre_insert_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreInsertInterceptor<CT> + Send + Sync>;
182
183 fn table_post_insert_interceptors(
185 &mut self,
186 ) -> &mut Chain<CT, dyn TablePostInsertInterceptor<CT> + Send + Sync>;
187
188 fn table_pre_update_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreUpdateInterceptor<CT> + Send + Sync>;
190
191 fn table_post_update_interceptors(
193 &mut self,
194 ) -> &mut Chain<CT, dyn TablePostUpdateInterceptor<CT> + Send + Sync>;
195
196 fn table_pre_delete_interceptors(&mut self) -> &mut Chain<CT, dyn TablePreDeleteInterceptor<CT> + Send + Sync>;
198
199 fn table_post_delete_interceptors(
201 &mut self,
202 ) -> &mut Chain<CT, dyn TablePostDeleteInterceptor<CT> + Send + Sync>;
203
204 fn ringbuffer_pre_insert_interceptors(
206 &mut self,
207 ) -> &mut Chain<CT, dyn RingBufferPreInsertInterceptor<CT> + Send + Sync>;
208
209 fn ringbuffer_post_insert_interceptors(
211 &mut self,
212 ) -> &mut Chain<CT, dyn RingBufferPostInsertInterceptor<CT> + Send + Sync>;
213
214 fn ringbuffer_pre_update_interceptors(
216 &mut self,
217 ) -> &mut Chain<CT, dyn RingBufferPreUpdateInterceptor<CT> + Send + Sync>;
218
219 fn ringbuffer_post_update_interceptors(
221 &mut self,
222 ) -> &mut Chain<CT, dyn RingBufferPostUpdateInterceptor<CT> + Send + Sync>;
223
224 fn ringbuffer_pre_delete_interceptors(
226 &mut self,
227 ) -> &mut Chain<CT, dyn RingBufferPreDeleteInterceptor<CT> + Send + Sync>;
228
229 fn ringbuffer_post_delete_interceptors(
231 &mut self,
232 ) -> &mut Chain<CT, dyn RingBufferPostDeleteInterceptor<CT> + Send + Sync>;
233
234 fn pre_commit_interceptors(&mut self) -> &mut Chain<CT, dyn PreCommitInterceptor<CT> + Send + Sync>;
236
237 fn post_commit_interceptors(&mut self) -> &mut Chain<CT, dyn PostCommitInterceptor<CT> + Send + Sync>;
239
240 fn namespace_def_post_create_interceptors(
243 &mut self,
244 ) -> &mut Chain<CT, dyn NamespaceDefPostCreateInterceptor<CT> + Send + Sync>;
245
246 fn namespace_def_pre_update_interceptors(
248 &mut self,
249 ) -> &mut Chain<CT, dyn NamespaceDefPreUpdateInterceptor<CT> + Send + Sync>;
250
251 fn namespace_def_post_update_interceptors(
253 &mut self,
254 ) -> &mut Chain<CT, dyn NamespaceDefPostUpdateInterceptor<CT> + Send + Sync>;
255
256 fn namespace_def_pre_delete_interceptors(
258 &mut self,
259 ) -> &mut Chain<CT, dyn NamespaceDefPreDeleteInterceptor<CT> + Send + Sync>;
260
261 fn table_def_post_create_interceptors(
264 &mut self,
265 ) -> &mut Chain<CT, dyn TableDefPostCreateInterceptor<CT> + Send + Sync>;
266
267 fn table_def_pre_update_interceptors(
269 &mut self,
270 ) -> &mut Chain<CT, dyn TableDefPreUpdateInterceptor<CT> + Send + Sync>;
271
272 fn table_def_post_update_interceptors(
274 &mut self,
275 ) -> &mut Chain<CT, dyn TableDefPostUpdateInterceptor<CT> + Send + Sync>;
276
277 fn table_def_pre_delete_interceptors(
279 &mut self,
280 ) -> &mut Chain<CT, dyn TableDefPreDeleteInterceptor<CT> + Send + Sync>;
281
282 fn view_def_post_create_interceptors(
285 &mut self,
286 ) -> &mut Chain<CT, dyn ViewDefPostCreateInterceptor<CT> + Send + Sync>;
287
288 fn view_def_pre_update_interceptors(
290 &mut self,
291 ) -> &mut Chain<CT, dyn ViewDefPreUpdateInterceptor<CT> + Send + Sync>;
292
293 fn view_def_post_update_interceptors(
295 &mut self,
296 ) -> &mut Chain<CT, dyn ViewDefPostUpdateInterceptor<CT> + Send + Sync>;
297
298 fn view_def_pre_delete_interceptors(
300 &mut self,
301 ) -> &mut Chain<CT, dyn ViewDefPreDeleteInterceptor<CT> + Send + Sync>;
302
303 fn ringbuffer_def_post_create_interceptors(
306 &mut self,
307 ) -> &mut Chain<CT, dyn RingBufferDefPostCreateInterceptor<CT> + Send + Sync>;
308
309 fn ringbuffer_def_pre_update_interceptors(
311 &mut self,
312 ) -> &mut Chain<CT, dyn RingBufferDefPreUpdateInterceptor<CT> + Send + Sync>;
313
314 fn ringbuffer_def_post_update_interceptors(
316 &mut self,
317 ) -> &mut Chain<CT, dyn RingBufferDefPostUpdateInterceptor<CT> + Send + Sync>;
318
319 fn ringbuffer_def_pre_delete_interceptors(
321 &mut self,
322 ) -> &mut Chain<CT, dyn RingBufferDefPreDeleteInterceptor<CT> + Send + Sync>;
323}