reinhardt_query/query/database/
drop_database.rs1use crate::{
6 backend::QueryBuilder,
7 types::{DynIden, IntoIden},
8};
9
10use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
11
12#[derive(Debug, Clone)]
37pub struct DropDatabaseStatement {
38 pub(crate) database_name: Option<DynIden>,
39 pub(crate) if_exists: bool,
40 pub(crate) force: bool,
41 pub(crate) cascade: bool,
42}
43
44impl DropDatabaseStatement {
45 pub fn new() -> Self {
55 Self {
56 database_name: None,
57 if_exists: false,
58 force: false,
59 cascade: false,
60 }
61 }
62
63 pub fn take(&mut self) -> Self {
65 let taken = Self {
66 database_name: self.database_name.take(),
67 if_exists: self.if_exists,
68 force: self.force,
69 cascade: self.cascade,
70 };
71 self.if_exists = false;
73 self.force = false;
74 self.cascade = false;
75 taken
76 }
77
78 pub fn name<N>(&mut self, name: N) -> &mut Self
89 where
90 N: IntoIden,
91 {
92 self.database_name = Some(name.into_iden());
93 self
94 }
95
96 pub fn if_exists(&mut self) -> &mut Self {
108 self.if_exists = true;
109 self
110 }
111
112 pub fn force(&mut self) -> &mut Self {
126 self.force = true;
127 self
128 }
129
130 pub fn cascade(&mut self) -> &mut Self {
144 self.cascade = true;
145 self
146 }
147}
148
149impl Default for DropDatabaseStatement {
150 fn default() -> Self {
151 Self::new()
152 }
153}
154
155impl QueryStatementBuilder for DropDatabaseStatement {
156 fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
157 use std::any::Any;
159 if let Some(builder) =
160 (query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
161 {
162 return builder.build_drop_database(self);
163 }
164 if let Some(builder) =
165 (query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
166 {
167 return builder.build_drop_database(self);
168 }
169 if let Some(builder) =
170 (query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
171 {
172 return builder.build_drop_database(self);
173 }
174 if let Some(builder) =
175 (query_builder as &dyn Any).downcast_ref::<crate::backend::CockroachDBQueryBuilder>()
176 {
177 return builder.build_drop_database(self);
178 }
179 panic!("Unsupported query builder type");
180 }
181}
182
183impl QueryStatementWriter for DropDatabaseStatement {}
184
185#[cfg(test)]
186mod tests {
187 use super::*;
188 use rstest::*;
189
190 #[rstest]
191 fn test_drop_database_new() {
192 let stmt = DropDatabaseStatement::new();
193 assert!(stmt.database_name.is_none());
194 assert!(!stmt.if_exists);
195 assert!(!stmt.force);
196 assert!(!stmt.cascade);
197 }
198
199 #[rstest]
200 fn test_drop_database_with_name() {
201 let mut stmt = DropDatabaseStatement::new();
202 stmt.name("mydb");
203 assert_eq!(stmt.database_name.as_ref().unwrap().to_string(), "mydb");
204 }
205
206 #[rstest]
207 fn test_drop_database_if_exists() {
208 let mut stmt = DropDatabaseStatement::new();
209 stmt.name("mydb").if_exists();
210 assert!(stmt.if_exists);
211 }
212
213 #[rstest]
214 fn test_drop_database_with_force() {
215 let mut stmt = DropDatabaseStatement::new();
216 stmt.name("mydb").force();
217 assert!(stmt.force);
218 }
219
220 #[rstest]
221 fn test_drop_database_with_cascade() {
222 let mut stmt = DropDatabaseStatement::new();
223 stmt.name("mydb").cascade();
224 assert!(stmt.cascade);
225 }
226
227 #[rstest]
228 fn test_drop_database_full_options() {
229 let mut stmt = DropDatabaseStatement::new();
230 stmt.name("mydb").if_exists().force().cascade();
231 assert_eq!(stmt.database_name.as_ref().unwrap().to_string(), "mydb");
232 assert!(stmt.if_exists);
233 assert!(stmt.force);
234 assert!(stmt.cascade);
235 }
236
237 #[rstest]
238 fn test_drop_database_take() {
239 let mut stmt = DropDatabaseStatement::new();
240 stmt.name("mydb").force();
241 let taken = stmt.take();
242 assert!(stmt.database_name.is_none());
243 assert!(!stmt.force);
244 assert_eq!(taken.database_name.as_ref().unwrap().to_string(), "mydb");
245 assert!(taken.force);
246 }
247}