use crate::SqlWriterValues;
use crate::types::DropBehavior;
use crate::types::SchemaName;
use crate::types::write_schema_name;
use crate::writer::SqlWriter;
#[derive(Default, Debug, Clone)]
pub struct DropSchema {
schemas: Vec<SchemaName>,
if_exists: bool,
behavior: Option<DropBehavior>,
}
impl DropSchema {
pub fn new() -> Self {
Self::default()
}
pub fn to_values(&self) -> SqlWriterValues {
let mut w = SqlWriterValues::new();
write_drop_schema(&mut w, self);
w
}
pub fn to_sql(&self) -> String {
let mut sql = String::new();
write_drop_schema(&mut sql, self);
sql
}
pub fn schema<S>(mut self, schema: S) -> Self
where
S: Into<SchemaName>,
{
self.schemas.push(schema.into());
self
}
pub fn schemas<I, S>(mut self, schemas: I) -> Self
where
I: IntoIterator<Item = S>,
S: Into<SchemaName>,
{
self.schemas.extend(schemas.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_schema<W: SqlWriter>(w: &mut W, drop_schema: &DropSchema) {
w.push_str("DROP SCHEMA ");
if drop_schema.if_exists {
w.push_str("IF EXISTS ");
}
for (i, schema) in drop_schema.schemas.iter().enumerate() {
if i > 0 {
w.push_str(", ");
}
write_schema_name(w, schema);
}
if let Some(behavior) = drop_schema.behavior {
w.push_char(' ');
match behavior {
DropBehavior::Cascade => w.push_str("CASCADE"),
DropBehavior::Restrict => w.push_str("RESTRICT"),
}
}
}