use std::rc::Rc;
use crate::{ColumnDef, backend::TableBuilder, foreign_key::*, types::*, prepare::*};
#[derive(Debug, Clone)]
pub struct TableCreateStatement {
pub(crate) table: Option<Rc<dyn Iden>>,
pub(crate) columns: Vec<ColumnDef>,
pub(crate) options: Vec<TableOpt>,
pub(crate) partitions: Vec<TablePartition>,
pub(crate) foreign_keys: Vec<ForeignKeyCreateStatement>,
pub(crate) if_not_exists: bool,
}
#[derive(Debug, Clone)]
pub enum TableOpt {
Engine(String),
Collate(String),
CharacterSet(String),
}
#[derive(Debug, Clone)]
pub enum TablePartition {
}
impl Default for TableCreateStatement {
fn default() -> Self {
Self::new()
}
}
impl TableCreateStatement {
pub fn new() -> Self {
Self {
table: None,
columns: Vec::new(),
options: Vec::new(),
partitions: Vec::new(),
foreign_keys: Vec::new(),
if_not_exists: false,
}
}
#[deprecated(
since = "0.9.6",
note = "Please use the [`TableCreateStatement::if_not_exists`]"
)]
pub fn create_if_not_exists(&mut self) -> &mut Self {
self.if_not_exists = true;
self
}
pub fn if_not_exists(&mut self) -> &mut Self {
self.if_not_exists = true;
self
}
pub fn table<T: 'static>(&mut self, table: T) -> &mut Self
where T: Iden {
self.table = Some(Rc::new(table));
self
}
pub fn col(&mut self, column: ColumnDef) -> &mut Self {
let mut column = column;
column.table = self.table.clone();
self.columns.push(column);
self
}
pub fn foreign_key(&mut self, foreign_key: ForeignKeyCreateStatement) -> &mut Self {
let mut foreign_key = foreign_key;
foreign_key.inside_table_creation = true;
self.foreign_keys.push(foreign_key);
self
}
pub fn engine(&mut self, string: &str) -> &mut Self {
self.opt(TableOpt::Engine(string.into()));
self
}
pub fn collate(&mut self, string: &str) -> &mut Self {
self.opt(TableOpt::Collate(string.into()));
self
}
pub fn character_set(&mut self, string: &str) -> &mut Self {
self.opt(TableOpt::CharacterSet(string.into()));
self
}
fn opt(&mut self, option: TableOpt) -> &mut Self {
self.options.push(option);
self
}
#[allow(dead_code)]
fn partition(&mut self, partition: TablePartition) -> &mut Self {
self.partitions.push(partition);
self
}
pub fn build<T: TableBuilder>(&self, table_builder: T) -> String {
let mut sql = SqlWriter::new();
table_builder.prepare_table_create_statement(self, &mut sql);
sql.result()
}
pub fn build_any(&self, table_builder: &dyn TableBuilder) -> String {
let mut sql = SqlWriter::new();
table_builder.prepare_table_create_statement(self, &mut sql);
sql.result()
}
pub fn to_string<T: TableBuilder>(&self, table_builder: T) -> String {
self.build(table_builder)
}
}