use super::namespaces::SchemaStatementWriter;
use uqa_sql::{
ast::CreateDomain,
catalog::{
domain::{domain_object_oid, StoredDomain},
roles::RoleReferenceNames,
},
schema::domains::{bind_domain_creation_target, DomainCreationCatalog},
SQLError,
};
pub trait DomainDeclarationBinding {
fn bind_domain_declaration(&self, definition: &mut CreateDomain) -> Result<(), SQLError>;
}
pub trait DomainPublication {
fn publish_domain(&self, domain: StoredDomain) -> Result<(), SQLError>;
}
pub struct DomainCreationContext<'a> {
pub creation: crate::schema::namespaces::relations::RelationCreationContext<'a>,
pub writer: &'a dyn SchemaStatementWriter,
pub catalog: &'a dyn DomainCreationCatalog,
pub bindings: &'a dyn DomainDeclarationBinding,
pub allocate_identity: fn() -> Result<[u8; 16], SQLError>,
pub session: &'a dyn RoleReferenceNames,
pub publication: &'a dyn DomainPublication,
}
pub fn create_domain(
context: &DomainCreationContext<'_>,
mut definition: CreateDomain,
) -> Result<(), SQLError> {
context.writer.prepare_writer()?;
definition.name = context.creation.persistent_name(&definition.name)?;
let identity = bind_domain_creation_target(context.catalog, &mut definition)?;
context.bindings.bind_domain_declaration(&mut definition)?;
let object_id = (context.allocate_identity)()?;
let oid = domain_object_oid(&object_id);
context.publication.publish_domain(StoredDomain {
object_id,
oid,
identity,
owner: context.session.current_user_name(),
definition,
})
}
pub mod dependencies;
pub mod removal;