@@ -57,6 +57,22 @@ pub struct OdbcConnection {
5757} 
5858
5959impl  OdbcConnection  { 
60+     pub ( crate )  async  fn  with_conn < R ,  F ,  S > ( & mut  self ,  operation :  S ,  f :  F )  -> Result < R ,  Error > 
61+     where 
62+         R :  Send  + ' static , 
63+         F :  FnOnce ( & mut  odbc_api:: Connection < ' static > )  -> Result < R ,  Error >  + Send  + ' static , 
64+         S :  std:: fmt:: Display  + Send  + ' static , 
65+     { 
66+         let  conn = Arc :: clone ( & self . conn ) ; 
67+         run_blocking ( move  || { 
68+             let  mut  conn_guard = conn. lock ( ) . map_err ( |_| { 
69+                 Error :: Protocol ( format ! ( "ODBC {}: failed to lock connection" ,  operation) ) 
70+             } ) ?; 
71+             f ( & mut  conn_guard) 
72+         } ) 
73+         . await 
74+     } 
75+ 
6076    pub ( crate )  async  fn  establish ( options :  & OdbcConnectOptions )  -> Result < Self ,  Error >  { 
6177        let  shared_conn = run_blocking ( { 
6278            let  options = options. clone ( ) ; 
@@ -77,63 +93,42 @@ impl OdbcConnection {
7793    /// Returns the name of the actual Database Management System (DBMS) this 
7894     /// connection is talking to as reported by the ODBC driver. 
7995     pub  async  fn  dbms_name ( & mut  self )  -> Result < String ,  Error >  { 
80-         let  conn = Arc :: clone ( & self . conn ) ; 
81-         run_blocking ( move  || { 
82-             let  conn_guard = conn
83-                 . lock ( ) 
84-                 . map_err ( |_| Error :: Protocol ( "Failed to lock connection" . into ( ) ) ) ?; 
85-             conn_guard
86-                 . database_management_system_name ( ) 
87-                 . map_err ( Error :: from) 
96+         self . with_conn ( "dbms_name" ,  move  |conn| { 
97+             Ok ( conn. database_management_system_name ( ) ?) 
8898        } ) 
8999        . await 
90100    } 
91101
92102    pub ( crate )  async  fn  ping_blocking ( & mut  self )  -> Result < ( ) ,  Error >  { 
93-         let  conn = Arc :: clone ( & self . conn ) ; 
94-         run_blocking ( move  || { 
95-             let  conn_guard = conn
96-                 . lock ( ) 
97-                 . map_err ( |_| Error :: Protocol ( "Failed to lock connection" . into ( ) ) ) ?; 
98-             conn_guard
99-                 . execute ( "SELECT 1" ,  ( ) ,  None ) 
100-                 . map_err ( Error :: from) 
101-                 . map ( |_| ( ) ) 
103+         self . with_conn ( "ping" ,  move  |conn| { 
104+             conn. execute ( "SELECT 1" ,  ( ) ,  None ) ?; 
105+             Ok ( ( ) ) 
102106        } ) 
103107        . await 
104108    } 
105109
106110    pub ( crate )  async  fn  begin_blocking ( & mut  self )  -> Result < ( ) ,  Error >  { 
107-         let  conn = Arc :: clone ( & self . conn ) ; 
108-         run_blocking ( move  || { 
109-             let  conn_guard = conn
110-                 . lock ( ) 
111-                 . map_err ( |_| Error :: Protocol ( "Failed to lock connection" . into ( ) ) ) ?; 
112-             conn_guard. set_autocommit ( false ) . map_err ( Error :: from) 
111+         self . with_conn ( "begin" ,  move  |conn| { 
112+             conn. set_autocommit ( false ) ?; 
113+             Ok ( ( ) ) 
113114        } ) 
114115        . await 
115116    } 
116117
117118    pub ( crate )  async  fn  commit_blocking ( & mut  self )  -> Result < ( ) ,  Error >  { 
118-         let  conn = Arc :: clone ( & self . conn ) ; 
119-         run_blocking ( move  || { 
120-             let  conn_guard = conn
121-                 . lock ( ) 
122-                 . map_err ( |_| Error :: Protocol ( "Failed to lock connection" . into ( ) ) ) ?; 
123-             conn_guard. commit ( ) ?; 
124-             conn_guard. set_autocommit ( true ) . map_err ( Error :: from) 
119+         self . with_conn ( "commit" ,  move  |conn| { 
120+             conn. commit ( ) ?; 
121+             conn. set_autocommit ( true ) ?; 
122+             Ok ( ( ) ) 
125123        } ) 
126124        . await 
127125    } 
128126
129127    pub ( crate )  async  fn  rollback_blocking ( & mut  self )  -> Result < ( ) ,  Error >  { 
130-         let  conn = Arc :: clone ( & self . conn ) ; 
131-         run_blocking ( move  || { 
132-             let  conn_guard = conn
133-                 . lock ( ) 
134-                 . map_err ( |_| Error :: Protocol ( "Failed to lock connection" . into ( ) ) ) ?; 
135-             conn_guard. rollback ( ) ?; 
136-             conn_guard. set_autocommit ( true ) . map_err ( Error :: from) 
128+         self . with_conn ( "rollback" ,  move  |conn| { 
129+             conn. rollback ( ) ?; 
130+             conn. set_autocommit ( true ) ?; 
131+             Ok ( ( ) ) 
137132        } ) 
138133        . await 
139134    } 
@@ -146,13 +141,9 @@ impl OdbcConnection {
146141        let  ( tx,  rx)  = flume:: bounded ( 64 ) ; 
147142        let  sql = sql. to_string ( ) ; 
148143        let  args_move = args; 
149-         let  conn = Arc :: clone ( & self . conn ) ; 
150144
151-         run_blocking ( move  || { 
152-             let  mut  conn_guard = conn
153-                 . lock ( ) 
154-                 . map_err ( |_| Error :: Protocol ( "Failed to lock connection" . into ( ) ) ) ?; 
155-             if  let  Err ( e)  = execute_sql ( & mut  conn_guard,  & sql,  args_move,  & tx)  { 
145+         self . with_conn ( "execute_stream" ,  move  |conn| { 
146+             if  let  Err ( e)  = execute_sql ( conn,  & sql,  args_move,  & tx)  { 
156147                let  _ = tx. send ( Err ( e) ) ; 
157148            } 
158149            Ok ( ( ) ) 
@@ -180,16 +171,11 @@ impl OdbcConnection {
180171
181172        // Create new prepared statement to get metadata 
182173        let  sql = sql. to_string ( ) ; 
183-         let  conn = Arc :: clone ( & self . conn ) ; 
184- 
185-         run_blocking ( move  || { 
186-             let  conn_guard = conn
187-                 . lock ( ) 
188-                 . map_err ( |_| Error :: Protocol ( "Failed to lock connection" . into ( ) ) ) ?; 
189-             let  mut  prepared = conn_guard. prepare ( & sql) . map_err ( Error :: from) ?; 
174+         self . with_conn ( "prepare_metadata" ,  move  |conn| { 
175+             let  mut  prepared = conn. prepare ( & sql) ?; 
190176            let  columns = collect_columns ( & mut  prepared) ; 
191177            let  params = usize:: from ( prepared. num_params ( ) . unwrap_or ( 0 ) ) ; 
192-             Ok :: < _ ,   Error > ( ( columns,  params) ) 
178+             Ok ( ( columns,  params) ) 
193179        } ) 
194180        . await 
195181        . map ( |( columns,  params) | { 
0 commit comments