vibesql_executor/
trigger_ddl.rs1use vibesql_ast::{AlterTriggerAction, AlterTriggerStmt, CreateTriggerStmt, DropTriggerStmt};
6use vibesql_catalog::TriggerDefinition;
7use vibesql_storage::Database;
8
9use crate::errors::ExecutorError;
10
11pub struct TriggerExecutor;
13
14impl TriggerExecutor {
15 pub fn create_trigger(
17 db: &mut Database,
18 stmt: &CreateTriggerStmt,
19 ) -> Result<String, ExecutorError> {
20 if !db.catalog.table_exists(&stmt.table_name) {
22 return Err(ExecutorError::TableNotFound(stmt.table_name.clone()));
23 }
24
25 let trigger = TriggerDefinition::new(
27 stmt.trigger_name.clone(),
28 stmt.timing.clone(),
29 stmt.event.clone(),
30 stmt.table_name.clone(),
31 stmt.granularity.clone(),
32 stmt.when_condition.clone(),
33 stmt.triggered_action.clone(),
34 );
35
36 db.catalog.create_trigger(trigger)?;
38
39 Ok(format!("Trigger '{}' created successfully", stmt.trigger_name))
40 }
41
42 pub fn alter_trigger(
44 db: &mut Database,
45 stmt: &AlterTriggerStmt,
46 ) -> Result<String, ExecutorError> {
47 let mut trigger = db
49 .catalog
50 .get_trigger(&stmt.trigger_name)
51 .ok_or_else(|| ExecutorError::TriggerNotFound(stmt.trigger_name.clone()))?
52 .clone();
53
54 match stmt.action {
56 AlterTriggerAction::Enable => {
57 trigger.enable();
58 db.catalog.update_trigger(trigger)?;
59 Ok(format!("Trigger '{}' enabled successfully", stmt.trigger_name))
60 }
61 AlterTriggerAction::Disable => {
62 trigger.disable();
63 db.catalog.update_trigger(trigger)?;
64 Ok(format!("Trigger '{}' disabled successfully", stmt.trigger_name))
65 }
66 }
67 }
68
69 pub fn drop_trigger(
71 db: &mut Database,
72 stmt: &DropTriggerStmt,
73 ) -> Result<String, ExecutorError> {
74 if db.catalog.get_trigger(&stmt.trigger_name).is_none() {
76 return Err(ExecutorError::TriggerNotFound(stmt.trigger_name.clone()));
77 }
78
79 db.catalog.drop_trigger(&stmt.trigger_name)?;
81
82 Ok(format!("Trigger '{}' dropped successfully", stmt.trigger_name))
87 }
88}