Skip to content

Commit aa8fc4f

Browse files
committed
refactor(odbc): pass connection reference to StatementManager for improved statement handling
- Updated StatementManager to accept a reference to OdbcConnection, enhancing its ability to manage direct and prepared statements. - Refactored command processing to utilize the updated StatementManager, streamlining SQL execution and preparation logic.
1 parent 6b3fc84 commit aa8fc4f

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

sqlx-core/src/odbc/connection/worker.rs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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
220220
struct 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

227228
impl<'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

364364
fn 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

374373
fn 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
412410
fn 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

433430
fn 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

443439
fn 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>(
450445
where
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

Comments
 (0)