use crate::{
backend::QueryBuilder,
expr::SimpleExpr,
types::{
DynIden, IntoIden, IntoTableRef, TableRef, TriggerBody, TriggerEvent, TriggerOrder,
TriggerScope, TriggerTiming,
},
};
use super::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
#[derive(Debug, Clone)]
pub struct CreateTriggerStatement {
pub(crate) name: Option<DynIden>,
pub(crate) timing: Option<TriggerTiming>,
pub(crate) events: Vec<TriggerEvent>,
pub(crate) table: Option<TableRef>,
pub(crate) scope: Option<TriggerScope>,
pub(crate) when_condition: Option<SimpleExpr>,
pub(crate) body: Option<TriggerBody>,
pub(crate) order: Option<TriggerOrder>,
}
impl CreateTriggerStatement {
pub fn new() -> Self {
Self {
name: None,
timing: None,
events: Vec::new(),
table: None,
scope: None,
when_condition: None,
body: None,
order: None,
}
}
pub fn take(&mut self) -> Self {
Self {
name: self.name.take(),
timing: self.timing.take(),
events: std::mem::take(&mut self.events),
table: self.table.take(),
scope: self.scope.take(),
when_condition: self.when_condition.take(),
body: self.body.take(),
order: self.order.take(),
}
}
pub fn name<N>(&mut self, name: N) -> &mut Self
where
N: IntoIden,
{
self.name = Some(name.into_iden());
self
}
pub fn timing(&mut self, timing: TriggerTiming) -> &mut Self {
self.timing = Some(timing);
self
}
pub fn event(&mut self, event: TriggerEvent) -> &mut Self {
self.events.push(event);
self
}
pub fn on_table<T>(&mut self, table: T) -> &mut Self
where
T: IntoTableRef,
{
self.table = Some(table.into_table_ref());
self
}
pub fn for_each(&mut self, scope: TriggerScope) -> &mut Self {
self.scope = Some(scope);
self
}
pub fn when_condition(&mut self, condition: SimpleExpr) -> &mut Self {
self.when_condition = Some(condition);
self
}
pub fn body(&mut self, body: TriggerBody) -> &mut Self {
self.body = Some(body);
self
}
pub fn execute_function<S: Into<String>>(&mut self, function_name: S) -> &mut Self {
self.body = Some(TriggerBody::postgres_function(function_name));
self
}
pub fn order(&mut self, order: TriggerOrder) -> &mut Self {
self.order = Some(order);
self
}
}
impl Default for CreateTriggerStatement {
fn default() -> Self {
Self::new()
}
}
impl QueryStatementBuilder for CreateTriggerStatement {
fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
use std::any::Any;
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
{
return builder.build_create_trigger(self);
}
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
{
return builder.build_create_trigger(self);
}
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
{
return builder.build_create_trigger(self);
}
panic!("Unsupported query builder type");
}
}
impl QueryStatementWriter for CreateTriggerStatement {}