use crate::SqlWriterValues;
use crate::index::CreateIndex;
use crate::index::write_table_index;
use crate::table::ColumnDef;
use crate::table::write_column_spec;
use crate::table::write_column_type;
use crate::types::IntoTableRef;
use crate::types::TableRef;
use crate::types::write_iden;
use crate::types::write_table_ref;
use crate::writer::SqlWriter;
#[derive(Default, Debug, Clone)]
pub struct CreateTable {
table: Option<TableRef>,
columns: Vec<ColumnDef>,
indexes: Vec<CreateIndex>,
if_not_exists: bool,
temporary: bool,
}
impl CreateTable {
pub fn new() -> Self {
Self::default()
}
pub fn to_values(&self) -> SqlWriterValues {
let mut w = SqlWriterValues::new();
write_create_table(&mut w, self);
w
}
pub fn to_sql(&self) -> String {
let mut sql = String::new();
write_create_table(&mut sql, self);
sql
}
pub fn if_not_exists(mut self) -> Self {
self.if_not_exists = true;
self
}
pub fn temporary(mut self) -> Self {
self.temporary = true;
self
}
pub fn table<T>(mut self, table: T) -> Self
where
T: IntoTableRef,
{
self.table = Some(table.into_table_ref());
self
}
pub fn column(mut self, column: ColumnDef) -> Self {
self.columns.push(column);
self
}
pub fn primary_key(mut self, index: CreateIndex) -> Self {
self.indexes.push(index.primary());
self
}
}
fn write_create_table<W: SqlWriter>(w: &mut W, table: &CreateTable) {
w.push_str("CREATE ");
if table.temporary {
w.push_str("TEMPORARY ");
}
w.push_str("TABLE ");
if table.if_not_exists {
w.push_str("IF NOT EXISTS ");
}
if let Some(table_ref) = &table.table {
write_table_ref(w, table_ref);
}
w.push_str(" ( ");
let mut is_first = true;
macro_rules! write_comma_if_not_first {
() => {
if is_first {
is_first = false
} else {
w.push_str(", ");
}
};
}
for col in &table.columns {
write_comma_if_not_first!();
write_iden(w, &col.name);
if let Some(ty) = &col.ty {
w.push_str(" ");
write_column_type(w, ty);
}
write_column_spec(w, &col.spec);
}
for idx in &table.indexes {
write_comma_if_not_first!();
write_table_index(w, idx);
}
let _ = is_first;
w.push_str(" )");
}