reifydb_transaction/transaction/catalog/
procedure.rs1use reifydb_core::interface::catalog::{
5 change::CatalogTrackProcedureChangeOperations,
6 id::{NamespaceId, ProcedureId},
7 procedure::Procedure,
8};
9use reifydb_type::Result;
10
11use crate::{
12 change::{
13 Change,
14 OperationType::{Create, Delete, Update},
15 TransactionalProcedureChanges,
16 },
17 transaction::admin::AdminTransaction,
18};
19
20impl CatalogTrackProcedureChangeOperations for AdminTransaction {
21 fn track_procedure_created(&mut self, procedure: Procedure) -> Result<()> {
22 let change = Change {
23 pre: None,
24 post: Some(procedure),
25 op: Create,
26 };
27 self.changes.add_procedure_change(change);
28 Ok(())
29 }
30
31 fn track_procedure_updated(&mut self, pre: Procedure, post: Procedure) -> Result<()> {
32 let change = Change {
33 pre: Some(pre),
34 post: Some(post),
35 op: Update,
36 };
37 self.changes.add_procedure_change(change);
38 Ok(())
39 }
40
41 fn track_procedure_deleted(&mut self, procedure: Procedure) -> Result<()> {
42 let change = Change {
43 pre: Some(procedure),
44 post: None,
45 op: Delete,
46 };
47 self.changes.add_procedure_change(change);
48 Ok(())
49 }
50}
51
52impl TransactionalProcedureChanges for AdminTransaction {
53 fn find_procedure(&self, id: ProcedureId) -> Option<&Procedure> {
54 for change in self.changes.procedure.iter().rev() {
55 if let Some(procedure) = &change.post {
56 if procedure.id() == id {
57 return Some(procedure);
58 }
59 } else if let Some(procedure) = &change.pre
60 && procedure.id() == id && change.op == Delete
61 {
62 return None;
63 }
64 }
65 None
66 }
67
68 fn find_procedure_by_name(&self, namespace: NamespaceId, name: &str) -> Option<&Procedure> {
69 self.changes.procedure.iter().rev().find_map(|change| {
70 change.post.as_ref().filter(|p| p.namespace() == namespace && p.name() == name)
71 })
72 }
73
74 fn is_procedure_deleted(&self, id: ProcedureId) -> bool {
75 self.changes
76 .procedure
77 .iter()
78 .rev()
79 .any(|change| change.op == Delete && change.pre.as_ref().map(|p| p.id()) == Some(id))
80 }
81
82 fn is_procedure_deleted_by_name(&self, namespace: NamespaceId, name: &str) -> bool {
83 self.changes.procedure.iter().rev().any(|change| {
84 change.op == Delete
85 && change
86 .pre
87 .as_ref()
88 .map(|p| p.namespace() == namespace && p.name() == name)
89 .unwrap_or(false)
90 })
91 }
92}