1use crate::db_pool::DbDriver;
4
5pub fn sql_type_to_rust(sql_type: &str, nullable: bool) -> String {
7 let base_type = match sql_type.to_uppercase().as_str() {
8 "INT" | "INTEGER" | "BIGINT" => "i64",
9 "INT UNSIGNED" | "BIGINT UNSIGNED" => "u64",
10 "SMALLINT" | "TINYINT" => "i32",
11 "VARCHAR" | "TEXT" | "CHAR" | "LONGTEXT" => "String",
12 "DECIMAL" | "NUMERIC" | "FLOAT" | "DOUBLE" => "f64",
13 "BOOLEAN" | "BOOL" | "TINYINT(1)" => "bool",
14 "DATE" | "DATETIME" | "TIMESTAMP" => "chrono::NaiveDateTime",
15 "TIME" => "chrono::NaiveTime",
16 _ => "String", };
18
19 if nullable {
20 format!("Option<{}>", base_type)
21 } else {
22 base_type.to_string()
23 }
24}
25
26pub fn is_safe_table_name(name: &str) -> bool {
28 name.chars().all(|c| c.is_alphanumeric() || c == '_')
29}
30
31pub fn is_safe_field_name(name: &str) -> bool {
33 name.chars().all(|c| c.is_alphanumeric() || c == '_')
34}
35
36pub fn escape_identifier(driver: DbDriver, name: &str) -> String {
38 match driver {
39 DbDriver::MySql => format!("`{}`", name),
40 DbDriver::Postgres => format!("\"{}\"", name),
41 DbDriver::Sqlite => format!("\"{}\"", name),
42 }
43}
44
45