@@ -177,13 +177,15 @@ impl APIClient {
177177 let password = percent_decode_str ( password) . decode_utf8 ( ) ?;
178178 client. auth = Arc :: new ( BasicAuth :: new ( u. username ( ) , password) ) ;
179179 }
180- let database = match u. path ( ) . trim_start_matches ( '/' ) {
181- "" => None ,
182- s => Some ( s. to_string ( ) ) ,
183- } ;
184- let mut role = None ;
180+
181+ let mut session_state = SessionState :: default ( ) ;
182+
183+ let database = u. path ( ) . trim_start_matches ( '/' ) ;
184+ if !database. is_empty ( ) {
185+ session_state. set_database ( database) ;
186+ }
187+
185188 let mut scheme = "https" ;
186- let mut session_settings = BTreeMap :: new ( ) ;
187189 for ( k, v) in u. query_pairs ( ) {
188190 match k. as_ref ( ) {
189191 "wait_time_secs" => {
@@ -222,7 +224,7 @@ impl APIClient {
222224 "warehouse" => {
223225 client. warehouse = Mutex :: new ( Some ( v. to_string ( ) ) ) ;
224226 }
225- "role" => role = Some ( v . to_string ( ) ) ,
227+ "role" => session_state . set_role ( v ) ,
226228 "sslmode" => match v. as_ref ( ) {
227229 "disable" => scheme = "http" ,
228230 "require" | "enable" => scheme = "https" ,
@@ -273,7 +275,7 @@ impl APIClient {
273275 }
274276 }
275277 _ => {
276- session_settings . insert ( k . to_string ( ) , v. to_string ( ) ) ;
278+ session_state . set ( k , v) ;
277279 }
278280 }
279281 }
@@ -286,14 +288,8 @@ impl APIClient {
286288 } ,
287289 } ;
288290 client. scheme = scheme. to_string ( ) ;
289-
290291 client. endpoint = Url :: parse ( & format ! ( "{}://{}:{}" , scheme, client. host, client. port) ) ?;
291- client. session_state = Mutex :: new (
292- SessionState :: default ( )
293- . with_settings ( Some ( session_settings) )
294- . with_role ( role)
295- . with_database ( database) ,
296- ) ;
292+ client. session_state = Mutex :: new ( session_state) ;
297293
298294 Ok ( client)
299295 }
@@ -372,6 +368,26 @@ impl APIClient {
372368 guard. database . clone ( )
373369 }
374370
371+ pub fn set_warehouse ( & self , warehouse : impl Into < String > ) {
372+ let mut guard = self . warehouse . lock ( ) ;
373+ * guard = Some ( warehouse. into ( ) ) ;
374+ }
375+
376+ pub fn set_database ( & self , database : impl Into < String > ) {
377+ let mut guard = self . session_state . lock ( ) ;
378+ guard. set_database ( database) ;
379+ }
380+
381+ pub fn set_role ( & self , role : impl Into < String > ) {
382+ let mut guard = self . session_state . lock ( ) ;
383+ guard. set_role ( role) ;
384+ }
385+
386+ pub fn set_session ( & self , key : impl Into < String > , value : impl Into < String > ) {
387+ let mut guard = self . session_state . lock ( ) ;
388+ guard. set ( key, value) ;
389+ }
390+
375391 pub async fn current_role ( & self ) -> Option < String > {
376392 let guard = self . session_state . lock ( ) ;
377393 guard. role . clone ( )
0 commit comments