Skip to main content

radixdb_executor/mutation/
extension.rs

1//! Execution boundary for database-to-package catalog bindings.
2
3use radixdb_core::Result;
4use radixdb_sql::{CreateExtensionStatement, DropExtensionStatement, Statement};
5use radixdb_storage::traits::{Engine, QueryResult};
6
7use crate::context::ExecutionContext;
8use crate::mutation::host::MutationHost;
9use crate::result::ExecResult;
10
11#[doc(hidden)]
12pub trait ExtensionDdlExecutorExt: MutationHost {
13    fn execute_create_extension(
14        &self,
15        statement: &CreateExtensionStatement,
16        context: &ExecutionContext,
17    ) -> Result<Box<dyn QueryResult>> {
18        execute_binding_statement(self, Statement::CreateExtension(statement.clone()), context)
19    }
20
21    fn execute_drop_extension(
22        &self,
23        statement: &DropExtensionStatement,
24        context: &ExecutionContext,
25    ) -> Result<Box<dyn QueryResult>> {
26        execute_binding_statement(self, Statement::DropExtension(statement.clone()), context)
27    }
28}
29
30pub(super) fn execute_binding_statement<H: MutationHost + ?Sized>(
31    host: &H,
32    statement: Statement,
33    context: &ExecutionContext,
34) -> Result<Box<dyn QueryResult>> {
35    let mutation = host.mutation_stage_catalog_statement_as(
36        statement,
37        context.effective_principal_id(),
38        context.current_database(),
39    )?;
40    if let Some(mutation) = mutation {
41        let mut transaction = host.mutation_engine().begin_transaction()?;
42        transaction.stage_catalog_mutation(mutation)?;
43        transaction.commit()?;
44    }
45    host.mutation_invalidate_authorization_caches();
46    Ok(Box::new(ExecResult::empty()))
47}
48
49impl<T: MutationHost + ?Sized> ExtensionDdlExecutorExt for T {}