use crate::{
backend::QueryBuilder,
types::{DynIden, IntoIden, RepairTableOption},
};
use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
#[derive(Debug, Clone, Default)]
pub struct RepairTableStatement {
pub(crate) tables: Vec<DynIden>,
pub(crate) no_write_to_binlog: bool,
pub(crate) local: bool,
pub(crate) quick: bool,
pub(crate) extended: bool,
pub(crate) use_frm: bool,
}
impl RepairTableStatement {
pub fn new() -> Self {
Self::default()
}
pub fn take(&mut self) -> Self {
Self {
tables: std::mem::take(&mut self.tables),
no_write_to_binlog: std::mem::take(&mut self.no_write_to_binlog),
local: std::mem::take(&mut self.local),
quick: std::mem::take(&mut self.quick),
extended: std::mem::take(&mut self.extended),
use_frm: std::mem::take(&mut self.use_frm),
}
}
pub fn table<T>(&mut self, table: T) -> &mut Self
where
T: IntoIden,
{
self.tables.push(table.into_iden());
self
}
pub fn no_write_to_binlog(&mut self) -> &mut Self {
self.no_write_to_binlog = true;
self
}
pub fn local(&mut self) -> &mut Self {
self.local = true;
self
}
pub fn quick(&mut self) -> &mut Self {
self.quick = true;
self
}
pub fn extended(&mut self) -> &mut Self {
self.extended = true;
self
}
pub fn use_frm(&mut self) -> &mut Self {
self.use_frm = true;
self
}
pub fn options(&mut self, opt: RepairTableOption) -> &mut Self {
self.no_write_to_binlog = opt.no_write_to_binlog;
self.local = opt.local;
self.quick = opt.quick;
self.extended = opt.extended;
self.use_frm = opt.use_frm;
self
}
}
impl QueryStatementBuilder for RepairTableStatement {
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_repair_table(self);
}
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
{
return builder.build_repair_table(self);
}
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
{
return builder.build_repair_table(self);
}
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::CockroachDBQueryBuilder>()
{
return builder.build_repair_table(self);
}
panic!("Unsupported query builder type");
}
}
impl QueryStatementWriter for RepairTableStatement {}
#[cfg(test)]
mod tests {
use super::*;
use rstest::*;
#[rstest]
fn test_repair_table_new() {
let stmt = RepairTableStatement::new();
assert!(stmt.tables.is_empty());
assert!(!stmt.no_write_to_binlog);
assert!(!stmt.local);
assert!(!stmt.quick);
assert!(!stmt.extended);
assert!(!stmt.use_frm);
}
#[rstest]
fn test_repair_table_with_table() {
let mut stmt = RepairTableStatement::new();
stmt.table("users");
assert_eq!(stmt.tables.len(), 1);
assert_eq!(stmt.tables[0].to_string(), "users");
}
#[rstest]
fn test_repair_table_with_multiple_tables() {
let mut stmt = RepairTableStatement::new();
stmt.table("users").table("posts");
assert_eq!(stmt.tables.len(), 2);
assert_eq!(stmt.tables[0].to_string(), "users");
assert_eq!(stmt.tables[1].to_string(), "posts");
}
#[rstest]
fn test_repair_table_quick() {
let mut stmt = RepairTableStatement::new();
stmt.quick();
assert!(stmt.quick);
assert!(!stmt.extended);
assert!(!stmt.use_frm);
}
#[rstest]
fn test_repair_table_extended() {
let mut stmt = RepairTableStatement::new();
stmt.extended();
assert!(!stmt.quick);
assert!(stmt.extended);
assert!(!stmt.use_frm);
}
#[rstest]
fn test_repair_table_use_frm() {
let mut stmt = RepairTableStatement::new();
stmt.use_frm();
assert!(!stmt.quick);
assert!(!stmt.extended);
assert!(stmt.use_frm);
}
#[rstest]
fn test_repair_table_with_option() {
let opt = RepairTableOption::new().quick(true).use_frm(true);
let mut stmt = RepairTableStatement::new();
stmt.table("users").options(opt);
assert_eq!(stmt.tables.len(), 1);
assert!(stmt.quick);
assert!(!stmt.extended);
assert!(stmt.use_frm);
}
#[rstest]
fn test_repair_table_take() {
let mut stmt = RepairTableStatement::new();
stmt.table("users").quick().use_frm();
let taken = stmt.take();
assert_eq!(taken.tables.len(), 1);
assert!(taken.quick);
assert!(taken.use_frm);
assert!(stmt.tables.is_empty());
assert!(!stmt.quick);
assert!(!stmt.use_frm);
}
}