use crate::{backend::SchemaBuilder, prepare::*, types::*, ColumnDef, SchemaStatementBuilder};
#[derive(Debug, Clone)]
pub struct TableAlterStatement {
pub(crate) table: Option<DynIden>,
pub(crate) alter_option: Option<TableAlterOption>,
}
#[derive(Debug, Clone)]
pub enum TableAlterOption {
AddColumn(ColumnDef),
ModifyColumn(ColumnDef),
RenameColumn(DynIden, DynIden),
DropColumn(DynIden),
}
impl Default for TableAlterStatement {
fn default() -> Self {
Self::new()
}
}
impl TableAlterStatement {
pub fn new() -> Self {
Self {
table: None,
alter_option: None,
}
}
pub fn table<T: 'static>(&mut self, table: T) -> &mut Self
where
T: Iden,
{
self.table = Some(SeaRc::new(table));
self
}
pub fn add_column(&mut self, column_def: &mut ColumnDef) -> &mut Self {
self.alter_option(TableAlterOption::AddColumn(column_def.take()))
}
pub fn modify_column(&mut self, column_def: &mut ColumnDef) -> &mut Self {
self.alter_option(TableAlterOption::ModifyColumn(column_def.take()))
}
pub fn rename_column<T: 'static, R: 'static>(&mut self, from_name: T, to_name: R) -> &mut Self
where
T: Iden,
R: Iden,
{
self.alter_option(TableAlterOption::RenameColumn(
SeaRc::new(from_name),
SeaRc::new(to_name),
))
}
pub fn drop_column<T: 'static>(&mut self, col_name: T) -> &mut Self
where
T: Iden,
{
self.alter_option(TableAlterOption::DropColumn(SeaRc::new(col_name)))
}
fn alter_option(&mut self, alter_option: TableAlterOption) -> &mut Self {
self.alter_option = Some(alter_option);
self
}
pub fn take(&mut self) -> Self {
Self {
table: self.table.take(),
alter_option: self.alter_option.take(),
}
}
}
impl SchemaStatementBuilder for TableAlterStatement {
fn build<T: SchemaBuilder>(&self, schema_builder: T) -> String {
let mut sql = SqlWriter::new();
schema_builder.prepare_table_alter_statement(self, &mut sql);
sql.result()
}
fn build_any(&self, schema_builder: &dyn SchemaBuilder) -> String {
let mut sql = SqlWriter::new();
schema_builder.prepare_table_alter_statement(self, &mut sql);
sql.result()
}
}