Skip to content

Commit 73536a6

Browse files
committed
draft triggers create and drop
1 parent b91ba14 commit 73536a6

File tree

15 files changed

+632
-1
lines changed

15 files changed

+632
-1
lines changed

src/backend/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,20 @@ mod index_builder;
2424
mod query_builder;
2525
mod table_builder;
2626
mod table_ref_builder;
27+
mod trigger_builder;
28+
// mod trigger_ref_builder;
2729

2830
pub use self::foreign_key_builder::*;
2931
pub use self::index_builder::*;
3032
pub use self::query_builder::*;
3133
pub use self::table_builder::*;
3234
pub use self::table_ref_builder::*;
35+
pub use self::trigger_builder::*;
36+
// pub use self::trigger_ref_builder::*;
3337

3438
pub trait GenericBuilder: QueryBuilder + SchemaBuilder {}
3539

36-
pub trait SchemaBuilder: TableBuilder + IndexBuilder + ForeignKeyBuilder {}
40+
pub trait SchemaBuilder: TableBuilder + IndexBuilder + ForeignKeyBuilder + TriggerBuilder {}
3741

3842
pub trait QuotedBuilder {
3943
/// The type of quote the builder uses.

src/backend/mysql/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pub(crate) mod foreign_key;
22
pub(crate) mod index;
33
pub(crate) mod query;
44
pub(crate) mod table;
5+
pub(crate) mod trigger;
56

67
use super::*;
78

src/backend/mysql/trigger.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
use super::*;
2+
3+
impl TriggerBuilder for MysqlQueryBuilder {}

src/backend/postgres/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ pub(crate) mod foreign_key;
33
pub(crate) mod index;
44
pub(crate) mod query;
55
pub(crate) mod table;
6+
pub(crate) mod trigger;
67
pub(crate) mod types;
78

89
use super::*;

src/backend/postgres/trigger.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
use super::*;
2+
3+
impl TriggerBuilder for PostgresQueryBuilder {}

src/backend/sqlite/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ pub(crate) mod foreign_key;
22
pub(crate) mod index;
33
pub(crate) mod query;
44
pub(crate) mod table;
5+
pub(crate) mod trigger;
56

67
use super::*;
78

src/backend/sqlite/trigger.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
use super::*;
2+
3+
impl TriggerBuilder for SqliteQueryBuilder {}

src/backend/trigger_builder.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use crate::*;
2+
3+
pub trait TriggerBuilder: TableRefBuilder {
4+
/// Translate [`TriggerCreateStatement`] into SQL statement.
5+
fn prepare_trigger_create_statement(
6+
&self,
7+
create: &TriggerCreateStatement,
8+
sql: &mut dyn SqlWriter,
9+
) {
10+
write!(sql, "CREATE TRIGGER ").unwrap();
11+
self.prepare_create_trigger_if_not_exists(create, sql);
12+
13+
let trigger_ref = match &create.trigger.name {
14+
Some(value) => value,
15+
// auto-generate trigger name
16+
_ => &create.trigger.trigger_ref(),
17+
};
18+
let trigger_ref: TableRef = trigger_ref.into();
19+
self.prepare_table_ref_iden(&trigger_ref, sql);
20+
write!(sql, " {} {} ON ", create.trigger.time, create.trigger.event).unwrap();
21+
self.prepare_table_ref_iden(&create.trigger.table, sql);
22+
write!(sql, " FOR EACH ROW\nBEGIN\n").unwrap();
23+
24+
write!(sql, "\nEND").unwrap();
25+
}
26+
27+
/// Translate IF NOT EXISTS expression in [`TriggerCreateStatement`].
28+
fn prepare_create_trigger_if_not_exists(
29+
&self,
30+
create: &TriggerCreateStatement,
31+
sql: &mut dyn SqlWriter,
32+
) {
33+
if create.if_not_exists {
34+
write!(sql, "IF NOT EXISTS ").unwrap();
35+
}
36+
}
37+
38+
// /// Translate [`TriggerRef`] into SQL statement.
39+
// fn prepare_table_ref(&self, trigger_ref: &TableRef, sql: &mut dyn SqlWriter) {
40+
// self.prepare_table_ref_iden(trigger_ref, sql)
41+
// }
42+
43+
/// Translate [`TriggerDropStatement`] into SQL statement.
44+
fn prepare_trigger_drop_statement(&self, drop: &TriggerDropStatement, sql: &mut dyn SqlWriter) {
45+
write!(sql, "DROP TRIGGER ").unwrap();
46+
self.prepare_table_ref_iden(&drop.name.clone().into(), sql);
47+
}
48+
}

src/backend/trigger_ref_builder.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use crate::*;
2+
3+
pub trait TriggerRefBuilder: QuotedBuilder {
4+
/// Translate [`TriggerRef`] that without values into SQL statement.
5+
fn prepare_trigger_ref_iden(&self, table_ref: &TriggerRef, sql: &mut dyn SqlWriter) {
6+
match table_ref {
7+
TriggerRef::Trigger(iden) => {
8+
iden.prepare(sql.as_writer(), self.quote());
9+
}
10+
}
11+
}
12+
}

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,6 +824,7 @@ pub mod query;
824824
pub mod schema;
825825
pub mod table;
826826
pub mod token;
827+
pub mod trigger;
827828
pub mod types;
828829
pub mod value;
829830

@@ -841,6 +842,7 @@ pub use query::*;
841842
pub use schema::*;
842843
pub use table::*;
843844
pub use token::*;
845+
pub use trigger::*;
844846
pub use types::*;
845847
pub use value::*;
846848

0 commit comments

Comments
 (0)