Skip to main content

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 {}