use crate::{
backend::SchemaBuilder, prepare::*, types::*, ColumnDef, SchemaStatementBuilder,
TableForeignKey,
};
#[derive(Debug, Clone)]
pub struct TableAlterStatement {
pub(crate) table: Option<DynIden>,
pub(crate) options: Vec<TableAlterOption>,
}
#[derive(Debug, Clone)]
pub struct AddColumnOption {
pub(crate) column: ColumnDef,
pub(crate) if_not_exists: bool,
}
#[derive(Debug, Clone)]
pub enum TableAlterOption {
AddColumn(AddColumnOption),
ModifyColumn(ColumnDef),
RenameColumn(DynIden, DynIden),
DropColumn(DynIden),
AddForeignKey(TableForeignKey),
DropForeignKey(DynIden),
}
impl Default for TableAlterStatement {
fn default() -> Self {
Self::new()
}
}
impl TableAlterStatement {
pub fn new() -> Self {
Self {
table: None,
options: Vec::new(),
}
}
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.options
.push(TableAlterOption::AddColumn(AddColumnOption {
column: column_def.take(),
if_not_exists: false,
}));
self
}
pub fn add_column_if_not_exists(&mut self, column_def: &mut ColumnDef) -> &mut Self {
self.options
.push(TableAlterOption::AddColumn(AddColumnOption {
column: column_def.take(),
if_not_exists: true,
}));
self
}
pub fn modify_column(&mut self, column_def: &mut ColumnDef) -> &mut Self {
self.add_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.add_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.add_alter_option(TableAlterOption::DropColumn(SeaRc::new(col_name)))
}
pub fn add_foreign_key(&mut self, foreign_key: &TableForeignKey) -> &mut Self {
self.add_alter_option(TableAlterOption::AddForeignKey(foreign_key.to_owned()))
}
pub fn drop_foreign_key<T>(&mut self, name: T) -> &mut Self
where
T: IntoIden,
{
self.add_alter_option(TableAlterOption::DropForeignKey(name.into_iden()))
}
fn add_alter_option(&mut self, alter_option: TableAlterOption) -> &mut Self {
self.options.push(alter_option);
self
}
pub fn take(&mut self) -> Self {
Self {
table: self.table.take(),
options: std::mem::take(&mut self.options),
}
}
}
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()
}
}