access_db 0.2.1

数据库连接
Documentation


/// 获取一条数据:
/// 
/// ```
/// 1.默认根据 id 查寻
/// let sql1 = myget!("feedback", 33, "id,content as cc");
/// println!("sql1::: {}", sql1);
/// #[derive(Serialize, Deserialize, Debug)]
/// struct Feedback {
///     id: u64,
///     cc: String
/// }
/// let res_get: (Vec<Feedback>, Option<(u64, String)>) = myconn.run(sql1);
/// println!("结果》》 : {:#?}", res_get);
/// 
/// 
/// 2.根据 指定字段查寻
/// myget!("table", {"uid": 32})
/// 
/// ```
/// 
#[macro_export]
macro_rules! myget {
    ($t:expr, {$k:tt: $v:expr} $(,$select:expr)?$(,)?) => {
        {
            fn _type_of<T>(_: T) -> &'static str {
                std::any::type_name::<T>()
            }
            fn get_table(tt: &str) -> &str {
                let t_list: Vec<&str> = tt.split_whitespace().collect();
                let table_change = t_list[t_list.len() - 1];
                table_change
            }
            // 将没有带上表名的字段,都重新命名为 主表字段  main_t_change是重命名后的
            fn _rename_field(field: &str, main_t_change: &str) -> String {
                let mut tmp_name = field.to_string();
                if !field.contains(".") {
                    let tmp = main_t_change.to_string() + "." + field;
                    tmp_name = tmp;
                }
                tmp_name
            }
            fn _get_select(s: &str, main_table_change: &str) -> String {
                let mut tmp_select = String::from("");
                for v in s.split(",").collect::<Vec<&str>>().iter() {
                    let tmpv = v.trim();
                    tmp_select = tmp_select + _rename_field(tmpv, main_table_change).as_str() + ",";
                }
                tmp_select.pop();
                tmp_select
            }

            let keys = $k.to_string();
            let temp_v = $v.clone();
            let v_type = _type_of($v);
            let values = match v_type {
                "&str" => {
                    let mut v_r = temp_v.to_string().as_str().replace("\\", "\\\\");
                    v_r = v_r.replace("\"", "\\\"");
                    "\"".to_string() + &v_r + "\""
                },
                "alloc::string::String" => {
                    let mut v_r = temp_v.to_string().as_str().replace("\\", "\\\\");
                    v_r = v_r.replace("\"", "\\\"");
                    "\"".to_string() + &v_r + "\""
                },
                _ => {
                    temp_v.to_string() + ""
                }
            };
            let _table_change = get_table($t);
            let mut _select = "*";
            $(
                let tmp_s = _get_select($select, _table_change);
                _select = tmp_s.as_str();
            )?

            let sql = "SELECT ".to_string() + _select +
                " FROM " + $t +
                " WHERE " + keys.as_str() + "=" + values.as_str();
        
            sql
        }
    };
    ($t:expr, $v: expr $(,$select:expr)?$(,)?) => {
        {
            fn _type_of<T>(_: T) -> &'static str {
                std::any::type_name::<T>()
            }
            fn get_table(tt: &str) -> &str {
                let t_list: Vec<&str> = tt.split_whitespace().collect();
                let table_change = t_list[t_list.len() - 1];
                table_change
            }
            // 将没有带上表名的字段,都重新命名为 主表字段  main_t_change是重命名后的
            fn _rename_field(field: &str, main_t_change: &str) -> String {
                let mut tmp_name = field.to_string();
                if !field.contains(".") {
                    let tmp = main_t_change.to_string() + "." + field;
                    tmp_name = tmp;
                }
                tmp_name
            }
            fn _get_select(s: &str, main_table_change: &str) -> String {
                let mut tmp_select = String::from("");
                for v in s.split(",").collect::<Vec<&str>>().iter() {
                    let tmpv = v.trim();
                    tmp_select = tmp_select + _rename_field(tmpv, main_table_change).as_str() + ",";
                }
                tmp_select.pop();
                tmp_select
            }

            let temp_v = $v.clone();
            let v_type = _type_of($v);
            let values = match v_type {
                "&str" => {
                    let mut v_r = temp_v.to_string().as_str().replace("\\", "\\\\");
                    v_r = v_r.replace("\"", "\\\"");
                    "\"".to_string() + &v_r + "\""
                },
                "alloc::string::String" => {
                    let mut v_r = temp_v.to_string().as_str().replace("\\", "\\\\");
                    v_r = v_r.replace("\"", "\\\"");
                    "\"".to_string() + &v_r + "\""
                },
                _ => {
                    temp_v.to_string() + ""
                }
            };
            let _table_change = get_table($t);
            let mut _select = "*";
            $(
                let tmp_s = _get_select($select, _table_change);
                _select = tmp_s.as_str();
            )?

            let sql = "SELECT ".to_string() + _select +
                " FROM " + $t +
                " WHERE id=" + values.as_str();
        
            sql
        }
    };
}