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