sql_tools/statements/alter/
implement.rs1use crate::{
2 Error, SQLImplementation,
3 statements::{
4 alter::sql_implementations::{oracle::alter_oracle, sqlite::alter_sqlite},
5 create::CreateDataTypes,
6 },
7};
8
9use super::{AlterBuilder, AlterColumns, AlterProps, AlterTable, AlterTableBuilder, Altered};
10
11impl AlterBuilder for AlterProps {
12 fn table(self, table_name: &str) -> AlterTable {
20 let query = format!("ALTER TABLE {table_name} ");
21 AlterTable {
22 connect: self.connect,
23 query,
24 table_name: table_name.to_string(),
25 }
26 }
27}
28
29impl AlterTableBuilder for AlterTable {
30 fn add(mut self, columns: Vec<AlterColumns>) -> Altered {
31 let cols = columns
32 .iter()
33 .map(|cols| alter_cols_fmt(cols))
34 .collect::<Vec<String>>();
35 let add = format!("ADD ({})", cols.join(", "));
36 self.query = format!("{} {add}", &self.query);
37 Altered {
38 connect: self.connect,
39 query: self.query,
40 }
41 }
42
43 fn modify(mut self, columns: Vec<AlterColumns>) -> Altered {
44 let cols = columns
45 .iter()
46 .map(|cols| alter_cols_fmt(cols))
47 .collect::<Vec<String>>();
48 let modify = format!("MODIFY ({})", cols.join(", "));
49 self.query = format!("{} {modify}", &self.query);
50 Altered {
51 connect: self.connect,
52 query: self.query,
53 }
54 }
55
56 fn drop(mut self, column: &str) -> Altered {
57 let drop = format!("DROP COLUMN {column}");
58 self.query = format!("{} {drop}", &self.query);
59 Altered {
60 connect: self.connect,
61 query: self.query,
62 }
63 }
64
65 fn rename_column(mut self, column: &str, new_name: &str) -> Altered {
66 let rename = format!("RENAME COLUMN {column} TO {new_name}");
67 self.query = format!("{} {rename}", &self.query);
68 Altered {
69 connect: self.connect,
70 query: self.query,
71 }
72 }
73
74 fn rename(mut self, new_table_name: &str) -> Altered {
75 let rename = format!("RENAME TO {new_table_name}");
76 self.query = format!("{} {rename}", &self.query);
77 Altered {
78 connect: self.connect,
79 query: self.query,
80 }
81 }
82}
83
84pub fn alter_cols_fmt(cols: &AlterColumns) -> String {
85 let data_type = match cols.data_type {
86 CreateDataTypes::VARCHAR(size) => format!("VARCHAR2 ({size})"),
87 CreateDataTypes::NUMBER => format!("NUMBER"),
88 CreateDataTypes::FLOAT => format!("FLOAT"),
89 CreateDataTypes::DATE => format!("DATE"),
90 };
91 let mut res = format!("{} {data_type}", cols.name);
92 res = if let Some(sql) = &cols.default {
93 format!("{res} DEFAULT '{sql}'")
94 } else {
95 res
96 };
97 if let true = cols.not_null {
98 format!("{res} NOT NULL")
99 } else {
100 res
101 }
102}
103
104impl Altered {
105 pub fn build(self) -> Result<(), Error> {
107 match self.connect {
108 SQLImplementation::Oracle(conn) => alter_oracle(conn, self.query),
109 SQLImplementation::SQLite(conn) => alter_sqlite(conn, self.query),
110 }
111 }
112}