use crate::{
backend::QueryBuilder,
types::{CheckTableOption, DynIden, IntoIden},
};
use crate::query::traits::{QueryBuilderTrait, QueryStatementBuilder, QueryStatementWriter};
#[derive(Debug, Clone)]
pub struct CheckTableStatement {
pub(crate) tables: Vec<DynIden>,
pub(crate) option: CheckTableOption,
}
impl CheckTableStatement {
pub fn new() -> Self {
Self {
tables: Vec::new(),
option: CheckTableOption::default(),
}
}
pub fn take(&mut self) -> Self {
Self {
tables: std::mem::take(&mut self.tables),
option: self.option,
}
}
pub fn table<T>(&mut self, table: T) -> &mut Self
where
T: IntoIden,
{
self.tables.push(table.into_iden());
self
}
pub fn option(&mut self, option: CheckTableOption) -> &mut Self {
self.option = option;
self
}
}
impl Default for CheckTableStatement {
fn default() -> Self {
Self::new()
}
}
impl QueryStatementBuilder for CheckTableStatement {
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_check_table(self);
}
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::MySqlQueryBuilder>()
{
return builder.build_check_table(self);
}
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::SqliteQueryBuilder>()
{
return builder.build_check_table(self);
}
if let Some(builder) =
(query_builder as &dyn Any).downcast_ref::<crate::backend::CockroachDBQueryBuilder>()
{
return builder.build_check_table(self);
}
panic!("Unsupported query builder type");
}
}
impl QueryStatementWriter for CheckTableStatement {}
#[cfg(test)]
mod tests {
use super::*;
use rstest::*;
#[rstest]
fn test_check_table_new() {
let stmt = CheckTableStatement::new();
assert!(stmt.tables.is_empty());
assert_eq!(stmt.option, CheckTableOption::Medium);
}
#[rstest]
fn test_check_table_with_table() {
let mut stmt = CheckTableStatement::new();
stmt.table("users");
assert_eq!(stmt.tables.len(), 1);
assert_eq!(stmt.tables[0].to_string(), "users");
}
#[rstest]
fn test_check_table_with_multiple_tables() {
let mut stmt = CheckTableStatement::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_check_table_with_quick_option() {
let mut stmt = CheckTableStatement::new();
stmt.table("users").option(CheckTableOption::Quick);
assert_eq!(stmt.tables.len(), 1);
assert_eq!(stmt.option, CheckTableOption::Quick);
}
#[rstest]
fn test_check_table_with_extended_option() {
let mut stmt = CheckTableStatement::new();
stmt.table("users").option(CheckTableOption::Extended);
assert_eq!(stmt.tables.len(), 1);
assert_eq!(stmt.option, CheckTableOption::Extended);
}
#[rstest]
fn test_check_table_with_for_upgrade_option() {
let mut stmt = CheckTableStatement::new();
stmt.table("users").option(CheckTableOption::ForUpgrade);
assert_eq!(stmt.tables.len(), 1);
assert_eq!(stmt.option, CheckTableOption::ForUpgrade);
}
#[rstest]
fn test_check_table_take() {
let mut stmt = CheckTableStatement::new();
stmt.table("users").option(CheckTableOption::Quick);
let taken = stmt.take();
assert_eq!(taken.tables.len(), 1);
assert_eq!(taken.option, CheckTableOption::Quick);
assert!(stmt.tables.is_empty());
assert_eq!(stmt.option, CheckTableOption::Quick); }
}