Skip to content

Commit fc2dd1f

Browse files
committed
prepare trigger actions
1 parent e462df4 commit fc2dd1f

File tree

3 files changed

+52
-16
lines changed

3 files changed

+52
-16
lines changed

src/backend/trigger_builder.rs

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::*;
22

3-
pub trait TriggerBuilder: TableRefBuilder {
3+
pub trait TriggerBuilder: TableRefBuilder + QueryBuilder {
44
/// Translate [`TriggerCreateStatement`] into SQL statement.
55
fn prepare_trigger_create_statement(
66
&self,
@@ -21,7 +21,16 @@ pub trait TriggerBuilder: TableRefBuilder {
2121
self.prepare_table_ref_iden(&create.trigger.table, sql);
2222
write!(sql, " FOR EACH ROW\nBEGIN\n").unwrap();
2323

24-
write!(sql, "\nEND").unwrap();
24+
self.prepare_trigger_actions(&create.trigger.actions, sql);
25+
26+
write!(sql, "END").unwrap();
27+
}
28+
29+
fn prepare_trigger_actions(&self, actions: &TriggerActions, sql: &mut dyn SqlWriter) {
30+
for action in actions {
31+
self.prepare_simple_expr_common(&action, sql);
32+
write!(sql, ";\n").unwrap();
33+
}
2534
}
2635

2736
/// Translate IF NOT EXISTS expression in [`TriggerCreateStatement`].
@@ -45,4 +54,8 @@ pub trait TriggerBuilder: TableRefBuilder {
4554
write!(sql, "DROP TRIGGER ").unwrap();
4655
self.prepare_table_ref_iden(&drop.name.clone().into(), sql);
4756
}
57+
58+
fn prepare_simple_expr_yeah(&self, simple_expr: &SimpleExpr, sql: &mut dyn SqlWriter) {
59+
self.prepare_simple_expr_common(simple_expr, sql);
60+
}
4861
}

src/trigger/mod.rs

+15-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::{Iden, IntoTableRef, SchemaBuilder, SeaRc, TableRef};
1+
use crate::{Iden, IntoTableRef, SchemaBuilder, SeaRc, SimpleExpr, TableRef};
22
use std::fmt;
33

44
mod create;
@@ -72,15 +72,20 @@ pub trait Configurable {
7272
}
7373
}
7474

75+
pub type TriggerAction = SimpleExpr;
76+
pub type TriggerActions = Vec<TriggerAction>;
77+
7578
#[derive(Default, Debug, Clone)]
7679
pub struct NamedTrigger {
77-
pub(crate) name: TriggerRef
80+
pub(crate) name: TriggerRef,
81+
pub(crate) actions: TriggerActions,
7882
}
7983

8084
impl NamedTrigger {
8185
pub fn new<T: Into<TriggerRef>>(name: T) -> NamedTrigger {
8286
Self {
83-
name: name.into()
87+
name: name.into(),
88+
actions: vec![],
8489
}
8590
}
8691
}
@@ -107,29 +112,25 @@ impl Configurable for NamedTrigger {
107112
table: table,
108113
event: event,
109114
time: time,
115+
actions: self.actions.clone(),
110116
}
111117
}
112118
}
113119

114120
#[derive(Default, Debug, Clone)]
115121
pub struct UnnamedTrigger {
116-
pub(crate) table: Option<TableRef>,
117-
pub(crate) event: Option<TriggerEvent>,
118-
pub(crate) time: Option<TriggerActionTime>,
122+
pub actions: TriggerActions,
119123
}
120124

121125
impl UnnamedTrigger {
122126
pub fn new() -> UnnamedTrigger {
123-
Self {
124-
table: None,
125-
event: None,
126-
time: None,
127-
}
127+
Self { actions: vec![] }
128128
}
129129
// an unnamed trigger can become a named one
130130
pub fn name<T: Into<TriggerRef>>(&self, name: T) -> NamedTrigger {
131131
NamedTrigger {
132-
name: name.into()
132+
name: name.into(),
133+
actions: self.actions.clone(),
133134
}
134135
}
135136
}
@@ -146,6 +147,7 @@ impl Configurable for UnnamedTrigger {
146147
table: table,
147148
event: event,
148149
time: time,
150+
actions: self.actions.clone(),
149151
}
150152
}
151153
}
@@ -156,6 +158,7 @@ pub struct DefinedTrigger {
156158
pub(crate) table: TableRef,
157159
pub(crate) event: TriggerEvent,
158160
pub(crate) time: TriggerActionTime,
161+
pub(crate) actions: TriggerActions,
159162
}
160163

161164
impl Referencable for DefinedTrigger {

tests/mysql/trigger.rs

+22-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ fn create_unnamed_trigger() {
1818
[
1919
"CREATE TRIGGER `t_glyph_before_insert`",
2020
"BEFORE INSERT ON `glyph`",
21-
"FOR EACH ROW\nBEGIN\n\nEND",
21+
"FOR EACH ROW\nBEGIN\nEND",
2222
]
2323
.join(" ")
2424
);
@@ -35,7 +35,7 @@ fn create_named_trigger() {
3535
[
3636
"CREATE TRIGGER `my_trigger`",
3737
"BEFORE INSERT ON `glyph`",
38-
"FOR EACH ROW\nBEGIN\n\nEND",
38+
"FOR EACH ROW\nBEGIN\nEND",
3939
]
4040
.join(" ")
4141
);
@@ -58,3 +58,23 @@ fn drop_unnamed_trigger() {
5858
"DROP TRIGGER `t_glyph_before_delete`"
5959
);
6060
}
61+
62+
#[test]
63+
fn trigger_actions() {
64+
let mut trigger = UnnamedTrigger::new();
65+
trigger.actions.push(Expr::col(Glyph::Id).eq(1));
66+
67+
assert_eq!(
68+
trigger
69+
.before_insert(Glyph::Table)
70+
.create()
71+
.to_string(MysqlQueryBuilder),
72+
[
73+
"CREATE TRIGGER `t_glyph_before_insert` BEFORE INSERT ON `glyph` FOR EACH ROW",
74+
"BEGIN",
75+
"`id` = 1;",
76+
"END"
77+
]
78+
.join("\n")
79+
);
80+
}

0 commit comments

Comments
 (0)