diff --git a/src/backend/trigger_builder.rs b/src/backend/trigger_builder.rs index 7a66377f..399fa942 100644 --- a/src/backend/trigger_builder.rs +++ b/src/backend/trigger_builder.rs @@ -1,6 +1,6 @@ use crate::*; -pub trait TriggerBuilder: TableRefBuilder { +pub trait TriggerBuilder: TableRefBuilder + QueryBuilder { /// Translate [`TriggerCreateStatement`] into SQL statement. fn prepare_trigger_create_statement( &self, @@ -21,7 +21,16 @@ pub trait TriggerBuilder: TableRefBuilder { self.prepare_table_ref_iden(&create.trigger.table, sql); write!(sql, " FOR EACH ROW\nBEGIN\n").unwrap(); - write!(sql, "\nEND").unwrap(); + self.prepare_trigger_actions(&create.trigger.actions, sql); + + write!(sql, "END").unwrap(); + } + + fn prepare_trigger_actions(&self, actions: &TriggerActions, sql: &mut dyn SqlWriter) { + for action in actions { + self.prepare_simple_expr_common(&action, sql); + write!(sql, ";\n").unwrap(); + } } /// Translate IF NOT EXISTS expression in [`TriggerCreateStatement`]. @@ -45,4 +54,8 @@ pub trait TriggerBuilder: TableRefBuilder { write!(sql, "DROP TRIGGER ").unwrap(); self.prepare_table_ref_iden(&drop.name.clone().into(), sql); } + + fn prepare_simple_expr_yeah(&self, simple_expr: &SimpleExpr, sql: &mut dyn SqlWriter) { + self.prepare_simple_expr_common(simple_expr, sql); + } } diff --git a/src/trigger/mod.rs b/src/trigger/mod.rs index 5c6b5666..b1df7170 100644 --- a/src/trigger/mod.rs +++ b/src/trigger/mod.rs @@ -1,4 +1,4 @@ -use crate::{Iden, IntoTableRef, SchemaBuilder, SeaRc, TableRef}; +use crate::{Iden, IntoTableRef, SchemaBuilder, SeaRc, SimpleExpr, TableRef}; use std::fmt; mod create; @@ -72,15 +72,20 @@ pub trait Configurable { } } +pub type TriggerAction = SimpleExpr; +pub type TriggerActions = Vec; + #[derive(Default, Debug, Clone)] pub struct NamedTrigger { - pub(crate) name: TriggerRef + pub(crate) name: TriggerRef, + pub(crate) actions: TriggerActions, } impl NamedTrigger { pub fn new>(name: T) -> NamedTrigger { Self { - name: name.into() + name: name.into(), + actions: vec![], } } } @@ -107,29 +112,25 @@ impl Configurable for NamedTrigger { table: table, event: event, time: time, + actions: self.actions.clone(), } } } #[derive(Default, Debug, Clone)] pub struct UnnamedTrigger { - pub(crate) table: Option, - pub(crate) event: Option, - pub(crate) time: Option, + pub actions: TriggerActions, } impl UnnamedTrigger { pub fn new() -> UnnamedTrigger { - Self { - table: None, - event: None, - time: None, - } + Self { actions: vec![] } } // an unnamed trigger can become a named one pub fn name>(&self, name: T) -> NamedTrigger { NamedTrigger { - name: name.into() + name: name.into(), + actions: self.actions.clone(), } } } @@ -146,6 +147,7 @@ impl Configurable for UnnamedTrigger { table: table, event: event, time: time, + actions: self.actions.clone(), } } } @@ -156,6 +158,7 @@ pub struct DefinedTrigger { pub(crate) table: TableRef, pub(crate) event: TriggerEvent, pub(crate) time: TriggerActionTime, + pub(crate) actions: TriggerActions, } impl Referencable for DefinedTrigger { diff --git a/tests/mysql/trigger.rs b/tests/mysql/trigger.rs index 8df8b104..4a9f4d82 100644 --- a/tests/mysql/trigger.rs +++ b/tests/mysql/trigger.rs @@ -18,7 +18,7 @@ fn create_unnamed_trigger() { [ "CREATE TRIGGER `t_glyph_before_insert`", "BEFORE INSERT ON `glyph`", - "FOR EACH ROW\nBEGIN\n\nEND", + "FOR EACH ROW\nBEGIN\nEND", ] .join(" ") ); @@ -35,7 +35,7 @@ fn create_named_trigger() { [ "CREATE TRIGGER `my_trigger`", "BEFORE INSERT ON `glyph`", - "FOR EACH ROW\nBEGIN\n\nEND", + "FOR EACH ROW\nBEGIN\nEND", ] .join(" ") ); @@ -58,3 +58,23 @@ fn drop_unnamed_trigger() { "DROP TRIGGER `t_glyph_before_delete`" ); } + +#[test] +fn trigger_actions() { + let mut trigger = UnnamedTrigger::new(); + trigger.actions.push(Expr::col(Glyph::Id).eq(1)); + + assert_eq!( + trigger + .before_insert(Glyph::Table) + .create() + .to_string(MysqlQueryBuilder), + [ + "CREATE TRIGGER `t_glyph_before_insert` BEFORE INSERT ON `glyph` FOR EACH ROW", + "BEGIN", + "`id` = 1;", + "END" + ] + .join("\n") + ); +}