@@ -189,7 +189,7 @@ fn worker_thread_main(
189189 }
190190 } ;
191191
192- let mut stmt_manager = StatementManager :: new ( ) ;
192+ let mut stmt_manager = StatementManager :: new ( & conn ) ;
193193
194194 // Process commands
195195 while let Ok ( cmd) = command_rx. recv ( ) {
@@ -218,35 +218,35 @@ fn establish_connection(options: &OdbcConnectOptions) -> Result<OdbcConnection,
218218
219219/// Statement manager to handle preallocated statements
220220struct StatementManager < ' conn > {
221+ conn : & ' conn OdbcConnection ,
221222 // Reusable statement for direct execution
222223 direct_stmt : Option < Preallocated < StatementImpl < ' conn > > > ,
223224 // Cache of prepared statements by SQL hash
224225 prepared_cache : HashMap < u64 , odbc_api:: Prepared < StatementImpl < ' conn > > > ,
225226}
226227
227228impl < ' conn > StatementManager < ' conn > {
228- fn new ( ) -> Self {
229+ fn new ( conn : & ' conn OdbcConnection ) -> Self {
229230 log:: debug!( "Creating new statement manager" ) ;
230231 Self {
232+ conn,
231233 direct_stmt : None ,
232234 prepared_cache : HashMap :: new ( ) ,
233235 }
234236 }
235237
236238 fn get_or_create_direct_stmt (
237239 & mut self ,
238- conn : & ' conn OdbcConnection ,
239240 ) -> Result < & mut Preallocated < StatementImpl < ' conn > > , Error > {
240241 if self . direct_stmt . is_none ( ) {
241242 log:: debug!( "Preallocating ODBC direct statement" ) ;
242- self . direct_stmt = Some ( conn. preallocate ( ) . map_err ( Error :: from) ?) ;
243+ self . direct_stmt = Some ( self . conn . preallocate ( ) . map_err ( Error :: from) ?) ;
243244 }
244245 Ok ( self . direct_stmt . as_mut ( ) . unwrap ( ) )
245246 }
246247
247248 fn get_or_create_prepared (
248249 & mut self ,
249- conn : & ' conn OdbcConnection ,
250250 sql : & str ,
251251 ) -> Result < & mut odbc_api:: Prepared < StatementImpl < ' conn > > , Error > {
252252 use std:: collections:: hash_map:: DefaultHasher ;
@@ -258,7 +258,7 @@ impl<'conn> StatementManager<'conn> {
258258
259259 if let std:: collections:: hash_map:: Entry :: Vacant ( e) = self . prepared_cache . entry ( sql_hash) {
260260 log:: debug!( "Preparing statement for SQL hash: {}" , sql_hash) ;
261- let prepared = conn. prepare ( sql) . map_err ( Error :: from) ?;
261+ let prepared = self . conn . prepare ( sql) . map_err ( Error :: from) ?;
262262 e. insert ( prepared) ;
263263 }
264264 Ok ( self . prepared_cache . get_mut ( & sql_hash) . unwrap ( ) )
@@ -322,8 +322,8 @@ fn process_command<'conn>(
322322 Command :: Commit { tx } => handle_commit ( conn, tx) ,
323323 Command :: Rollback { tx } => handle_rollback ( conn, tx) ,
324324 Command :: Shutdown { tx } => return Some ( tx) ,
325- Command :: Execute { sql, args, tx } => handle_execute ( conn , stmt_manager, sql, args, tx) ,
326- Command :: Prepare { sql, tx } => handle_prepare ( conn , stmt_manager, sql, tx) ,
325+ Command :: Execute { sql, args, tx } => handle_execute ( stmt_manager, sql, args, tx) ,
326+ Command :: Prepare { sql, tx } => handle_prepare ( stmt_manager, sql, tx) ,
327327 Command :: GetDbmsName { tx } => handle_get_dbms_name ( conn, tx) ,
328328 }
329329 None
@@ -362,17 +362,15 @@ fn handle_rollback(conn: &OdbcConnection, tx: TransactionSender) {
362362}
363363
364364fn handle_execute < ' conn > (
365- conn : & ' conn OdbcConnection ,
366365 stmt_manager : & mut StatementManager < ' conn > ,
367366 sql : Box < str > ,
368367 args : Option < OdbcArguments > ,
369368 tx : ExecuteSender ,
370369) {
371- execute_sql ( conn , stmt_manager, & sql, args, & tx) ;
370+ execute_sql ( stmt_manager, & sql, args, & tx) ;
372371}
373372
374373fn handle_prepare < ' conn > (
375- conn : & ' conn OdbcConnection ,
376374 stmt_manager : & mut StatementManager < ' conn > ,
377375 sql : Box < str > ,
378376 tx : PrepareSender ,
@@ -383,7 +381,7 @@ fn handle_prepare<'conn>(
383381 ) ;
384382
385383 // Use the statement manager to get or create the prepared statement
386- let result = match stmt_manager. get_or_create_prepared ( conn , & sql) {
384+ let result = match stmt_manager. get_or_create_prepared ( & sql) {
387385 Ok ( prepared) => {
388386 let columns = collect_columns ( prepared) ;
389387 let params = prepared. num_params ( ) . unwrap_or ( 0 ) as usize ;
@@ -410,7 +408,6 @@ fn handle_get_dbms_name(conn: &OdbcConnection, tx: oneshot::Sender<Result<String
410408
411409// SQL execution functions
412410fn execute_sql < ' conn > (
413- conn : & ' conn OdbcConnection ,
414411 stmt_manager : & mut StatementManager < ' conn > ,
415412 sql : & str ,
416413 args : Option < OdbcArguments > ,
@@ -420,9 +417,9 @@ fn execute_sql<'conn>(
420417 let has_params = !params. is_empty ( ) ;
421418
422419 let result = if has_params {
423- execute_with_prepared_statement ( conn , stmt_manager, sql, & params[ ..] , tx)
420+ execute_with_prepared_statement ( stmt_manager, sql, & params[ ..] , tx)
424421 } else {
425- execute_with_direct_statement ( conn , stmt_manager, sql, tx)
422+ execute_with_direct_statement ( stmt_manager, sql, tx)
426423 } ;
427424
428425 if let Err ( e) = result {
@@ -431,17 +428,15 @@ fn execute_sql<'conn>(
431428}
432429
433430fn execute_with_direct_statement < ' conn > (
434- conn : & ' conn OdbcConnection ,
435431 stmt_manager : & mut StatementManager < ' conn > ,
436432 sql : & str ,
437433 tx : & ExecuteSender ,
438434) -> Result < ( ) , Error > {
439- let stmt = stmt_manager. get_or_create_direct_stmt ( conn ) ?;
435+ let stmt = stmt_manager. get_or_create_direct_stmt ( ) ?;
440436 execute_statement ( stmt. execute ( sql, ( ) ) , tx)
441437}
442438
443439fn execute_with_prepared_statement < ' conn , P > (
444- conn : & ' conn OdbcConnection ,
445440 stmt_manager : & mut StatementManager < ' conn > ,
446441 sql : & str ,
447442 params : P ,
@@ -450,7 +445,7 @@ fn execute_with_prepared_statement<'conn, P>(
450445where
451446 P : odbc_api:: ParameterCollectionRef ,
452447{
453- let prepared = stmt_manager. get_or_create_prepared ( conn , sql) ?;
448+ let prepared = stmt_manager. get_or_create_prepared ( sql) ?;
454449 execute_statement ( prepared. execute ( params) , tx)
455450}
456451
0 commit comments