diff --git a/source/shared/core_conn.cpp b/source/shared/core_conn.cpp index 2be2c4e2..4aaefad7 100644 --- a/source/shared/core_conn.cpp +++ b/source/shared/core_conn.cpp @@ -149,7 +149,11 @@ sqlsrv_conn* core_sqlsrv_connect( _In_ sqlsrv_context& henv_cp, _In_ sqlsrv_cont build_connection_string_and_set_conn_attr(conn, server, uid, pwd, options_ht, valid_conn_opts, driver, conn_str TSRMLS_CC); bool missing_driver_error = false; - if (conn->ce_option.enabled) { + + if (conn->is_driver_set) { + r = core_odbc_connect( conn, conn_str, wconn_string, wconn_len, missing_driver_error ); + } + else if (conn->ce_option.enabled) { conn_str = conn_str + CONNECTION_STRING_DRIVER_NAME[DRIVER_VERSION::ODBC_DRIVER_17]; r = core_odbc_connect( conn, conn_str, wconn_string, wconn_len, missing_driver_error ); @@ -231,7 +235,7 @@ sqlsrv_conn* core_sqlsrv_connect( _In_ sqlsrv_context& henv_cp, _In_ sqlsrv_cont return return_conn; } -SQLRETURN core_odbc_connect(_Inout_ sqlsrv_conn* conn, _Inout_ std::string conn_str, _Inout_ SQLWCHAR* wconn_string, _Inout_ unsigned int& wconn_len, _Inout_ bool& missing_driver_error) +SQLRETURN core_odbc_connect(_Inout_ sqlsrv_conn* conn, _Inout_ std::string& conn_str, _Inout_ SQLWCHAR* wconn_string, _Inout_ unsigned int& wconn_len, _Inout_ bool& missing_driver_error) { SQLRETURN r = SQL_SUCCESS; @@ -909,6 +913,8 @@ void driver_set_func::func( _In_ connection_option const* option, _In_ zval* val CHECK_CUSTOM_ERROR( std::find( valid_odbc_drivers.begin(), valid_odbc_drivers.end(), conn_str ) == valid_odbc_drivers.end(), conn, SQLSRV_ERROR_KEYSTORE_INVALID_VALUE ){ throw core::CoreException(); } + + conn->is_driver_set = true; } diff --git a/source/shared/core_sqlsrv.h b/source/shared/core_sqlsrv.h index 4437dcf7..d8df04ac 100644 --- a/source/shared/core_sqlsrv.h +++ b/source/shared/core_sqlsrv.h @@ -1070,6 +1070,7 @@ struct sqlsrv_conn : public sqlsrv_context { DRIVER_VERSION driver_version; col_encryption_option ce_option; // holds the details of what are required to enable column encryption + bool is_driver_set; // initialize with default values sqlsrv_conn( _In_ SQLHANDLE h, _In_ error_callback e, _In_opt_ void* drv, _In_ SQLSRV_ENCODING encoding TSRMLS_DC ) : @@ -1077,6 +1078,7 @@ struct sqlsrv_conn : public sqlsrv_context { { server_version = SERVER_VERSION_UNKNOWN; driver_version = ODBC_DRIVER_UNKNOWN; + is_driver_set = false; } // sqlsrv_conn has no destructor since its allocated using placement new, which requires that the destructor be @@ -1237,7 +1239,7 @@ sqlsrv_conn* core_sqlsrv_connect( _In_ sqlsrv_context& henv_cp, _In_ sqlsrv_cont _Inout_z_ const char* server, _Inout_opt_z_ const char* uid, _Inout_opt_z_ const char* pwd, _Inout_opt_ HashTable* options_ht, _In_ error_callback err, _In_ const connection_option valid_conn_opts[], _In_ void* driver, _In_z_ const char* driver_func TSRMLS_DC ); -SQLRETURN core_odbc_connect( _Inout_ sqlsrv_conn* conn, _Inout_ std::string conn_str, _Inout_ SQLWCHAR* wconn_string, _Inout_ unsigned int& wconn_len, _Inout_ bool& missing_driver_error); +SQLRETURN core_odbc_connect( _Inout_ sqlsrv_conn* conn, _Inout_ std::string& conn_str, _Inout_ SQLWCHAR* wconn_string, _Inout_ unsigned int& wconn_len, _Inout_ bool& missing_driver_error); void core_sqlsrv_close( _Inout_opt_ sqlsrv_conn* conn TSRMLS_DC ); void core_sqlsrv_prepare( _Inout_ sqlsrv_stmt* stmt, _In_reads_bytes_(sql_len) const char* sql, _In_ SQLLEN sql_len TSRMLS_DC ); void core_sqlsrv_begin_transaction( _Inout_ sqlsrv_conn* conn TSRMLS_DC );