@@ -283,9 +283,9 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
283283 // Build query with current offset for resumption
284284 auto const selectQuery = BuildSelectQueryWithOffset (
285285 formatter, conn.ServerType (), table.schema , tableName, table.columns , table.primaryKeys , processedRows);
286- stmt.ExecuteDirect (selectQuery);
286+ auto cursor = stmt.ExecuteDirect (selectQuery);
287287
288- while (stmt .FetchRow ())
288+ while (cursor .FetchRow ())
289289 {
290290 if constexpr (DebugBackupWorker)
291291 std::println (stderr, " DEBUG: FetchRow returned true for {}" , tableName);
@@ -305,7 +305,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
305305 {
306306 try
307307 {
308- auto valOpt = stmt .GetNullableColumn <SqlDynamicBinary<MaxBinaryLobBufferSize>>(i);
308+ auto valOpt = cursor .GetNullableColumn <SqlDynamicBinary<MaxBinaryLobBufferSize>>(i);
309309 if (valOpt)
310310 {
311311 row.emplace_back (std::vector<uint8_t >(valOpt->data (), valOpt->data () + valOpt->size ()));
@@ -325,7 +325,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
325325 }
326326 else if (std::holds_alternative<Bool>(colDef.type ))
327327 {
328- auto valOpt = stmt .GetNullableColumn <bool >(i);
328+ auto valOpt = cursor .GetNullableColumn <bool >(i);
329329 if (valOpt)
330330 row.emplace_back (*valOpt);
331331 else
@@ -335,23 +335,23 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
335335 || std::holds_alternative<Smallint>(colDef.type )
336336 || std::holds_alternative<Tinyint>(colDef.type ))
337337 {
338- auto valOpt = stmt .GetNullableColumn <int64_t >(i);
338+ auto valOpt = cursor .GetNullableColumn <int64_t >(i);
339339 if (valOpt)
340340 row.emplace_back (*valOpt);
341341 else
342342 row.emplace_back (std::monostate {});
343343 }
344344 else if (std::holds_alternative<Real>(colDef.type ))
345345 {
346- auto valOpt = stmt .GetNullableColumn <double >(i);
346+ auto valOpt = cursor .GetNullableColumn <double >(i);
347347 if (valOpt)
348348 row.emplace_back (*valOpt);
349349 else
350350 row.emplace_back (std::monostate {});
351351 }
352352 else if (std::holds_alternative<NVarchar>(colDef.type ) || std::holds_alternative<NChar>(colDef.type ))
353353 {
354- auto valOpt = stmt .GetNullableColumn <std::u16string>(i);
354+ auto valOpt = cursor .GetNullableColumn <std::u16string>(i);
355355 if (valOpt)
356356 {
357357 auto u8 = ToUtf8 (*valOpt);
@@ -363,7 +363,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
363363 else if (std::holds_alternative<Guid>(colDef.type ))
364364 {
365365 // Read GUID columns using SqlGuid for proper ODBC binding, then convert to string
366- auto valOpt = stmt .GetNullableColumn <SqlGuid>(i);
366+ auto valOpt = cursor .GetNullableColumn <SqlGuid>(i);
367367 if (valOpt)
368368 row.emplace_back (to_string (*valOpt));
369369 else
@@ -374,7 +374,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
374374 // Read Decimal as string directly to preserve full precision.
375375 // Using double would lose precision for values exceeding ~15-17 significant digits,
376376 // which is problematic for DECIMAL(38,10) and similar high-precision types.
377- auto valOpt = stmt .GetNullableColumn <std::string>(i);
377+ auto valOpt = cursor .GetNullableColumn <std::string>(i);
378378 if (valOpt)
379379 row.emplace_back (*valOpt);
380380 else
@@ -383,7 +383,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
383383 else if (std::holds_alternative<Date>(colDef.type ))
384384 {
385385 // Read Date using native type to avoid ODBC driver conversion issues.
386- auto valOpt = stmt .GetNullableColumn <SqlDate>(i);
386+ auto valOpt = cursor .GetNullableColumn <SqlDate>(i);
387387 if (valOpt)
388388 row.emplace_back (std::format (" {}" , *valOpt));
389389 else
@@ -398,7 +398,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
398398 if (conn.ServerType () == SqlServerType::POSTGRESQL
399399 || conn.ServerType () == SqlServerType::MICROSOFT_SQL)
400400 {
401- auto valOpt = stmt .GetNullableColumn <std::string>(i);
401+ auto valOpt = cursor .GetNullableColumn <std::string>(i);
402402 if (valOpt)
403403 row.emplace_back (*valOpt);
404404 else
@@ -407,7 +407,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
407407 else
408408 {
409409 // Read Time using native type for other databases (e.g., SQLite).
410- auto valOpt = stmt .GetNullableColumn <SqlTime>(i);
410+ auto valOpt = cursor .GetNullableColumn <SqlTime>(i);
411411 if (valOpt)
412412 row.emplace_back (std::format (" {}" , *valOpt));
413413 else
@@ -419,7 +419,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
419419 {
420420 // Read DateTime/Timestamp using native type to avoid MS SQL Server ODBC driver
421421 // issues with SQL_TYPE_TIMESTAMP to SQL_C_CHAR conversion (error 22003).
422- auto valOpt = stmt .GetNullableColumn <SqlDateTime>(i);
422+ auto valOpt = cursor .GetNullableColumn <SqlDateTime>(i);
423423 if (valOpt)
424424 row.emplace_back (std::format (" {}" , *valOpt));
425425 else
@@ -431,7 +431,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
431431 // Read text/string types as strings directly.
432432 // Note: We must not use SqlDynamicBinary for text types on PostgreSQL as its ODBC driver
433433 // does not support reading TEXT as SQL_C_BINARY.
434- auto valOpt = stmt .GetNullableColumn <std::string>(i);
434+ auto valOpt = cursor .GetNullableColumn <std::string>(i);
435435 if (valOpt)
436436 row.emplace_back (*valOpt);
437437 else
@@ -440,7 +440,7 @@ void ProcessTableBackup(BackupContext& ctx, SqlConnection& conn, SqlSchema::Tabl
440440 else
441441 {
442442 // Fallback for any unhandled types - try reading as string
443- auto valOpt = stmt .GetNullableColumn <std::string>(i);
443+ auto valOpt = cursor .GetNullableColumn <std::string>(i);
444444 if (valOpt)
445445 row.emplace_back (*valOpt);
446446 else
0 commit comments