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 }; }