mssql_quick/method/
msupdate.rs

1/// 1.通过id,更新数据 ,返回 sql 语句。
2/// ```
3/// # use mssql_quick::{msupdate, ms_run_vec, MssqlQuick, EncryptionLevel, MssqlQuickSet};
4/// # const MSSQL_URL: &str = "server=tcp:localhost,1433;user=SA;password=ji83laFidia32FAEE534DFa;database=dev_db;IntegratedSecurity=true;TrustServerCertificate=true";
5/// # tokio_test::block_on(async {
6/// # let mut client = MssqlQuick::new(MSSQL_URL, EncryptionLevel::NotSupported).await.unwrap().client;
7/// # let des_str = r#"m'y,,a#@!@$$^&^%&&#\\ \ \ \ \ \ \ \\\\\$,,adflll+_)"(_)*)(32389)d(ŐдŐ๑)🍉 .',"#;
8/// let sql = msupdate!("for_test", 5, {
9///     "title": Some("更新标题"),
10///     "uid": 6,
11///     "content": des_str,
12///     "price": "null", // 更新字段值为NULL
13///     "price2": None, // 忽略该字段
14///     "total": Some(20), // 更新为 20
15/// });  // id = 5
16/// let _: Vec<()> = ms_run_vec(&mut client, sql).await.unwrap();
17///
18/// // 原子更新,(如果使用[字段,值]的方式,都所有都需要使用这种形式)
19/// let sql = msupdate!("for_test", 6, {
20///     "title": ["set", "价格减2"],  // set 修改操作
21///     "price": ["incr", -2],   // incr 原子性加减
22///     "content": ["unset", ""],   // unset 清空值
23/// });
24/// let _: Vec<()> = ms_run_vec(&mut client, sql).await.unwrap();
25/// # });
26/// ```
27///
28/// 2.通过指定字段的值,更新数据 ,返回 sql 语句。
29/// ```
30/// # use mssql_quick::{msupdate, ms_run_vec, MssqlQuick, EncryptionLevel, MssqlQuickSet};
31/// # const MSSQL_URL: &str = "server=tcp:localhost,1433;user=SA;password=ji83laFidia32FAEE534DFa;database=dev_db;IntegratedSecurity=true;TrustServerCertificate=true";
32/// # tokio_test::block_on(async {
33/// # let mut client = MssqlQuick::new(MSSQL_URL, EncryptionLevel::NotSupported).await.unwrap().client;
34/// let sql = msupdate!("for_test", {"uid": 5}, {"title": "更新了uid为5的数据"}); // 更新 uid = 5 的第一条数据
35/// let _: Vec<()> = ms_run_vec(&mut client, sql).await.unwrap();
36///
37/// // 原子性更新
38/// let sql = msupdate!("for_test", {"uid": 5}, {"total": ["incr", 1]});
39/// let _: Vec<()> = ms_run_vec(&mut client, sql).await.unwrap();
40/// # });
41/// ```
42///
43#[macro_export]
44macro_rules! msupdate {
45    ($t:expr, {$ik:tt: $iv:expr}, {$($k:tt: [$m:tt, $v:expr]),+$(,)?}) => {
46        {
47            fn type_of<T>(_: T) -> &'static str {
48                std::any::type_name::<T>()
49            }
50            fn get_v_type(t: &'static str) -> &'static str {
51                match t {
52                    "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
53                        t
54                    },
55                    "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
56                    "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
57                    "&f32" | "&f64" | "&f128" | "&bool" => {
58                        t
59                    },
60                    "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
61                    "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
62                    "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
63                        t
64                    },
65                    "&core::option::Option<&str>" |
66                    "&core::option::Option<alloc::string::String>" |
67                    "&core::option::Option<&alloc::string::String>" => {
68                        "&&str"
69                    },
70                    "&&core::option::Option<&str>" |
71                    "&&core::option::Option<alloc::string::String>" |
72                    "&&core::option::Option<&alloc::string::String>" => {
73                        "&&str"
74                    },
75                    "&core::option::Option<u8>" |
76                    "&core::option::Option<u16>" |
77                    "&core::option::Option<u32>" |
78                    "&core::option::Option<u64>" |
79                    "&core::option::Option<u128>" |
80                    "&core::option::Option<usize>" |
81                    "&core::option::Option<i8>" |
82                    "&core::option::Option<i16>" |
83                    "&core::option::Option<i32>" |
84                    "&core::option::Option<i64>" |
85                    "&core::option::Option<i128>" |
86                    "&core::option::Option<isize>" |
87                    "&core::option::Option<f32>" |
88                    "&core::option::Option<f64>" |
89                    "&core::option::Option<f128>" |
90                    "&core::option::Option<bool>" => {
91                        "&u8"
92                    },
93                    "&&core::option::Option<u8>" |
94                    "&&core::option::Option<u16>" |
95                    "&&core::option::Option<u32>" |
96                    "&&core::option::Option<u64>" |
97                    "&&core::option::Option<u128>" |
98                    "&&core::option::Option<usize>" |
99                    "&&core::option::Option<i8>" |
100                    "&&core::option::Option<i16>" |
101                    "&&core::option::Option<i32>" |
102                    "&&core::option::Option<i64>" |
103                    "&&core::option::Option<i128>" |
104                    "&&core::option::Option<isize>" |
105                    "&&core::option::Option<f32>" |
106                    "&&core::option::Option<f64>" |
107                    "&&core::option::Option<f128>" |
108                    "&&core::option::Option<bool>" => {
109                        "&u8"
110                    },
111                    _ => {
112                       "&&str"
113                    },
114                }
115            }
116            let tmp_ik = $ik.to_string();
117            let i_data = $iv;
118            let i_type = type_of(&i_data);
119            let tmp_i = match i_type {
120                "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
121                    let mut v_r = i_data.to_string();
122                    v_r = v_r.replace("'", "''");
123                    "N'".to_string() + &v_r + "'"
124                },
125                "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
126                "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
127                "&f32" | "&f64" | "&f128" | "&bool" => {
128                    i_data.to_string() + ""
129                },
130                "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
131                "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
132                "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
133                    i_data.to_string() + ""
134                },
135                _ => {
136                   "".to_string()
137                },
138            };
139
140
141            let mut temp_s = String::from("");
142            $(
143                let temp_op = $v;
144                let op_v_type = type_of(&temp_op);
145                let mut temp_v: String;
146                let mut v_type = "&&str";
147                let mut is_option_none = false;
148                let value;
149                if op_v_type.contains("&core::option::Option") {
150                    let op_str = format!("{:?}", temp_op);
151                    if op_str == "None".to_string() {
152                        temp_v = "null".to_string();
153                        is_option_none = true;
154                    } else {
155                        let mut t = op_str.replace("Some(", "");
156                        t.pop();
157                        temp_v = t;
158                        v_type = get_v_type(op_v_type)
159                    }
160                } else {
161                    temp_v = format!("{:?}", temp_op);
162                    v_type = get_v_type(op_v_type)
163                }
164                if temp_v.as_str() == "null" || temp_v.as_str() == "\"null\"" {
165                    value = "NULL,".to_string();
166                } else {
167                    value = match v_type {
168                        "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
169                            temp_v.remove(0);
170                            temp_v.pop();
171                            let mut v_r = temp_v.as_str().replace(r#"\\"#, r#"\"#);
172                            v_r = v_r.replace(r#"\""#, r#"""#);
173                            v_r = v_r.replace("'", "''");
174                            "N'".to_string() + &v_r + "',"
175                        },
176                        "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
177                        "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
178                        "&f32" | "&f64" | "&f128" | "&bool" => {
179                            temp_v + ","
180                        },
181                        "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
182                        "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
183                        "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
184                            temp_v + ","
185                        },
186                        _ => {
187                           "".to_string()
188                        },
189                    };
190                }
191
192                let tmp_s = match $m {
193                    "set" => $k.to_string() + "=" + value.as_str(),
194                    "incr" => {
195                        let mut op = "+";
196                        let first = &value.as_str()[0..1];
197                        if first == "-" {
198                            op = ""
199                        }
200                        $k.to_string() + "=" + $k + op + value.as_str()
201                    },
202                    "unset" => $k.to_string() + "=NULL,",
203                    _ => $k.to_string() + "=" + value.as_str(),
204                };
205                if !is_option_none {
206                    temp_s = temp_s + tmp_s.as_str();
207                }
208            )+
209
210            temp_s.pop();
211
212            let sql: String = "UPDATE ".to_string() + $t + " SET " + temp_s.as_str()
213                + " WHERE " + tmp_ik.as_str() + "=" + tmp_i.as_str();
214
215            sql
216        }
217    };
218
219    ($t:expr, {$ik:tt: $iv:expr}, {$($k:tt: $v:expr),+$(,)?}) => {
220        {
221            fn type_of<T>(_: T) -> &'static str {
222                std::any::type_name::<T>()
223            }
224            fn get_v_type(t: &'static str) -> &'static str {
225                match t {
226                    "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
227                        t
228                    },
229                    "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
230                    "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
231                    "&f32" | "&f64" | "&f128" | "&bool" => {
232                        t
233                    },
234                    "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
235                    "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
236                    "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
237                        t
238                    },
239                    "&core::option::Option<&str>" |
240                    "&core::option::Option<alloc::string::String>" |
241                    "&core::option::Option<&alloc::string::String>" => {
242                        "&&str"
243                    },
244                    "&&core::option::Option<&str>" |
245                    "&&core::option::Option<alloc::string::String>" |
246                    "&&core::option::Option<&alloc::string::String>" => {
247                        "&&str"
248                    },
249                    "&core::option::Option<u8>" |
250                    "&core::option::Option<u16>" |
251                    "&core::option::Option<u32>" |
252                    "&core::option::Option<u64>" |
253                    "&core::option::Option<u128>" |
254                    "&core::option::Option<usize>" |
255                    "&core::option::Option<i8>" |
256                    "&core::option::Option<i16>" |
257                    "&core::option::Option<i32>" |
258                    "&core::option::Option<i64>" |
259                    "&core::option::Option<i128>" |
260                    "&core::option::Option<isize>" |
261                    "&core::option::Option<f32>" |
262                    "&core::option::Option<f64>" |
263                    "&core::option::Option<f128>" |
264                    "&core::option::Option<bool>" => {
265                        "&u8"
266                    },
267                    "&&core::option::Option<u8>" |
268                    "&&core::option::Option<u16>" |
269                    "&&core::option::Option<u32>" |
270                    "&&core::option::Option<u64>" |
271                    "&&core::option::Option<u128>" |
272                    "&&core::option::Option<usize>" |
273                    "&&core::option::Option<i8>" |
274                    "&&core::option::Option<i16>" |
275                    "&&core::option::Option<i32>" |
276                    "&&core::option::Option<i64>" |
277                    "&&core::option::Option<i128>" |
278                    "&&core::option::Option<isize>" |
279                    "&&core::option::Option<f32>" |
280                    "&&core::option::Option<f64>" |
281                    "&&core::option::Option<f128>" |
282                    "&&core::option::Option<bool>" => {
283                        "&u8"
284                    },
285                    _ => {
286                       "&&str"
287                    },
288                }
289            }
290            let tmp_ik = $ik.to_string();
291            let i_data = $iv;
292            let i_type = type_of(&i_data);
293            let tmp_i = match i_type {
294                "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
295                    let mut v_r = i_data.to_string();
296                    v_r = v_r.replace("'", "''");
297                    "N'".to_string() + &v_r + "'"
298                },
299                "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
300                "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
301                "&f32" | "&f64" | "&f128" | "&bool" => {
302                    i_data.to_string() + ""
303                },
304                "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
305                "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
306                "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
307                    i_data.to_string() + ""
308                },
309                _ => {
310                   "".to_string()
311                },
312            };
313
314
315            let mut temp_s = String::from("");
316            $(
317                let temp_op = $v;
318                let op_v_type = type_of(&temp_op);
319                let mut temp_v: String;
320                let mut v_type = "&&str";
321                let mut is_option_none = false;
322                let value;
323                if op_v_type.contains("&core::option::Option") {
324                    let op_str = format!("{:?}", temp_op);
325                    if op_str == "None".to_string() {
326                        temp_v = "null".to_string();
327                        is_option_none = true;
328                    } else {
329                        let mut t = op_str.replace("Some(", "");
330                        t.pop();
331                        temp_v = t;
332                        v_type = get_v_type(op_v_type)
333                    }
334                } else {
335                    temp_v = format!("{:?}", temp_op);
336                    v_type = get_v_type(op_v_type)
337                }
338                if temp_v.as_str() == "null" || temp_v.as_str() == "\"null\"" {
339                    value = "NULL,".to_string();
340                } else {
341                    value = match v_type {
342                        "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
343                            temp_v.remove(0);
344                            temp_v.pop();
345                            let mut v_r = temp_v.as_str().replace(r#"\\"#, r#"\"#);
346                            v_r = v_r.replace(r#"\""#, r#"""#);
347                            v_r = v_r.replace("'", "''");
348                            "N'".to_string() + &v_r + "',"
349                        },
350                        "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
351                        "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
352                        "&f32" | "&f64" | "&f128" | "&bool" => {
353                            temp_v + ","
354                        },
355                        "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
356                        "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
357                        "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
358                            temp_v + ","
359                        },
360                        _ => {
361                           "".to_string()
362                        },
363                    };
364                }
365                let tmp_s = $k.to_string() + "=" + value.as_str();
366                if !is_option_none {
367                    temp_s = temp_s + tmp_s.as_str();
368                }
369            )+
370
371            temp_s.pop();
372
373            let sql: String = "UPDATE ".to_string() + $t + " SET " + temp_s.as_str()
374                + " WHERE " + tmp_ik.as_str() + "=" + tmp_i.as_str();
375
376            sql
377        }
378    };
379
380    ($t:expr, $i:expr, {$($k:tt: [$m:tt, $v:expr]),+$(,)?}) => {
381        {
382            fn type_of<T>(_: T) -> &'static str {
383                std::any::type_name::<T>()
384            }
385            fn get_v_type(t: &'static str) -> &'static str {
386                match t {
387                    "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
388                        t
389                    },
390                    "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
391                    "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
392                    "&f32" | "&f64" | "&f128" | "&bool" => {
393                        t
394                    },
395                    "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
396                    "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
397                    "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
398                        t
399                    },
400                    "&core::option::Option<&str>" |
401                    "&core::option::Option<alloc::string::String>" |
402                    "&core::option::Option<&alloc::string::String>" => {
403                        "&&str"
404                    },
405                    "&&core::option::Option<&str>" |
406                    "&&core::option::Option<alloc::string::String>" |
407                    "&&core::option::Option<&alloc::string::String>" => {
408                        "&&str"
409                    },
410                    "&core::option::Option<u8>" |
411                    "&core::option::Option<u16>" |
412                    "&core::option::Option<u32>" |
413                    "&core::option::Option<u64>" |
414                    "&core::option::Option<u128>" |
415                    "&core::option::Option<usize>" |
416                    "&core::option::Option<i8>" |
417                    "&core::option::Option<i16>" |
418                    "&core::option::Option<i32>" |
419                    "&core::option::Option<i64>" |
420                    "&core::option::Option<i128>" |
421                    "&core::option::Option<isize>" |
422                    "&core::option::Option<f32>" |
423                    "&core::option::Option<f64>" |
424                    "&core::option::Option<f128>" |
425                    "&core::option::Option<bool>" => {
426                        "&u8"
427                    },
428                    "&&core::option::Option<u8>" |
429                    "&&core::option::Option<u16>" |
430                    "&&core::option::Option<u32>" |
431                    "&&core::option::Option<u64>" |
432                    "&&core::option::Option<u128>" |
433                    "&&core::option::Option<usize>" |
434                    "&&core::option::Option<i8>" |
435                    "&&core::option::Option<i16>" |
436                    "&&core::option::Option<i32>" |
437                    "&&core::option::Option<i64>" |
438                    "&&core::option::Option<i128>" |
439                    "&&core::option::Option<isize>" |
440                    "&&core::option::Option<f32>" |
441                    "&&core::option::Option<f64>" |
442                    "&&core::option::Option<f128>" |
443                    "&&core::option::Option<bool>" => {
444                        "&u8"
445                    },
446                    _ => {
447                       "&&str"
448                    },
449                }
450            }
451            let i_data = $i;
452            let i_type = type_of(&i_data);
453            let tmp_i = match i_type {
454                "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
455                    let mut v_r = i_data.to_string();
456                    v_r = v_r.replace("'", "''");
457                    "N'".to_string() + &v_r + "'"
458                },
459                "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
460                "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
461                "&f32" | "&f64" | "&f128" | "&bool" => {
462                    i_data.to_string() + ""
463                },
464                "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
465                "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
466                "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
467                    i_data.to_string() + ""
468                },
469                _ => {
470                   "".to_string()
471                },
472            };
473
474
475            let mut temp_s = String::from("");
476            $(
477                let temp_op = $v;
478                let op_v_type = type_of(&temp_op);
479                let mut temp_v: String;
480                let mut v_type = "&&str";
481                let mut is_option_none = false;
482                let value;
483                if op_v_type.contains("&core::option::Option") {
484                    let op_str = format!("{:?}", temp_op);
485                    if op_str == "None".to_string() {
486                        temp_v = "null".to_string();
487                        is_option_none = true;
488                    } else {
489                        let mut t = op_str.replace("Some(", "");
490                        t.pop();
491                        temp_v = t;
492                        v_type = get_v_type(op_v_type)
493                    }
494                } else {
495                    temp_v = format!("{:?}", temp_op);
496                    v_type = get_v_type(op_v_type)
497                }
498                if temp_v.as_str() == "null" || temp_v.as_str() == "\"null\"" {
499                    value = "NULL,".to_string();
500                } else {
501                    value = match v_type {
502                        "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
503                            temp_v.remove(0);
504                            temp_v.pop();
505                            let mut v_r = temp_v.as_str().replace(r#"\\"#, r#"\"#);
506                            v_r = v_r.replace(r#"\""#, r#"""#);
507                            v_r = v_r.replace("'", "''");
508                            "N'".to_string() + &v_r + "',"
509                        },
510                        "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
511                        "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
512                        "&f32" | "&f64" | "&f128" | "&bool" => {
513                            temp_v + ","
514                        },
515                        "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
516                        "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
517                        "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
518                            temp_v + ","
519                        },
520                        _ => {
521                           "".to_string()
522                        },
523                    };
524                }
525                let tmp_s = match $m {
526                    "set" => $k.to_string() + "=" + value.as_str(),
527                    "incr" => {
528                        let mut op = "+";
529                        let first = &value.as_str()[0..1];
530                        if first == "-" {
531                            op = ""
532                        }
533                        $k.to_string() + "=" + $k + op + value.as_str()
534                    },
535                    "unset" => $k.to_string() + "=NULL,",
536                    _ => $k.to_string() + "=" + value.as_str(),
537                };
538                if !is_option_none {
539                    temp_s = temp_s + tmp_s.as_str();
540                }
541            )+
542
543            temp_s.pop();
544
545            let sql: String = "UPDATE ".to_string() + $t + " SET " + temp_s.as_str()
546                + " WHERE id=" + tmp_i.as_str();
547
548            sql
549        }
550    };
551
552    ($t:expr, $i:expr, {$($k:tt: $v:expr),+$(,)?}) => {
553        {
554            fn type_of<T>(_: T) -> &'static str {
555                std::any::type_name::<T>()
556            }
557            fn get_v_type(t: &'static str) -> &'static str {
558                match t {
559                    "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
560                        t
561                    },
562                    "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
563                    "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
564                    "&f32" | "&f64" | "&f128" | "&bool" => {
565                        t
566                    },
567                    "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
568                    "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
569                    "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
570                        t
571                    },
572                    "&core::option::Option<&str>" |
573                    "&core::option::Option<alloc::string::String>" |
574                    "&core::option::Option<&alloc::string::String>" => {
575                        "&&str"
576                    },
577                    "&&core::option::Option<&str>" |
578                    "&&core::option::Option<alloc::string::String>" |
579                    "&&core::option::Option<&alloc::string::String>" => {
580                        "&&str"
581                    },
582                    "&core::option::Option<u8>" |
583                    "&core::option::Option<u16>" |
584                    "&core::option::Option<u32>" |
585                    "&core::option::Option<u64>" |
586                    "&core::option::Option<u128>" |
587                    "&core::option::Option<usize>" |
588                    "&core::option::Option<i8>" |
589                    "&core::option::Option<i16>" |
590                    "&core::option::Option<i32>" |
591                    "&core::option::Option<i64>" |
592                    "&core::option::Option<i128>" |
593                    "&core::option::Option<isize>" |
594                    "&core::option::Option<f32>" |
595                    "&core::option::Option<f64>" |
596                    "&core::option::Option<f128>" |
597                    "&core::option::Option<bool>" => {
598                        "&u8"
599                    },
600                    "&&core::option::Option<u8>" |
601                    "&&core::option::Option<u16>" |
602                    "&&core::option::Option<u32>" |
603                    "&&core::option::Option<u64>" |
604                    "&&core::option::Option<u128>" |
605                    "&&core::option::Option<usize>" |
606                    "&&core::option::Option<i8>" |
607                    "&&core::option::Option<i16>" |
608                    "&&core::option::Option<i32>" |
609                    "&&core::option::Option<i64>" |
610                    "&&core::option::Option<i128>" |
611                    "&&core::option::Option<isize>" |
612                    "&&core::option::Option<f32>" |
613                    "&&core::option::Option<f64>" |
614                    "&&core::option::Option<f128>" |
615                    "&&core::option::Option<bool>" => {
616                        "&u8"
617                    },
618                    _ => {
619                       "&&str"
620                    },
621                }
622            }
623            let i_data = $i;
624            let i_type = type_of(&i_data);
625            let tmp_i = match i_type {
626                "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
627                    let mut v_r = i_data.to_string();
628                    v_r = v_r.replace("'", "''");
629                    "N'".to_string() + &v_r + "'"
630                },
631                "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
632                "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
633                "&f32" | "&f64" | "&f128" | "&bool" => {
634                    i_data.to_string() + ""
635                },
636                "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
637                "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
638                "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
639                    i_data.to_string() + ""
640                },
641                _ => {
642                   "".to_string()
643                },
644            };
645
646
647            let mut temp_s = String::from("");
648            $(
649                let temp_op = $v;
650                let op_v_type = type_of(&temp_op);
651                let mut temp_v: String;
652                let mut v_type = "&&str";
653                let mut is_option_none = false;
654                let value;
655                if op_v_type.contains("&core::option::Option") {
656                    let op_str = format!("{:?}", temp_op);
657                    if op_str == "None".to_string() {
658                        temp_v = "null".to_string();
659                        is_option_none = true;
660                    } else {
661                        let mut t = op_str.replace("Some(", "");
662                        t.pop();
663                        temp_v = t;
664                        v_type = get_v_type(op_v_type)
665                    }
666                } else {
667                    temp_v = format!("{:?}", temp_op);
668                    v_type = get_v_type(op_v_type)
669                }
670                if temp_v.as_str() == "null" || temp_v.as_str() == "\"null\"" {
671                    value = "NULL,".to_string();
672                } else {
673                    value = match v_type {
674                        "&&str" | "&alloc::string::String" | "&&alloc::string::String" => {
675                            temp_v.remove(0);
676                            temp_v.pop();
677                            let mut v_r = temp_v.as_str().replace(r#"\\"#, r#"\"#);
678                            v_r = v_r.replace(r#"\""#, r#"""#);
679                            v_r = v_r.replace("'", "''");
680                            "N'".to_string() + &v_r + "',"
681                        },
682                        "&u8" | "&u16" | "&u32" | "&u64" | "&u128" | "&usize" |
683                        "&i8" | "&i16" | "&i32" | "&i64" | "&i128" | "&isize" |
684                        "&f32" | "&f64" | "&f128" | "&bool" => {
685                            temp_v + ","
686                        },
687                        "&&u8" | "&&u16" | "&&u32" | "&&u64" | "&&u128" | "&&usize" |
688                        "&&i8" | "&&i16" | "&&i32" | "&&i64" | "&&i128" | "&&isize" |
689                        "&&f32" | "&&f64" | "&&f128" | "&&bool" => {
690                            temp_v + ","
691                        },
692                        _ => {
693                           "".to_string()
694                        },
695                    };
696                }
697                let tmp_s = $k.to_string() + "=" + value.as_str();
698                if !is_option_none {
699                    temp_s = temp_s + tmp_s.as_str();
700                }
701            )+
702
703            temp_s.pop();
704
705            let sql: String = "UPDATE ".to_string() + $t + " SET " + temp_s.as_str()
706                + " WHERE id=" + tmp_i.as_str();
707
708            sql
709        }
710    };
711}