sqlxplus/
utils.rs

1//! 工具函数模块
2
3use crate::db_pool::DbDriver;
4
5/// SQL 类型到 Rust 类型的映射
6pub 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", // 默认类型
17    };
18
19    if nullable {
20        format!("Option<{}>", base_type)
21    } else {
22        base_type.to_string()
23    }
24}
25
26/// 验证表名是否安全
27pub fn is_safe_table_name(name: &str) -> bool {
28    name.chars().all(|c| c.is_alphanumeric() || c == '_')
29}
30
31/// 验证字段名是否安全
32pub fn is_safe_field_name(name: &str) -> bool {
33    name.chars().all(|c| c.is_alphanumeric() || c == '_')
34}
35
36/// 转义 SQL 标识符
37pub 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