#[macro_export]
macro_rules! myupdate {
($t:expr, {$ik:tt: $iv:expr}, {$($k:tt: [$m:tt, $v:expr]),+$(,)?}) => {
{
fn type_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
fn get_v_type(t: &'static str) -> &'static str {
match t {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
t
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
t
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
t
},
"&core::option::Option<&str>" |
"&core::option::Option<alloc::string::String>" |
"&core::option::Option<&alloc::string::String>" => {
"&&str"
},
"&&core::option::Option<&str>" |
"&&core::option::Option<alloc::string::String>" |
"&&core::option::Option<&alloc::string::String>" => {
"&&str"
},
"&core::option::Option<u8>" |
"&core::option::Option<u16>" |
"&core::option::Option<u32>" |
"&core::option::Option<u64>" |
"&core::option::Option<u128>" |
"&core::option::Option<usize>" |
"&core::option::Option<i8>" |
"&core::option::Option<i16>" |
"&core::option::Option<i32>" |
"&core::option::Option<i64>" |
"&core::option::Option<i128>" |
"&core::option::Option<isize>" |
"&core::option::Option<f32>" |
"&core::option::Option<f64>" |
"&core::option::Option<f128>" |
"&core::option::Option<bool>" => {
"&u8"
},
"&&core::option::Option<u8>" |
"&&core::option::Option<u16>" |
"&&core::option::Option<u32>" |
"&&core::option::Option<u64>" |
"&&core::option::Option<u128>" |
"&&core::option::Option<usize>" |
"&&core::option::Option<i8>" |
"&&core::option::Option<i16>" |
"&&core::option::Option<i32>" |
"&&core::option::Option<i64>" |
"&&core::option::Option<i128>" |
"&&core::option::Option<isize>" |
"&&core::option::Option<f32>" |
"&&core::option::Option<f64>" |
"&&core::option::Option<f128>" |
"&&core::option::Option<bool>" => {
"&u8"
},
_ => {
"&&str"
},
}
}
let tmp_ik = $ik.to_string();
let i_data = $iv;
let i_type = type_of(&i_data);
let tmp_i = match i_type {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
let mut v_r = i_data.to_string().as_str().replace("\\", "\\\\");
v_r = v_r.replace("\"", "\\\"");
"\"".to_string() + &v_r + "\""
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
i_data.to_string() + ""
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
i_data.to_string() + ""
},
_ => {
"".to_string()
}
};
let mut temp_s = String::from("");
$(
let temp_op = $v;
let op_v_type = type_of(&temp_op);
let mut temp_v: String;
let mut v_type = "&&str";
let mut is_option_none = false;
let value;
if op_v_type.contains("&core::option::Option") {
let op_str = format!("{:?}", temp_op);
if op_str == "None".to_string() {
temp_v = "null".to_string();
is_option_none = true;
} else {
let mut t = op_str.replace("Some(", "");
t.pop();
temp_v = t;
v_type = get_v_type(op_v_type)
}
} else {
temp_v = format!("{:?}", temp_op);
v_type = get_v_type(op_v_type)
}
if temp_v.as_str() == "null" || temp_v.as_str() == "\"null\"" {
value = "NULL,".to_string();
} else {
value = match v_type {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
temp_v.remove(0);
temp_v.pop();
"\"".to_string() + &temp_v + "\","
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
temp_v + ","
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
temp_v + ","
},
_ => {
"".to_string()
}
};
}
let tmp_s = match $m {
"set" => $k.to_string() + "=" + value.as_str(),
"incr" => {
let mut op = "+";
let first = &value.as_str()[0..1];
if first == "-" {
op = ""
}
$k.to_string() + "=" + $k + op + value.as_str()
},
"unset" => $k.to_string() + "=NULL,",
_ => $k.to_string() + "=" + value.as_str(),
};
if !is_option_none {
temp_s = temp_s + tmp_s.as_str();
}
)+
temp_s.pop();
let sql: String = "UPDATE ".to_string() + $t + " SET " + temp_s.as_str()
+ " WHERE " + tmp_ik.as_str() + "=" + tmp_i.as_str();
sql
}
};
($t:expr, {$ik:tt: $iv:expr}, {$($k:tt: $v:expr),+$(,)?}) => {
{
fn type_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
fn get_v_type(t: &'static str) -> &'static str {
match t {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
t
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
t
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
t
},
"&core::option::Option<&str>" |
"&core::option::Option<alloc::string::String>" |
"&core::option::Option<&alloc::string::String>" => {
"&&str"
},
"&&core::option::Option<&str>" |
"&&core::option::Option<alloc::string::String>" |
"&&core::option::Option<&alloc::string::String>" => {
"&&str"
},
"&core::option::Option<u8>" |
"&core::option::Option<u16>" |
"&core::option::Option<u32>" |
"&core::option::Option<u64>" |
"&core::option::Option<u128>" |
"&core::option::Option<usize>" |
"&core::option::Option<i8>" |
"&core::option::Option<i16>" |
"&core::option::Option<i32>" |
"&core::option::Option<i64>" |
"&core::option::Option<i128>" |
"&core::option::Option<isize>" |
"&core::option::Option<f32>" |
"&core::option::Option<f64>" |
"&core::option::Option<f128>" |
"&core::option::Option<bool>" => {
"&u8"
},
"&&core::option::Option<u8>" |
"&&core::option::Option<u16>" |
"&&core::option::Option<u32>" |
"&&core::option::Option<u64>" |
"&&core::option::Option<u128>" |
"&&core::option::Option<usize>" |
"&&core::option::Option<i8>" |
"&&core::option::Option<i16>" |
"&&core::option::Option<i32>" |
"&&core::option::Option<i64>" |
"&&core::option::Option<i128>" |
"&&core::option::Option<isize>" |
"&&core::option::Option<f32>" |
"&&core::option::Option<f64>" |
"&&core::option::Option<f128>" |
"&&core::option::Option<bool>" => {
"&u8"
},
_ => {
"&&str"
},
}
}
let tmp_ik = $ik.to_string();
let i_data = $iv;
let i_type = type_of(&i_data);
let tmp_i = match i_type {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
let mut v_r = i_data.to_string().as_str().replace("\\", "\\\\");
v_r = v_r.replace("\"", "\\\"");
"\"".to_string() + &v_r + "\""
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
i_data.to_string() + ""
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
i_data.to_string() + ""
},
_ => {
"".to_string()
},
};
let mut temp_s = String::from("");
$(
let temp_op = $v;
let op_v_type = type_of(&temp_op);
let mut temp_v: String;
let mut v_type = "&&str";
let mut is_option_none = false;
let value;
if op_v_type.contains("&core::option::Option") {
let op_str = format!("{:?}", temp_op);
if op_str == "None".to_string() {
temp_v = "null".to_string();
is_option_none = true;
} else {
let mut t = op_str.replace("Some(", "");
t.pop();
temp_v = t;
v_type = get_v_type(op_v_type)
}
} else {
temp_v = format!("{:?}", temp_op);
v_type = get_v_type(op_v_type)
}
if temp_v.as_str() == "null" || temp_v.as_str() == "\"null\"" {
value = "NULL,".to_string();
} else {
value = match v_type {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
temp_v.remove(0);
temp_v.pop();
"\"".to_string() + &temp_v + "\","
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
temp_v + ","
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
temp_v + ","
},
_ => {
"".to_string()
},
};
}
let tmp_s = $k.to_string() + "=" + value.as_str();
if !is_option_none {
temp_s = temp_s + tmp_s.as_str();
}
)+
temp_s.pop();
let sql: String = "UPDATE ".to_string() + $t + " SET " + temp_s.as_str()
+ " WHERE " + tmp_ik.as_str() + "=" + tmp_i.as_str();
sql
}
};
($t:expr, $i:expr, {$($k:tt: [$m:tt, $v:expr]),+$(,)?}) => {
{
fn type_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
fn get_v_type(t: &'static str) -> &'static str {
match t {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
t
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
t
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
t
},
"&core::option::Option<&str>" |
"&core::option::Option<alloc::string::String>" |
"&core::option::Option<&alloc::string::String>" => {
"&&str"
},
"&&core::option::Option<&str>" |
"&&core::option::Option<alloc::string::String>" |
"&&core::option::Option<&alloc::string::String>" => {
"&&str"
},
"&core::option::Option<u8>" |
"&core::option::Option<u16>" |
"&core::option::Option<u32>" |
"&core::option::Option<u64>" |
"&core::option::Option<u128>" |
"&core::option::Option<usize>" |
"&core::option::Option<i8>" |
"&core::option::Option<i16>" |
"&core::option::Option<i32>" |
"&core::option::Option<i64>" |
"&core::option::Option<i128>" |
"&core::option::Option<isize>" |
"&core::option::Option<f32>" |
"&core::option::Option<f64>" |
"&core::option::Option<f128>" |
"&core::option::Option<bool>" => {
"&u8"
},
"&&core::option::Option<u8>" |
"&&core::option::Option<u16>" |
"&&core::option::Option<u32>" |
"&&core::option::Option<u64>" |
"&&core::option::Option<u128>" |
"&&core::option::Option<usize>" |
"&&core::option::Option<i8>" |
"&&core::option::Option<i16>" |
"&&core::option::Option<i32>" |
"&&core::option::Option<i64>" |
"&&core::option::Option<i128>" |
"&&core::option::Option<isize>" |
"&&core::option::Option<f32>" |
"&&core::option::Option<f64>" |
"&&core::option::Option<f128>" |
"&&core::option::Option<bool>" => {
"&u8"
},
_ => {
"&&str"
},
}
}
let i_data = $i;
let i_type = type_of(&i_data);
let tmp_i = match i_type {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
let mut v_r = i_data.to_string().as_str().replace("\\", "\\\\");
v_r = v_r.replace("\"", "\\\"");
"\"".to_string() + &v_r + "\""
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
i_data.to_string() + ""
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
i_data.to_string() + ""
},
_ => {
"".to_string()
},
};
let mut temp_s = String::from("");
$(
let temp_op = $v;
let op_v_type = type_of(&temp_op);
let mut temp_v: String;
let mut v_type = "&&str";
let mut is_option_none = false;
let value;
if op_v_type.contains("&core::option::Option") {
let op_str = format!("{:?}", temp_op);
if op_str == "None".to_string() {
temp_v = "null".to_string();
is_option_none = true;
} else {
let mut t = op_str.replace("Some(", "");
t.pop();
temp_v = t;
v_type = get_v_type(op_v_type)
}
} else {
temp_v = format!("{:?}", temp_op);
v_type = get_v_type(op_v_type)
}
if temp_v.as_str() == "null" || temp_v.as_str() == "\"null\"" {
value = "NULL,".to_string();
} else {
value = match v_type {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
temp_v.remove(0);
temp_v.pop();
"\"".to_string() + &temp_v + "\","
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
temp_v + ","
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
temp_v + ","
},
_ => {
"".to_string()
},
};
}
let tmp_s = match $m {
"set" => $k.to_string() + "=" + value.as_str(),
"incr" => {
let mut op = "+";
let first = &value.as_str()[0..1];
if first == "-" {
op = ""
}
$k.to_string() + "=" + $k + op + value.as_str()
},
"unset" => $k.to_string() + "=NULL,",
_ => $k.to_string() + "=" + value.as_str(),
};
if !is_option_none {
temp_s = temp_s + tmp_s.as_str();
}
)+
temp_s.pop();
let sql: String = "UPDATE ".to_string() + $t + " SET " + temp_s.as_str()
+ " WHERE id=" + tmp_i.as_str();
sql
}
};
($t:expr, $i:expr, {$($k:tt: $v:expr),+$(,)?}) => {
{
fn type_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
fn get_v_type(t: &'static str) -> &'static str {
match t {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
t
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
t
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
t
},
"&core::option::Option<&str>" |
"&core::option::Option<alloc::string::String>" |
"&core::option::Option<&alloc::string::String>" => {
"&&str"
},
"&&core::option::Option<&str>" |
"&&core::option::Option<alloc::string::String>" |
"&&core::option::Option<&alloc::string::String>" => {
"&&str"
},
"&core::option::Option<u8>" |
"&core::option::Option<u16>" |
"&core::option::Option<u32>" |
"&core::option::Option<u64>" |
"&core::option::Option<u128>" |
"&core::option::Option<usize>" |
"&core::option::Option<i8>" |
"&core::option::Option<i16>" |
"&core::option::Option<i32>" |
"&core::option::Option<i64>" |
"&core::option::Option<i128>" |
"&core::option::Option<isize>" |
"&core::option::Option<f32>" |
"&core::option::Option<f64>" |
"&core::option::Option<f128>" |
"&core::option::Option<bool>" => {
"&u8"
},
"&&core::option::Option<u8>" |
"&&core::option::Option<u16>" |
"&&core::option::Option<u32>" |
"&&core::option::Option<u64>" |
"&&core::option::Option<u128>" |
"&&core::option::Option<usize>" |
"&&core::option::Option<i8>" |
"&&core::option::Option<i16>" |
"&&core::option::Option<i32>" |
"&&core::option::Option<i64>" |
"&&core::option::Option<i128>" |
"&&core::option::Option<isize>" |
"&&core::option::Option<f32>" |
"&&core::option::Option<f64>" |
"&&core::option::Option<f128>" |
"&&core::option::Option<bool>" => {
"&u8"
},
_ => {
"&&str"
},
}
}
let i_data = $i;
let i_type = type_of(&i_data);
let tmp_i = match i_type {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
let mut v_r = i_data.to_string().as_str().replace("\\", "\\\\");
v_r = v_r.replace("\"", "\\\"");
"\"".to_string() + &v_r + "\""
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
i_data.to_string() + ""
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
i_data.to_string() + ""
},
_ => {
"".to_string()
},
};
let mut temp_s = String::from("");
$(
let temp_op = $v;
let op_v_type = type_of(&temp_op);
let mut temp_v: String;
let mut v_type = "&&str";
let mut is_option_none = false;
let value;
if op_v_type.contains("&core::option::Option") {
let op_str = format!("{:?}", temp_op);
if op_str == "None".to_string() {
temp_v = "null".to_string();
is_option_none = true;
} else {
let mut t = op_str.replace("Some(", "");
t.pop();
temp_v = t;
v_type = get_v_type(op_v_type)
}
} else {
temp_v = format!("{:?}", temp_op);
v_type = get_v_type(op_v_type)
}
if temp_v.as_str() == "null" || temp_v.as_str() == "\"null\"" {
value = "NULL,".to_string();
} else {
value = match v_type {
"&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
temp_v.remove(0);
temp_v.pop();
"\"".to_string() + &temp_v + "\","
},
"&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
"&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
"&f32" | "&f64" | "&f128" | "&bool" => {
temp_v + ","
},
"&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
"&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
"&&f32" | "&&f64" | "&&f128" | "&&bool" => {
temp_v + ","
},
_ => {
"".to_string()
},
};
}
let tmp_s = $k.to_string() + "=" + value.as_str();
if !is_option_none {
temp_s = temp_s + tmp_s.as_str();
}
)+
temp_s.pop();
let sql: String = "UPDATE ".to_string() + $t + " SET " + temp_s.as_str()
+ " WHERE id=" + tmp_i.as_str();
sql
}
};
}