1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#[macro_export]
macro_rules! push_index {
($n:expr,$new_sql:ident,$index:expr) => {
{
let num=$index/$n;
$new_sql.push((num+48) as u8 as char);
$index % $n
}
};
($index:ident,$new_sql:ident) => {
if $index>=0 && $index<10{
$new_sql.push(($index+48)as u8 as char);
}else if $index>=10 && $index<100 {
let $index = push_index!(10,$new_sql,$index);
let $index = push_index!(1,$new_sql,$index);
}else if $index>=100 && $index<1000{
let $index = push_index!(100,$new_sql,$index);
let $index = push_index!(10,$new_sql,$index);
let $index = push_index!(1,$new_sql,$index);
}else if $index>=1000 && $index<10000{
let $index = push_index!(1000,$new_sql,$index);
let $index = push_index!(100,$new_sql,$index);
let $index = push_index!(10,$new_sql,$index);
let $index = push_index!(1,$new_sql,$index);
}else{
use std::fmt::Write;
$new_sql.write_fmt(format_args!("{}", $index))
.expect("a Display implementation returned an error unexpectedly");
}
};
}
#[macro_export]
macro_rules! sql_index {
($sql:ident,$format_char:expr)=>{
let mut new_sql = String::with_capacity($sql.len()+20);
let mut string_start = false;
let mut index:i32 = 0;
for x in $sql.chars() {
if x == '\'' || x == '"' {
if string_start == true {
string_start = false;
new_sql.push(x);
continue;
}
string_start = true;
new_sql.push(x);
continue;
}
if string_start {
new_sql.push(x);
} else {
if x=='?' && $format_char != '?' {
index+=1;
new_sql.push($format_char);
push_index!(index,new_sql);
}else{
new_sql.push(x);
}
}
}
$sql = new_sql
};
}