use crate::SqlWriterValues;
use crate::types::DropBehavior;
use crate::types::TableName;
use crate::types::write_table_name;
use crate::writer::SqlWriter;
#[derive(Default, Debug, Clone)]
pub struct DropTable {
tables: Vec<TableName>,
if_exists: bool,
behavior: Option<DropBehavior>,
}
impl DropTable {
pub fn new() -> Self {
Self::default()
}
pub fn to_values(&self) -> SqlWriterValues {
let mut w = SqlWriterValues::new();
write_drop_table(&mut w, self);
w
}
pub fn to_sql(&self) -> String {
let mut sql = String::new();
write_drop_table(&mut sql, self);
sql
}
pub fn table<T>(mut self, table: T) -> Self
where
T: Into<TableName>,
{
self.tables.push(table.into());
self
}
pub fn tables<I, T>(mut self, tables: I) -> Self
where
I: IntoIterator<Item = T>,
T: Into<TableName>,
{
self.tables.extend(tables.into_iter().map(Into::into));
self
}
pub fn if_exists(mut self) -> Self {
self.if_exists = true;
self
}
pub fn cascade(mut self) -> Self {
self.behavior = Some(DropBehavior::Cascade);
self
}
pub fn restrict(mut self) -> Self {
self.behavior = Some(DropBehavior::Restrict);
self
}
}
fn write_drop_table<W: SqlWriter>(w: &mut W, drop_table: &DropTable) {
w.push_str("DROP TABLE ");
if drop_table.if_exists {
w.push_str("IF EXISTS ");
}
for (i, table) in drop_table.tables.iter().enumerate() {
if i > 0 {
w.push_str(", ");
}
write_table_name(w, table);
}
if let Some(behavior) = drop_table.behavior {
w.push_char(' ');
match behavior {
DropBehavior::Cascade => w.push_str("CASCADE"),
DropBehavior::Restrict => w.push_str("RESTRICT"),
}
}
}