@@ -7,6 +7,7 @@ use reqwest::{
7
7
header:: { self , HeaderName , HeaderValue } ,
8
8
Method ,
9
9
} ;
10
+ use sea_orm:: { DbBackend , Statement } ;
10
11
use serde:: { Deserialize , Serialize } ;
11
12
use serde_json:: Value ;
12
13
use tracing:: { debug, error} ;
@@ -156,8 +157,6 @@ impl Serde for Http {
156
157
) {
157
158
Err ( _) => { }
158
159
Ok ( x) => {
159
- let a = x. to_string ( ) ;
160
- println ! ( "a {a}" ) ;
161
160
self . data = x;
162
161
}
163
162
}
@@ -206,40 +205,72 @@ pub fn generate_sql_list(template_sql: &str, data: &Value) -> Result<Vec<String>
206
205
}
207
206
208
207
let mut key_vec = vec ! [ ] ;
208
+ let mut rel_key_vec = vec ! [ ] ;
209
209
let mut i = 0 ;
210
+ let char_size1 = "$" . as_bytes ( ) . len ( ) ;
211
+ let char_size2 = "'" . as_bytes ( ) . len ( ) ;
212
+ let char_size3 = "}" . as_bytes ( ) . len ( ) ;
213
+
210
214
while i < temp_index_vec. len ( ) {
211
- let one_index = temp_index_vec[ i] . 0 - "$" . as_bytes ( ) . len ( ) ; // 取"{"前$的字节索引
212
- let two_index = temp_index_vec[ i + 1 ] . 0 ;
215
+ rel_key_vec
216
+ . push ( template_sql[ temp_index_vec[ i] . 0 + 1 ..temp_index_vec[ i + 1 ] . 0 ] . to_string ( ) ) ;
217
+
218
+ let mut one_index = temp_index_vec[ i] . 0 - char_size1; // 取"{"前$的字节索引
219
+ let mut two_index = temp_index_vec[ i + 1 ] . 0 ;
220
+
221
+ let pre_one = & template_sql[ ( one_index - char_size2) ..one_index] ;
222
+ let post_two =
223
+ & template_sql[ ( two_index + char_size3) ..( two_index + char_size3 + char_size2) ] ;
213
224
214
- key_vec. push ( template_sql[ one_index..two_index + "}" . as_bytes ( ) . len ( ) ] . to_string ( ) ) ;
225
+ if pre_one == "'" && post_two == "'" {
226
+ one_index -= char_size1;
227
+ two_index += char_size2;
228
+ }
229
+
230
+ key_vec. push ( template_sql[ one_index..two_index + char_size3] . to_string ( ) ) ;
215
231
216
232
i += 2 ;
217
233
}
234
+ let mut template_sql = template_sql. to_string ( ) ;
218
235
219
- let mut result_vec: Vec < String > = vec ! [ ] ;
236
+ for item in & key_vec {
237
+ // template_sql = template_sql.replace(item, format!("${}", index + 1).as_str());
238
+ template_sql = template_sql. replace ( item, "?" ) ;
239
+ }
220
240
221
- for key in key_vec {
222
- let rel_key = & key[ 2 ..key. len ( ) - 1 ] ;
223
- let value = find_value ( rel_key, data, true )
224
- . map_err ( |err| anyhow ! ( "{err} 未在rel_key: {rel_key} data:{}中找到数据" , data) ) ?;
241
+ let mut result_vec: Vec < String > = vec ! [ ] ;
242
+ let mut result_values: Vec < Vec < String > > = vec ! [ ] ;
243
+ for key in & rel_key_vec {
244
+ // let rel_key = &key[2..key.len() - 1];
245
+ let value = find_value ( key, data, true )
246
+ . map_err ( |err| anyhow ! ( "{err} 未在rel_key: {key} data:{}中找到数据" , data) ) ?;
225
247
if let Some ( list) = value. as_array ( ) {
226
248
for i in 0 ..list. len ( ) {
227
- let item : & str ;
249
+ let mut item ;
228
250
let temp_string = list[ i] . to_string ( ) ;
229
251
if let Some ( x) = list[ i] . as_str ( ) {
230
- item = x;
252
+ item = x. to_string ( ) ;
231
253
} else {
232
- item = temp_string. as_str ( ) ;
254
+ item = temp_string;
233
255
}
234
-
235
- if result_vec. get ( i) . is_none ( ) {
236
- result_vec. push ( template_sql. replace ( key. as_str ( ) , item) ) ;
256
+ // TIPS 做这个转换是为了防止值影响以;来切割SQL语句的方法 查看:crates/process_web/src/service/collect_config_service.rs 219行
257
+ item = item. replace ( ';' , r#"\:"# ) ;
258
+ if result_values. get ( i) . is_none ( ) {
259
+ result_values. push ( vec ! [ item. to_string( ) ] ) ;
237
260
} else {
238
- result_vec [ i] = result_vec [ i ] . replace ( key . as_str ( ) , item ) ;
261
+ result_values [ i] . push ( item . to_string ( ) ) ;
239
262
}
240
263
}
241
264
}
242
265
}
266
+ for values in result_values {
267
+ let sql = Statement :: from_sql_and_values (
268
+ DbBackend :: MySql ,
269
+ template_sql. clone ( ) ,
270
+ values. iter ( ) . map ( |x| x. into ( ) ) ,
271
+ ) ;
272
+ result_vec. push ( sql. to_string ( ) ) ;
273
+ }
243
274
244
275
Ok ( result_vec)
245
276
}
0 commit comments