Skip to main content

uqa_sql/catalog/roles/dependencies/
context.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Retained catalog inputs for ordered role dependency checks.
8
9use crate::{
10    catalog::{
11        security::{
12            database::BoundDatabaseSecurity, BoundSchemaSecurity, BoundSequenceSecurity,
13            BoundTableSecurity,
14        },
15        stored_view::StoredView,
16    },
17    routines::SQLUserFunction,
18};
19use std::{collections::BTreeMap, ops::Deref, sync::Arc};
20use uqa_core::RelationIdentity;
21
22pub type RoleDependencyRead<'a, T> = Box<dyn Deref<Target = T> + 'a>;
23/// Table security is read lazily at each visited role and relation pair.
24pub trait RoleTableSecurity {
25    fn security(&self) -> BoundTableSecurity;
26    fn persistence(&self) -> crate::ast::RelationPersistence;
27}
28/// The iterator borrows its entries while the original table registry guard is retained.
29pub trait RoleTablesRead {
30    fn iter(&self) -> Box<dyn Iterator<Item = (&RelationIdentity, &dyn RoleTableSecurity)> + '_>;
31}
32pub trait RoleDependencyCatalog:
33    crate::catalog::security::system_relations::SystemRelationSecurityCatalog
34{
35    fn database(&self) -> RoleDependencyRead<'_, BoundDatabaseSecurity>;
36    fn schemas(&self) -> RoleDependencyRead<'_, BTreeMap<String, BoundSchemaSecurity>>;
37    fn tables(&self) -> Box<dyn RoleTablesRead + '_>;
38    fn views(&self) -> RoleDependencyRead<'_, BTreeMap<RelationIdentity, StoredView>>;
39    fn foreign_tables(
40        &self,
41    ) -> RoleDependencyRead<'_, BTreeMap<RelationIdentity, BoundTableSecurity>>;
42    fn sequences(
43        &self,
44    ) -> RoleDependencyRead<'_, BTreeMap<RelationIdentity, BoundSequenceSecurity>>;
45    fn routines(&self) -> RoleDependencyRead<'_, BTreeMap<String, Vec<Arc<SQLUserFunction>>>>;
46    fn domains(
47        &self,
48    ) -> RoleDependencyRead<'_, BTreeMap<String, crate::catalog::domain::StoredDomain>>;
49}
50
51pub trait TemporaryRoleDependencyCatalog: RoleDependencyCatalog {
52    fn temporary_namespace_allocated(&self) -> bool;
53    fn sequence_persistence(
54        &self,
55    ) -> RoleDependencyRead<'_, BTreeMap<RelationIdentity, crate::ast::RelationPersistence>>;
56}