reinhardt_query/query/maintenance/
repair_table.rs1use crate::{
7 backend::QueryBuilder,
8 types::{DynIden, IntoIden, RepairTableOption},
9};
10
11use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
12
13#[derive(Debug, Clone, Default)]
41pub struct RepairTableStatement {
42 pub(crate) tables: Vec<DynIden>,
43 pub(crate) no_write_to_binlog: bool,
44 pub(crate) local: bool,
45 pub(crate) quick: bool,
46 pub(crate) extended: bool,
47 pub(crate) use_frm: bool,
48}
49
50impl RepairTableStatement {
51 pub fn new() -> Self {
61 Self::default()
62 }
63
64 pub fn take(&mut self) -> Self {
66 Self {
67 tables: std::mem::take(&mut self.tables),
68 no_write_to_binlog: std::mem::take(&mut self.no_write_to_binlog),
69 local: std::mem::take(&mut self.local),
70 quick: std::mem::take(&mut self.quick),
71 extended: std::mem::take(&mut self.extended),
72 use_frm: std::mem::take(&mut self.use_frm),
73 }
74 }
75
76 pub fn table<T>(&mut self, table: T) -> &mut Self
87 where
88 T: IntoIden,
89 {
90 self.tables.push(table.into_iden());
91 self
92 }
93
94 pub fn no_write_to_binlog(&mut self) -> &mut Self {
108 self.no_write_to_binlog = true;
109 self
110 }
111
112 pub fn local(&mut self) -> &mut Self {
126 self.local = true;
127 self
128 }
129
130 pub fn quick(&mut self) -> &mut Self {
144 self.quick = true;
145 self
146 }
147
148 pub fn extended(&mut self) -> &mut Self {
162 self.extended = true;
163 self
164 }
165
166 pub fn use_frm(&mut self) -> &mut Self {
180 self.use_frm = true;
181 self
182 }
183
184 pub fn options(&mut self, opt: RepairTableOption) -> &mut Self {
198 self.no_write_to_binlog = opt.no_write_to_binlog;
199 self.local = opt.local;
200 self.quick = opt.quick;
201 self.extended = opt.extended;
202 self.use_frm = opt.use_frm;
203 self
204 }
205}
206
207impl QueryStatementBuilder for RepairTableStatement {
208 fn build_any(&self, query_builder: &dyn QueryBuilderTrait) -> (String, crate::value::Values) {
209 use std::any::Any;
211 if let Some(builder) =
212 (query_builder as &dyn Any).downcast_ref::<crate::backend::PostgresQueryBuilder>()
213 {
214 return builder.build_repair_table(self);
215 }
216 if let Some(builder) =
217 (query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
218 {
219 return builder.build_repair_table(self);
220 }
221 if let Some(builder) =
222 (query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
223 {
224 return builder.build_repair_table(self);
225 }
226 if let Some(builder) =
227 (query_builder as &dyn Any).downcast_ref::<crate::backend::CockroachDBQueryBuilder>()
228 {
229 return builder.build_repair_table(self);
230 }
231 panic!("Unsupported query builder type");
232 }
233}
234
235impl QueryStatementWriter for RepairTableStatement {}
236
237#[cfg(test)]
238mod tests {
239 use super::*;
240 use rstest::*;
241
242 #[rstest]
243 fn test_repair_table_new() {
244 let stmt = RepairTableStatement::new();
245 assert!(stmt.tables.is_empty());
246 assert!(!stmt.no_write_to_binlog);
247 assert!(!stmt.local);
248 assert!(!stmt.quick);
249 assert!(!stmt.extended);
250 assert!(!stmt.use_frm);
251 }
252
253 #[rstest]
254 fn test_repair_table_with_table() {
255 let mut stmt = RepairTableStatement::new();
256 stmt.table("users");
257 assert_eq!(stmt.tables.len(), 1);
258 assert_eq!(stmt.tables[0].to_string(), "users");
259 }
260
261 #[rstest]
262 fn test_repair_table_with_multiple_tables() {
263 let mut stmt = RepairTableStatement::new();
264 stmt.table("users").table("posts");
265 assert_eq!(stmt.tables.len(), 2);
266 assert_eq!(stmt.tables[0].to_string(), "users");
267 assert_eq!(stmt.tables[1].to_string(), "posts");
268 }
269
270 #[rstest]
271 fn test_repair_table_quick() {
272 let mut stmt = RepairTableStatement::new();
273 stmt.quick();
274 assert!(stmt.quick);
275 assert!(!stmt.extended);
276 assert!(!stmt.use_frm);
277 }
278
279 #[rstest]
280 fn test_repair_table_extended() {
281 let mut stmt = RepairTableStatement::new();
282 stmt.extended();
283 assert!(!stmt.quick);
284 assert!(stmt.extended);
285 assert!(!stmt.use_frm);
286 }
287
288 #[rstest]
289 fn test_repair_table_use_frm() {
290 let mut stmt = RepairTableStatement::new();
291 stmt.use_frm();
292 assert!(!stmt.quick);
293 assert!(!stmt.extended);
294 assert!(stmt.use_frm);
295 }
296
297 #[rstest]
298 fn test_repair_table_with_option() {
299 let opt = RepairTableOption::new().quick(true).use_frm(true);
300 let mut stmt = RepairTableStatement::new();
301 stmt.table("users").options(opt);
302 assert_eq!(stmt.tables.len(), 1);
303 assert!(stmt.quick);
304 assert!(!stmt.extended);
305 assert!(stmt.use_frm);
306 }
307
308 #[rstest]
309 fn test_repair_table_take() {
310 let mut stmt = RepairTableStatement::new();
311 stmt.table("users").quick().use_frm();
312
313 let taken = stmt.take();
314 assert_eq!(taken.tables.len(), 1);
315 assert!(taken.quick);
316 assert!(taken.use_frm);
317
318 assert!(stmt.tables.is_empty());
320 assert!(!stmt.quick);
321 assert!(!stmt.use_frm);
322 }
323}