reinhardt_query/query/drop_trigger.rs
1//! DROP TRIGGER statement builder
2//!
3//! This module provides the `DropTriggerStatement` type for building SQL DROP TRIGGER queries.
4
5use crate::{
6 backend::QueryBuilder,
7 types::{DynIden, IntoIden, IntoTableRef, TableRef},
8};
9
10use super::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12/// DROP TRIGGER statement builder
13///
14/// This struct provides a fluent API for constructing DROP TRIGGER queries.
15///
16/// # Backend Support
17///
18/// - **PostgreSQL**: Full support (IF EXISTS, CASCADE/RESTRICT, ON table optional)
19/// - **MySQL**: Basic support (IF EXISTS, ON table required)
20/// - **SQLite**: Basic support (IF EXISTS, no CASCADE/RESTRICT)
21///
22/// # Examples
23///
24/// ```rust,ignore
25/// use reinhardt_query::prelude::*;
26///
27/// // Basic DROP TRIGGER
28/// let query = Query::drop_trigger()
29/// .name("audit_insert")
30/// .on_table("users");
31///
32/// // With IF EXISTS
33/// let query = Query::drop_trigger()
34/// .name("audit_insert")
35/// .if_exists()
36/// .on_table("users");
37///
38/// // PostgreSQL with CASCADE
39/// let query = Query::drop_trigger()
40/// .name("audit_insert")
41/// .on_table("users")
42/// .cascade();
43/// ```
44#[derive(Debug, Clone)]
45pub struct DropTriggerStatement {
46 pub(crate) name: Option<DynIden>,
47 pub(crate) table: Option<TableRef>,
48 pub(crate) if_exists: bool,
49 pub(crate) cascade: bool,
50 pub(crate) restrict: bool,
51}
52
53impl DropTriggerStatement {
54 /// Create a new DROP TRIGGER statement
55 pub fn new() -> Self {
56 Self {
57 name: None,
58 table: None,
59 if_exists: false,
60 cascade: false,
61 restrict: false,
62 }
63 }
64
65 /// Take the ownership of data in the current [`DropTriggerStatement`]
66 pub fn take(&mut self) -> Self {
67 Self {
68 name: self.name.take(),
69 table: self.table.take(),
70 if_exists: self.if_exists,
71 cascade: self.cascade,
72 restrict: self.restrict,
73 }
74 }
75
76 /// Set the trigger name to drop
77 ///
78 /// # Examples
79 ///
80 /// ```rust,ignore
81 /// use reinhardt_query::prelude::*;
82 ///
83 /// let query = Query::drop_trigger()
84 /// .name("audit_insert");
85 /// ```
86 pub fn name<N>(&mut self, name: N) -> &mut Self
87 where
88 N: IntoIden,
89 {
90 self.name = Some(name.into_iden());
91 self
92 }
93
94 /// Set the table on which the trigger is defined
95 ///
96 /// Required for MySQL, optional for PostgreSQL and SQLite.
97 ///
98 /// # Examples
99 ///
100 /// ```rust,ignore
101 /// use reinhardt_query::prelude::*;
102 ///
103 /// let query = Query::drop_trigger()
104 /// .name("audit_insert")
105 /// .on_table("users");
106 /// ```
107 pub fn on_table<T>(&mut self, table: T) -> &mut Self
108 where
109 T: IntoTableRef,
110 {
111 self.table = Some(table.into_table_ref());
112 self
113 }
114
115 /// Add IF EXISTS clause
116 ///
117 /// # Examples
118 ///
119 /// ```rust,ignore
120 /// use reinhardt_query::prelude::*;
121 ///
122 /// let query = Query::drop_trigger()
123 /// .name("audit_insert")
124 /// .if_exists();
125 /// ```
126 pub fn if_exists(&mut self) -> &mut Self {
127 self.if_exists = true;
128 self
129 }
130
131 /// Add CASCADE clause (PostgreSQL only)
132 ///
133 /// Automatically drop dependent objects.
134 ///
135 /// # Examples
136 ///
137 /// ```rust,ignore
138 /// use reinhardt_query::prelude::*;
139 ///
140 /// let query = Query::drop_trigger()
141 /// .name("audit_insert")
142 /// .on_table("users")
143 /// .cascade();
144 /// ```
145 pub fn cascade(&mut self) -> &mut Self {
146 self.cascade = true;
147 self.restrict = false;
148 self
149 }
150
151 /// Add RESTRICT clause (PostgreSQL only)
152 ///
153 /// Refuse to drop if there are dependent objects (default behavior).
154 ///
155 /// # Examples
156 ///
157 /// ```rust,ignore
158 /// use reinhardt_query::prelude::*;
159 ///
160 /// let query = Query::drop_trigger()
161 /// .name("audit_insert")
162 /// .on_table("users")
163 /// .restrict();
164 /// ```
165 pub fn restrict(&mut self) -> &mut Self {
166 self.restrict = true;
167 self.cascade = false;
168 self
169 }
170}
171
172impl Default for DropTriggerStatement {
173 fn default() -> Self {
174 Self::new()
175 }
176}
177
178impl QueryStatementBuilder for DropTriggerStatement {
179 fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
180 // Downcast to concrete QueryBuilder type
181 use std::any::Any;
182 if let Some(builder) =
183 (query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
184 {
185 return builder.build_drop_trigger(self);
186 }
187 if let Some(builder) =
188 (query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
189 {
190 return builder.build_drop_trigger(self);
191 }
192 if let Some(builder) =
193 (query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
194 {
195 return builder.build_drop_trigger(self);
196 }
197 panic!("Unsupported query builder type");
198 }
199}
200
201impl QueryStatementWriter for DropTriggerStatement {}