setupgui/utils.cc (94 lines of code) (raw):
// Copyright (c) 2007, 2024, Oracle and/or its affiliates.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, version 2.0, as
// published by the Free Software Foundation.
//
// This program is designed to work with certain software (including
// but not limited to OpenSSL) that is licensed under separate terms, as
// designated in a particular file or component or in included license
// documentation. The authors of MySQL hereby grant you an additional
// permission to link the program and your derivative works with the
// separately licensed software that they have either included with
// the program or referenced in the documentation.
//
// Without limiting anything contained in the foregoing, this file,
// which is part of Connector/ODBC, is also subject to the
// Universal FOSS Exception, version 1.0, a copy of which can be found at
// https://oss.oracle.com/licenses/universal-foss-exception.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License, version 2.0, for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation, Inc.,
// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "setupgui.h"
#include "driver.h"
#include "stringutil.h"
extern SQLHDBC hDBC;
extern SQLWCHAR **errorMsgs;
void FreeEnvHandle(SQLHENV hEnv)
{
if (hDBC == SQL_NULL_HDBC)
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
}
void Disconnect(SQLHDBC hDbc, SQLHENV hEnv)
{
SQLDisconnect(hDbc);
if (hDBC == SQL_NULL_HDBC)
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
FreeEnvHandle(hEnv);
}
SQLRETURN Connect(SQLHDBC *hDbc, SQLHENV *hEnv, DataSource *params)
{
SQLRETURN nReturn;
SQLWSTRING string_connect_in;
assert(params->opt_DRIVER);
/* Blank out DSN name, otherwise it will pull the info from the registry */
params->opt_DSN = nullptr;
string_connect_in = params->to_kvpair(';');
if (hDBC == SQL_NULL_HDBC)
{
nReturn= SQLAllocHandle(SQL_HANDLE_ENV, NULL, hEnv);
if (nReturn != SQL_SUCCESS)
ShowDiagnostics(nReturn, SQL_HANDLE_ENV, NULL);
if (!SQL_SUCCEEDED(nReturn))
return nReturn;
nReturn= SQLSetEnvAttr(*hEnv, SQL_ATTR_ODBC_VERSION,
(SQLPOINTER)SQL_OV_ODBC3, 0);
if (nReturn != SQL_SUCCESS)
ShowDiagnostics(nReturn, SQL_HANDLE_ENV, NULL);
if (!SQL_SUCCEEDED(nReturn))
{
return nReturn;
}
nReturn= SQLAllocHandle(SQL_HANDLE_DBC, *hEnv, hDbc);
if (nReturn != SQL_SUCCESS)
ShowDiagnostics(nReturn, SQL_HANDLE_ENV, *hEnv);
if (!SQL_SUCCEEDED(nReturn))
{
return nReturn;
}
}
nReturn= SQLDriverConnectW(*hDbc, NULL, (SQLWCHAR*)string_connect_in.c_str(),
SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
if (nReturn != SQL_SUCCESS)
ShowDiagnostics(nReturn, SQL_HANDLE_DBC, *hDbc);
return nReturn;
}
void ShowDiagnostics(SQLRETURN nReturn, SQLSMALLINT nHandleType, SQLHANDLE h)
{
BOOL bDiagnostics= FALSE;
SQLSMALLINT nRec= 1;
SQLWCHAR szSQLState[6];
SQLINTEGER nNative;
SQLWCHAR szMessage[SQL_MAX_MESSAGE_LENGTH];
SQLSMALLINT nMessage;
if (h)
{
*szSQLState= '\0';
*szMessage= '\0';
while (SQL_SUCCEEDED(SQLGetDiagRecW(nHandleType,
h,
nRec,
szSQLState,
&nNative,
szMessage,
SQL_MAX_MESSAGE_LENGTH,
&nMessage)))
{
szSQLState[5]= '\0';
szMessage[SQL_MAX_MESSAGE_LENGTH - 1]= '\0';
/*add2list(errorMsgs, szMessage);*/
bDiagnostics= TRUE;
nRec++;
*szSQLState= '\0';
*szMessage= '\0';
}
}
switch (nReturn)
{
case SQL_ERROR:
/*strAssign(popupMsg, L"Request returned with SQL_ERROR.");*/
break;
case SQL_SUCCESS_WITH_INFO:
/*strAssign(popupMsg, L"Request return with SQL_SUCCESS_WITH_INFO.");*/
break;
case SQL_INVALID_HANDLE:
/*strAssign(popupMsg, L"Request returned with SQL_INVALID_HANDLE.");*/
break;
default:
/*strAssign(popupMsg, L"Request did not return with SQL_SUCCESS.");*/
break;
}
}