sql_tools/statements/alter/
implement.rs

1use 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 session(self, schema: &str, value: &str) -> Result<(), Error> {
13    //     let query = format!("ALTER SESSION SET {schema} = '{value}'");
14    //     match self.connect {
15    //         SQLVariation::Oracle(oracle_connect) => alter(oracle_connect, query),
16    //     }
17    // }
18
19    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    /// Builds the `ALTER` query.
106    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}