setupgui/ConfigDSN.cc (142 lines of code) (raw):
// Modifications Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
//
// 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
#ifndef _WIN32
#include "MYODBC_MYSQL.h"
#include "installer.h"
#include "unicode_transcode.h"
#include <sql.h>
#endif
#include "setupgui.h"
#include "stringutil.h"
extern "C" {
BOOL Driver_Prompt(HWND hWnd, SQLWCHAR *instr, SQLUSMALLINT completion,
SQLWCHAR *outstr, SQLSMALLINT outmax, SQLSMALLINT *outlen);
}
/*
Entry point for GUI prompting from SQLDriverConnect().
*/
BOOL Driver_Prompt(HWND hWnd, SQLWCHAR *instr, SQLUSMALLINT completion,
SQLWCHAR *outstr, SQLSMALLINT outmax, SQLSMALLINT *outlen)
{
DataSource ds;
BOOL rc= FALSE;
SQLWSTRING out;
size_t copy_len = 0;
/*
parse the attr string, dsn lookup will have already been
done in the driver
*/
if (instr && *instr)
{
if (ds.from_kvpair(instr, (SQLWCHAR)';'))
goto exit;
}
/* Show the dialog and handle result */
if (ShowOdbcParamsDialog(&ds, hWnd, TRUE) == 1)
{
/* serialize to outstr */
out = ds.to_kvpair((SQLWCHAR)';');
size_t len = out.length();
if (outlen)
*outlen = (SQLSMALLINT)len;
if (outstr == nullptr || outmax == 0)
{
copy_len = 0;
}
else if (len > outmax)
{
/* truncated, up to caller to see outmax < *outlen */
copy_len = outmax;
}
else
{
copy_len = len;
}
if (copy_len)
{
memcpy(outstr, out.c_str(), copy_len * sizeof(SQLWCHAR));
outstr[copy_len] = 0;
}
rc = TRUE;
}
exit:
return rc;
}
/*
Add, edit, or remove a Data Source Name (DSN). This function is
called by "Data Source Administrator" on Windows, or similar
application on Unix.
*/
BOOL INSTAPI ConfigDSNW(HWND hWnd, WORD nRequest, LPCWSTR pszDriver,
LPCWSTR pszAttributes)
{
DataSource ds;
BOOL rc= TRUE;
SQLWSTRING origdsn;
if (!utf8_charset_info) {
my_sys_init();
utf8_charset_info =
get_charset_by_csname(transport_charset, MYF(MY_CS_PRIMARY), MYF(0));
}
if (pszAttributes && *pszAttributes)
{
SQLWCHAR delim= ';';
#ifdef _WIN32
/*
if there's no ;, then it's most likely null-delimited
NOTE: the double null-terminated strings are not working
* with UnixODBC-GUI-Qt (posted a bug )
*/
if (!sqlwcharchr(pszAttributes, delim))
delim= 0;
#endif
if (ds.from_kvpair(pszAttributes, delim))
{
SQLPostInstallerError(ODBC_ERROR_INVALID_KEYWORD_VALUE,
W_INVALID_ATTR_STR);
return FALSE;
}
if (ds.lookup() && nRequest != ODBC_ADD_DSN)
{
/* ds_lookup() will already set SQLInstallerError */
return FALSE;
}
origdsn = (const SQLWCHAR*)ds.opt_DSN;
}
switch (nRequest)
{
case ODBC_ADD_DSN:
{
Driver driver;
driver.name = pszDriver;
if (driver.lookup())
{
rc= FALSE;
break;
}
if (hWnd)
{
/*
hWnd means we will at least try to prompt, at which point
the driver lib will be replaced by the name
*/
ds.opt_DRIVER = driver.lib;
}
else
{
/*
no hWnd is a likely a call from an app w/no prompting so
we put the driver name immediately
*/
ds.opt_DRIVER = driver.name;
}
}
case ODBC_CONFIG_DSN:
#ifdef _WIN32
/*
for windows, if hWnd is NULL, we try to add the dsn
with what information was given
*/
if (!hWnd || ShowOdbcParamsDialog(&ds, hWnd, FALSE) == 1)
#else
if (ShowOdbcParamsDialog(&ds, hWnd, FALSE) == 1)
#endif
{
/* save datasource */
if (ds.add())
rc= FALSE;
/* if the name is changed, remove the old dsn */
if (!origdsn.empty() && origdsn != (const SQLWSTRING&)ds.opt_DSN)
SQLRemoveDSNFromIni(origdsn.c_str());
}
break;
case ODBC_REMOVE_DSN:
if (SQLRemoveDSNFromIni(ds.opt_DSN) != TRUE)
rc= FALSE;
break;
}
return rc;
}
#ifdef USE_IODBC
BOOL INSTAPI ConfigDSN(HWND hWnd, WORD nRequest, LPCSTR pszDriverA,
LPCSTR pszAttributesA)
{
BOOL rc;
size_t lenDriver = strlen(pszDriverA);
size_t lenAttrib = strlen(pszAttributesA);
/* We will assume using one-byte Latin string as a subset of UTF-8 */
SQLWCHAR *pszDriverW= (SQLWCHAR *) myodbc_malloc((lenDriver + 1) *
sizeof(SQLWCHAR), MYF(0));
SQLWCHAR *pszAttributesW= (SQLWCHAR *)myodbc_malloc((lenAttrib + 1) *
sizeof(SQLWCHAR), MYF(0));
utf8_as_sqlwchar(pszDriverW, lenDriver, (SQLCHAR* )pszDriverA, lenDriver);
utf8_as_sqlwchar(pszAttributesW, lenAttrib, (SQLCHAR* )pszAttributesA,
lenAttrib);
rc= ConfigDSNW(hWnd, nRequest, pszDriverW, pszAttributesW);
x_free(pszDriverW);
x_free(pszAttributesW);
return rc;
}
#endif