Skip to main content

reifydb_transaction/transaction/catalog/
binding.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2025 ReifyDB
3
4use 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}