From 60f6bb8c77b2630d27df318a3ff9556e5ef49220 Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Thu, 1 Sep 2022 00:24:56 -0400 Subject: [PATCH] DbLib: Fixes for MySQL ODBC driver SQLSetConnectAttr crashes for this driver, and SQLSetStmtAttr is the ODBC3 way anyway. --- common/database/database_connection.cpp | 6 ++--- thirdparty/nanodbc/nanodbc/nanodbc.cpp | 30 ++++++++++--------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/common/database/database_connection.cpp b/common/database/database_connection.cpp index 50844c22f6..696b4070a6 100644 --- a/common/database/database_connection.cpp +++ b/common/database/database_connection.cpp @@ -449,11 +449,11 @@ bool DATABASE_CONNECTION::SelectAll( const std::string& aTable, std::vector return false; } - if( !results.first() ) - return false; - try { + if( !results.first() ) + return false; + do { ROW result; diff --git a/thirdparty/nanodbc/nanodbc/nanodbc.cpp b/thirdparty/nanodbc/nanodbc/nanodbc.cpp index 5cc0d0b0e1..a2c6542cdf 100644 --- a/thirdparty/nanodbc/nanodbc/nanodbc.cpp +++ b/thirdparty/nanodbc/nanodbc/nanodbc.cpp @@ -995,15 +995,6 @@ public: if (!success(rc) && (event_handle == nullptr || rc != SQL_STILL_EXECUTING)) NANODBC_THROW_DATABASE_ERROR(dbc_, SQL_HANDLE_DBC); - int cursorType = SQL_CURSOR_KEYSET_DRIVEN; - NANODBC_CALL_RC( - SQLSetConnectAttr, - rc, - dbc_, - SQL_ATTR_CURSOR_TYPE, - (SQLPOINTER)(std::intptr_t)cursorType, - 0); - connected_ = success(rc); return rc; @@ -1054,15 +1045,6 @@ public: if (!success(rc) && (event_handle == nullptr || rc != SQL_STILL_EXECUTING)) NANODBC_THROW_DATABASE_ERROR(dbc_, SQL_HANDLE_DBC); - int cursorType = SQL_CURSOR_KEYSET_DRIVEN; - NANODBC_CALL_RC( - SQLSetConnectAttr, - rc, - dbc_, - SQL_ATTR_CURSOR_TYPE, - (SQLPOINTER)(std::intptr_t)cursorType, - 0); - connected_ = success(rc); return rc; @@ -1452,6 +1434,18 @@ public: #endif RETCODE rc; + + int cursorType = SQL_CURSOR_KEYSET_DRIVEN; + NANODBC_CALL_RC( + SQLSetStmtAttr, + rc, + stmt_, + SQL_ATTR_CURSOR_TYPE, + (SQLPOINTER)(std::intptr_t)cursorType, + 0); + if (!success(rc) && rc != SQL_STILL_EXECUTING) + NANODBC_THROW_DATABASE_ERROR(stmt_, SQL_HANDLE_STMT); + NANODBC_CALL_RC( NANODBC_FUNC(SQLPrepare), rc,