uqa-execution 0.4.5

Volcano physical operators with row-batch pipelines
//
// Unified Query Algebra
//
// Copyright (c) 2023-2026 Cognica, Inc.
//

//! State operations used by native role lifecycle execution.

use std::{collections::BTreeMap, ops::DerefMut};
use uqa_sql::catalog::roles::identity::RoleBinding;
use uqa_sql::{
    catalog::roles::{
        definition::RoleValidationContext, dependencies::context::RoleDependencyCatalog,
        RoleDefinition, RoleMembership, RoleMembershipKey,
    },
    SQLError,
};

pub type RoleDefinitionWrite<'a> =
    Box<dyn DerefMut<Target = BTreeMap<String, RoleDefinition>> + 'a>;
pub type RoleMembershipWrite<'a> =
    Box<dyn DerefMut<Target = BTreeMap<RoleMembershipKey, RoleMembership>> + 'a>;
pub trait RoleRegistry {
    fn write_roles(&self) -> RoleDefinitionWrite<'_>;
    fn write_memberships(&self) -> RoleMembershipWrite<'_>;
}
pub trait RolePublication {
    fn prepare_writer(&self) -> Result<(), SQLError>;
    fn persist_roles(
        &self,
        before: &BTreeMap<String, RoleDefinition>,
        roles: &BTreeMap<String, RoleDefinition>,
    ) -> Result<(), SQLError>;
    fn persist_memberships(
        &self,
        before: &BTreeMap<RoleMembershipKey, RoleMembership>,
        memberships: &BTreeMap<RoleMembershipKey, RoleMembership>,
    ) -> Result<(), SQLError>;
    fn catalog_changed(&self);
    fn set_current_role(&self, target: Option<RoleBinding>);
    fn set_session_authorization(&self, target: RoleBinding);
}
#[derive(Clone, Copy)]
pub struct RoleExecutionContext<'a> {
    pub analysis: RoleValidationContext<'a>,
    pub registry: &'a dyn RoleRegistry,
    pub publication: &'a dyn RolePublication,
    pub dependencies: &'a dyn RoleDependencyCatalog,
    pub locks: &'a dyn crate::row_locks::shared_objects::SharedObjectLockSession,
    pub temporary_roles: &'a dyn super::super::roles::temporary::TemporaryRoleDependencyReads,
}