@@ -5,32 +5,27 @@ type Error = Box<dyn std::error::Error + Send + Sync + 'static>;
5
5
6
6
impl crate :: application:: CoLink {
7
7
#[ async_recursion]
8
- async fn _search_and_generate_query_string (
8
+ async fn _search_and_generate_query (
9
9
& self ,
10
10
string_before_dbc : & str ,
11
11
string_after_dbc : & str ,
12
- ) -> Result < String , Error > {
12
+ ) -> Result < ( String , Vec < String > ) , Error > {
13
13
let split_key_path: Vec < & str > = string_after_dbc. split ( ':' ) . collect ( ) ;
14
- for i in 0 ..split_key_path. len ( ) {
15
- let current_key_path = format ! (
16
- "{}:{}" ,
17
- string_before_dbc,
18
- split_key_path[ 0 ..i + 1 ] . join( ":" )
19
- ) ;
14
+ for i in ( 0 ..split_key_path. len ( ) ) . rev ( ) {
15
+ let current_key_path =
16
+ format ! ( "{}:{}" , string_before_dbc, split_key_path[ 0 ..=i] . join( ":" ) ) ;
20
17
let payload = self . read_entry ( current_key_path. as_str ( ) ) . await ;
21
- if payload . is_ok ( ) {
22
- let query_string_raw = String :: from_utf8 ( payload. unwrap ( ) ) ?;
23
- let count = query_string_raw . matches ( '?' ) . count ( ) ;
18
+ if let Ok ( payload ) = payload {
19
+ let query_string = String :: from_utf8 ( payload) ?;
20
+ let count = query_string . matches ( '?' ) . count ( ) ;
24
21
if count != split_key_path. len ( ) - ( i + 1 ) {
25
22
return Err ( "Number of parameters does not match specified query string" ) ?;
26
23
}
27
- let mut query_string = query_string_raw;
28
- for j in 0 ..count {
29
- query_string = query_string. replacen ( '?' , split_key_path[ i + j + 1 ] , 1 ) ;
30
- }
31
- return Ok ( query_string) ;
32
- } else {
33
- continue ;
24
+ let params = split_key_path[ ( i + 1 ) ..]
25
+ . iter ( )
26
+ . map ( |x| x. to_string ( ) )
27
+ . collect :: < Vec < String > > ( ) ;
28
+ return Ok ( ( query_string, params) ) ;
34
29
}
35
30
}
36
31
Err ( "no query string found." ) ?
@@ -45,12 +40,13 @@ impl crate::application::CoLink {
45
40
let url_key = format ! ( "{}:url" , string_before_dbc) ;
46
41
let url = self . read_entry ( url_key. as_str ( ) ) . await ?;
47
42
let url_string = String :: from_utf8 ( url) ?;
48
- let query_string = self
49
- . _search_and_generate_query_string ( string_before_dbc, string_after_dbc)
43
+ let ( query_string, params ) = self
44
+ . _search_and_generate_query ( string_before_dbc, string_after_dbc)
50
45
. await ?;
46
+ let params: Vec < & str > = params. iter ( ) . map ( AsRef :: as_ref) . collect ( ) ;
51
47
let mut database = rdbc2:: dbc:: Database :: new ( url_string. as_str ( ) ) ?;
52
- let result = database. execute_query ( query_string. as_str ( ) ) ?;
53
- let seraliased_result = serde_json:: to_vec ( & result) ?;
54
- Ok ( seraliased_result )
48
+ let result = database. execute_query_with_params ( query_string. as_str ( ) , & params ) ?;
49
+ let seralized_result = serde_json:: to_vec ( & result) ?;
50
+ Ok ( seralized_result )
55
51
}
56
52
}
0 commit comments