setupgui/callbacks.cc (509 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
/* TODO no L"" */
#include "setupgui.h"
#include "stringutil.h"
#include "windows/resource.h"
#include <driver.h>
#include <error.h>
#include <codecvt>
#include <locale>
SQLWCHAR **errorMsgs= NULL;
SQLHDBC hDBC= SQL_NULL_HDBC;
/*
Tests if it is possible to establish connection using given DS
returns message text. user is responsible to free that text after use.
*/
SQLWSTRING mytest(HWND hwnd, DataSource *params)
{
SQLWSTRING msg;
SQLWCHAR tmpbuf[1024];
SQLHENV hEnv = nullptr;
SQLHDBC hDbc = nullptr;
/*
In case of file data source we do not want it to be created
when clicking the Test button
*/
myodbc::HENV henv;
auto preservedSavefile = params->opt_SAVEFILE;
params->opt_SAVEFILE.set_default(nullptr);
try
{
myodbc::HDBC hdbc(henv, params);
msg = _W(L"Connection successful");
}
catch(MYERROR &e)
{
// Use the ability of optionStr to convert MBchar -> Wchar
optionStr e_msg;
e_msg = e.message;
optionStr e_sqlstate;
e_sqlstate = e.sqlstate;
msg = _W(L"Connection failed with the following error:\n");
msg.append((const SQLWSTRING &)e_msg);
msg.append(_W(L"["));
msg.append((const SQLWSTRING &)e_sqlstate);
msg.append(_W(L"]"));
}
/* Restore savefile parameter */
params->opt_SAVEFILE = preservedSavefile;
return msg;
}
BOOL mytestaccept(HWND hwnd, DataSource* params)
{
/* TODO validation */
return TRUE;
}
std::vector<SQLWSTRING> mygetdatabases(HWND hwnd, DataSource* params)
{
SQLRETURN ret;
SQLWCHAR catalog[MYODBC_DB_NAME_MAX];
SQLLEN n_catalog;
auto preserved_database = params->opt_DATABASE;
auto preserved_no_catalog = params->opt_NO_CATALOG;
std::vector<SQLWSTRING> result;
result.reserve(20);
/*
In case of file data source we do not want it to be created
when clicking the Test button
*/
auto preserved_savefile = params->opt_SAVEFILE;
params->opt_SAVEFILE.set_default(nullptr);
params->opt_DATABASE.set_default(nullptr);
params->opt_NO_CATALOG.set_default(false);
try {
myodbc::HENV henv;
myodbc::HDBC hdbc(henv, params);
params->opt_SAVEFILE = preserved_savefile;
params->opt_DATABASE = preserved_database;
params->opt_NO_CATALOG = preserved_no_catalog;
myodbc::HSTMT hstmt(hdbc);
SQLWCHAR tmpbuf[1024];
SQLWCHAR empty = 0;
SQLWCHAR *w_all = _W(L"%");
ret = SQLTablesW(hstmt, w_all, SQL_NTS,
&empty, 0, &empty, 0,
&empty, 0);
if (!SQL_SUCCEEDED(ret)) return result;
ret = SQLBindCol(hstmt, 1, SQL_C_WCHAR, catalog, MYODBC_DB_NAME_MAX,
&n_catalog);
if (!SQL_SUCCEEDED(ret)) return result;
while (true) {
if (result.size() % 20) result.reserve(result.size() + 20);
if (SQL_SUCCEEDED(SQLFetch(hstmt)))
result.emplace_back(catalog);
else
break;
}
} catch (...) {
}
return result;
}
std::vector<SQLWSTRING> mygetcharsets(HWND hwnd, DataSource* params)
{
SQLRETURN ret;
SQLWCHAR charset[MYODBC_DB_NAME_MAX] = { 0 };
SQLLEN n_charset = 0;
auto preserved_database = params->opt_DATABASE;
auto preserved_no_catalog= params->opt_NO_CATALOG;
SQLWCHAR tmpbuf[1024];
std::vector<SQLWSTRING> csl;
csl.reserve(20);
/*
In case of file data source we do not want it to be created
when clicking the Test button
*/
auto preserved_savefile = params->opt_SAVEFILE;
params->opt_SAVEFILE.set_default(nullptr);
params->opt_DATABASE.set_default(nullptr);
params->opt_NO_CATALOG.set_default(false);
try {
myodbc::HENV henv;
myodbc::HDBC hdbc(henv, params);
params->opt_SAVEFILE = preserved_savefile;
params->opt_DATABASE = preserved_database;
params->opt_NO_CATALOG = preserved_no_catalog;
myodbc::HSTMT hstmt(hdbc);
#ifdef DRIVER_ANSI
/* Skip undesired charsets */
nReturn = SQLExecDirectW(hStmt,
_W(L"SHOW CHARACTER SET WHERE "
"charset <> 'utf16' AND "
"charset <> 'utf32' AND "
"charset <> 'ucs2'"),
SQL_NTS);
#else
ret = SQLExecDirectW(hstmt, _W(L"SHOW CHARACTER SET"), SQL_NTS);
#endif
if (!SQL_SUCCEEDED(ret)) return csl;
ret = SQLBindCol(hstmt, 1, SQL_C_WCHAR, charset, MYODBC_DB_NAME_MAX,
&n_charset);
if (!SQL_SUCCEEDED(ret)) return csl;
while (true) {
if (csl.size() % 20) csl.reserve(csl.size() + 20);
if (SQL_SUCCEEDED(SQLFetch(hstmt)))
csl.emplace_back(charset);
else
break;
}
} catch (...) {
}
return csl;
}
/* Init DataSource from the main dialog controls */
void syncData(HWND hwnd, DataSource *params)
{
GET_STRING(DSN);
GET_STRING(DESCRIPTION);
GET_STRING(SERVER);
GET_STRING(SOCKET);
GET_UNSIGNED(PORT);
GET_STRING(UID);
GET_STRING(PWD);
GET_COMBO(DATABASE);
#ifdef _WIN32
/* use this flag exclusively for Windows */
if (READ_BOOL(hwnd, IDC_RADIO_NAMED_PIPE))
params->opt_NAMED_PIPE = true;
else
params->opt_NAMED_PIPE.set_default(false);
#endif
}
/* Set the main dialog controls using DataSource */
void syncForm(HWND hwnd, DataSource *params)
{
SET_STRING(DSN);
SET_STRING(DESCRIPTION);
SET_STRING(SERVER);
SET_UNSIGNED(PORT);
SET_STRING(UID);
SET_STRING(PWD);
SET_STRING(SOCKET);
SET_COMBO(DATABASE);
#ifdef _WIN32
if (params->opt_NAMED_PIPE)
{
SET_RADIO(hwnd, IDC_RADIO_NAMED_PIPE, TRUE);
}
else
{
SET_RADIO(hwnd, IDC_RADIO_tcp, TRUE);
}
SwitchTcpOrPipe(hwnd, params->opt_NAMED_PIPE);
#else
if (params->opt_SOCKET)
{
/* this flag means the socket file in Linux */
SET_CHECKED(__UNUSED, use_socket_file, TRUE);
SET_SENSITIVE(SERVER, FALSE);
SET_SENSITIVE(SOCKET, TRUE);
}
else
{
SET_CHECKED(__UNUSED, use_tcp_ip_server, TRUE);
SET_SENSITIVE(SERVER, TRUE);
SET_SENSITIVE(SOCKET, FALSE);
}
#endif
}
#undef CLIENT_INTERACTIVE
/*
Sets the DataSource fields from the dialog inputs
*/
void syncTabsData(HWND hwnd, DataSource *params)
{ /* 1 - Connection */
GET_BOOL_TAB(CONNECTION_TAB, BIG_PACKETS);
GET_BOOL_TAB(CONNECTION_TAB, COMPRESSED_PROTO);
GET_BOOL_TAB(CONNECTION_TAB, NO_PROMPT);
#if MYSQL_VERSION_ID < 80300
GET_BOOL_TAB(CONNECTION_TAB, AUTO_RECONNECT);
#endif
GET_BOOL_TAB(CONNECTION_TAB, MULTI_STATEMENTS);
GET_BOOL_TAB(CONNECTION_TAB, CLIENT_INTERACTIVE);
GET_BOOL_TAB(CONNECTION_TAB, CAN_HANDLE_EXP_PWD);
GET_BOOL_TAB(CONNECTION_TAB, GET_SERVER_PUBLIC_KEY);
GET_BOOL_TAB(CONNECTION_TAB, ENABLE_DNS_SRV);
if (params->opt_ENABLE_DNS_SRV.is_set() && params->opt_ENABLE_DNS_SRV)
params->opt_PORT.set_default(3306);
GET_BOOL_TAB(CONNECTION_TAB, MULTI_HOST);
GET_COMBO_TAB(CONNECTION_TAB, CHARSET);
GET_STRING_TAB(CONNECTION_TAB, INITSTMT);
GET_STRING_TAB(CONNECTION_TAB, PLUGIN_DIR);
/* 2 - Authentication */
GET_BOOL_TAB(AUTH_TAB, ENABLE_CLEARTEXT_PLUGIN);
#ifdef _WIN32
GET_STRING_TAB(AUTH_TAB, AUTHENTICATION_KERBEROS_MODE);
#endif
GET_STRING_TAB(AUTH_TAB, DEFAULT_AUTH);
#if MFA_ENABLED
GET_STRING_TAB(AUTH_TAB, pwd2);
GET_STRING_TAB(AUTH_TAB, pwd3);
#endif
GET_STRING_TAB(AUTH_TAB, OCI_CONFIG_FILE);
GET_STRING_TAB(AUTH_TAB, OCI_CONFIG_PROFILE);
/* 3 - AWS Authentication */
GET_COMBO_TAB(AWS_AUTH_TAB, AUTH_MODE);
GET_STRING_TAB(AWS_AUTH_TAB, AUTH_REGION);
GET_STRING_TAB(AWS_AUTH_TAB, AUTH_HOST);
GET_UNSIGNED_TAB(AWS_AUTH_TAB, AUTH_PORT);
GET_UNSIGNED_TAB(AWS_AUTH_TAB, AUTH_EXPIRATION);
GET_STRING_TAB(AWS_AUTH_TAB, AUTH_SECRET_ID);
/* 4 - Federated Authentication */
GET_COMBO_TAB(FED_AUTH_TAB, FED_AUTH_MODE);
GET_STRING_TAB(FED_AUTH_TAB, IDP_USERNAME);
GET_STRING_TAB(FED_AUTH_TAB, IDP_PASSWORD);
GET_STRING_TAB(FED_AUTH_TAB, IDP_ENDPOINT);
GET_STRING_TAB(FED_AUTH_TAB, APP_ID);
GET_STRING_TAB(FED_AUTH_TAB, IAM_ROLE_ARN);
GET_STRING_TAB(FED_AUTH_TAB, IAM_IDP_ARN);
GET_UNSIGNED_TAB(FED_AUTH_TAB, IDP_PORT);
GET_STRING_TAB(FED_AUTH_TAB, FED_AUTH_REGION);
GET_STRING_TAB(FED_AUTH_TAB, FED_AUTH_HOST);
GET_UNSIGNED_TAB(FED_AUTH_TAB, FED_AUTH_PORT);
GET_UNSIGNED_TAB(FED_AUTH_TAB, FED_AUTH_EXPIRATION);
GET_UNSIGNED_TAB(FED_AUTH_TAB, CLIENT_CONNECT_TIMEOUT);
GET_UNSIGNED_TAB(FED_AUTH_TAB, CLIENT_SOCKET_TIMEOUT);
GET_BOOL_TAB(FED_AUTH_TAB, ENABLE_SSL);
/* 5 - Custom Endpoint */
GET_BOOL_TAB(CUSTOM_ENDPOINT_TAB, ENABLE_CUSTOM_ENDPOINT_MONITORING);
GET_BOOL_TAB(CUSTOM_ENDPOINT_TAB, WAIT_FOR_CUSTOM_ENDPOINT_INFO);
GET_UNSIGNED_TAB(CUSTOM_ENDPOINT_TAB, CUSTOM_ENDPOINT_MONITOR_EXPIRATION_MS);
GET_UNSIGNED_TAB(CUSTOM_ENDPOINT_TAB, CUSTOM_ENDPOINT_INFO_REFRESH_RATE_MS);
GET_UNSIGNED_TAB(CUSTOM_ENDPOINT_TAB, WAIT_FOR_CUSTOM_ENDPOINT_INFO_TIMEOUT_MS);
GET_STRING_TAB(CUSTOM_ENDPOINT_TAB, CUSTOM_ENDPOINT_REGION);
/* 6 - Failover */
GET_BOOL_TAB(FAILOVER_TAB, ENABLE_CLUSTER_FAILOVER);
GET_COMBO_TAB(FAILOVER_TAB, FAILOVER_MODE);
GET_BOOL_TAB(FAILOVER_TAB, GATHER_PERF_METRICS);
if (READ_BOOL_TAB(FAILOVER_TAB, GATHER_PERF_METRICS))
{
GET_BOOL_TAB(FAILOVER_TAB, GATHER_PERF_METRICS_PER_INSTANCE);
}
GET_STRING_TAB(FAILOVER_TAB, HOST_PATTERN);
GET_STRING_TAB(FAILOVER_TAB, CLUSTER_ID);
GET_UNSIGNED_TAB(FAILOVER_TAB, TOPOLOGY_REFRESH_RATE);
GET_UNSIGNED_TAB(FAILOVER_TAB, FAILOVER_TIMEOUT);
GET_UNSIGNED_TAB(FAILOVER_TAB, FAILOVER_TOPOLOGY_REFRESH_RATE);
GET_UNSIGNED_TAB(FAILOVER_TAB, FAILOVER_WRITER_RECONNECT_INTERVAL);
GET_UNSIGNED_TAB(FAILOVER_TAB, FAILOVER_READER_CONNECT_TIMEOUT);
GET_UNSIGNED_TAB(FAILOVER_TAB, CONNECT_TIMEOUT);
GET_UNSIGNED_TAB(FAILOVER_TAB, NETWORK_TIMEOUT);
/* 7 - Monitoring */
GET_BOOL_TAB(MONITORING_TAB, ENABLE_FAILURE_DETECTION);
if (READ_BOOL_TAB(MONITORING_TAB, ENABLE_FAILURE_DETECTION))
{
GET_UNSIGNED_TAB(MONITORING_TAB, FAILURE_DETECTION_TIME);
GET_UNSIGNED_TAB(MONITORING_TAB, FAILURE_DETECTION_TIMEOUT);
GET_UNSIGNED_TAB(MONITORING_TAB, FAILURE_DETECTION_INTERVAL);
GET_UNSIGNED_TAB(MONITORING_TAB, FAILURE_DETECTION_COUNT);
GET_UNSIGNED_TAB(MONITORING_TAB, MONITOR_DISPOSAL_TIME);
}
/* 8 - Metadata*/
GET_BOOL_TAB(METADATA_TAB, NO_BIGINT);
GET_BOOL_TAB(METADATA_TAB, NO_BINARY_RESULT);
GET_BOOL_TAB(METADATA_TAB, FULL_COLUMN_NAMES);
GET_BOOL_TAB(METADATA_TAB, NO_CATALOG);
GET_BOOL_TAB(METADATA_TAB, NO_SCHEMA);
GET_BOOL_TAB(METADATA_TAB, COLUMN_SIZE_S32);
/* 9 - Cursors/Results */
GET_BOOL_TAB(CURSORS_TAB, FOUND_ROWS);
GET_BOOL_TAB(CURSORS_TAB, AUTO_IS_NULL);
GET_BOOL_TAB(CURSORS_TAB, DYNAMIC_CURSOR);
GET_BOOL_TAB(CURSORS_TAB, NO_DEFAULT_CURSOR);
GET_BOOL_TAB(CURSORS_TAB, PAD_SPACE);
GET_BOOL_TAB(CURSORS_TAB, NO_CACHE);
GET_BOOL_TAB(CURSORS_TAB, FORWARD_CURSOR);
GET_BOOL_TAB(CURSORS_TAB, ZERO_DATE_TO_MIN);
if (READ_BOOL_TAB(CURSORS_TAB, CURSOR_PREFETCH_ACTIVE))
{
GET_UNSIGNED_TAB(CURSORS_TAB, PREFETCH);
}
else
{
params->opt_PREFETCH = 0;
}
/* 10 - debug*/
GET_BOOL_TAB(DEBUG_TAB,LOG_QUERY);
/* 11 - ssl related */
GET_STRING_TAB(SSL_TAB, SSL_KEY);
GET_STRING_TAB(SSL_TAB, SSL_CERT);
GET_STRING_TAB(SSL_TAB, SSL_CA);
GET_STRING_TAB(SSL_TAB, SSL_CAPATH);
GET_STRING_TAB(SSL_TAB, SSL_CIPHER);
GET_COMBO_TAB(SSL_TAB, SSL_MODE);
GET_STRING_TAB(SSL_TAB, RSAKEY);
GET_BOOL_TAB(SSL_TAB, NO_TLS_1_2);
GET_BOOL_TAB(SSL_TAB, NO_TLS_1_3);
GET_STRING_TAB(SSL_TAB, TLS_VERSIONS);
GET_STRING_TAB(SSL_TAB, SSL_CRL);
GET_STRING_TAB(SSL_TAB, SSL_CRLPATH);
/* 12 - Misc*/
GET_BOOL_TAB(MISC_TAB, SAFE);
GET_BOOL_TAB(MISC_TAB, NO_LOCALE);
GET_BOOL_TAB(MISC_TAB, IGNORE_SPACE);
GET_BOOL_TAB(MISC_TAB, USE_MYCNF);
GET_BOOL_TAB(MISC_TAB, NO_TRANSACTIONS);
GET_BOOL_TAB(MISC_TAB, MIN_DATE_TO_ZERO);
GET_BOOL_TAB(MISC_TAB, NO_SSPS);
GET_BOOL_TAB(MISC_TAB, DFLT_BIGINT_BIND_STR);
GET_BOOL_TAB(MISC_TAB, NO_DATE_OVERFLOW);
GET_BOOL_TAB(MISC_TAB, ENABLE_LOCAL_INFILE);
GET_STRING_TAB(MISC_TAB, LOAD_DATA_LOCAL_DIR);
}
/*
Sets the options in the dialog tabs using DataSource
*/
void syncTabs(HWND hwnd, DataSource *params)
{
/* 1 - Connection */
SET_BOOL_TAB(CONNECTION_TAB, BIG_PACKETS);
SET_BOOL_TAB(CONNECTION_TAB, COMPRESSED_PROTO);
SET_BOOL_TAB(CONNECTION_TAB, NO_PROMPT);
#if MYSQL_VERSION_ID < 80300
SET_BOOL_TAB(CONNECTION_TAB, AUTO_RECONNECT);
#endif
SET_BOOL_TAB(CONNECTION_TAB, ENABLE_DNS_SRV);
SET_BOOL_TAB(CONNECTION_TAB, MULTI_STATEMENTS);
SET_BOOL_TAB(CONNECTION_TAB, CLIENT_INTERACTIVE);
SET_BOOL_TAB(CONNECTION_TAB, CAN_HANDLE_EXP_PWD);
SET_BOOL_TAB(CONNECTION_TAB, GET_SERVER_PUBLIC_KEY);
SET_BOOL_TAB(CONNECTION_TAB, ENABLE_DNS_SRV);
SET_BOOL_TAB(CONNECTION_TAB, MULTI_HOST);
#ifdef _WIN32
if ( getTabCtrlTabPages(CONNECTION_TAB-1))
#endif
{
SET_COMBO_TAB(CONNECTION_TAB, CHARSET);
SET_STRING_TAB(CONNECTION_TAB, INITSTMT);
SET_STRING_TAB(CONNECTION_TAB, PLUGIN_DIR);
}
/* 2 - Authentication */
SET_BOOL_TAB(AUTH_TAB, ENABLE_CLEARTEXT_PLUGIN);
#ifdef _WIN32
SET_STRING_TAB(AUTH_TAB, AUTHENTICATION_KERBEROS_MODE);
#endif
SET_STRING_TAB(AUTH_TAB, DEFAULT_AUTH);
#if MFA_ENABLED
SET_STRING_TAB(AUTH_TAB, PWD2);
SET_STRING_TAB(AUTH_TAB, PWD3);
#endif
SET_STRING_TAB(AUTH_TAB, OCI_CONFIG_FILE);
SET_STRING_TAB(AUTH_TAB, OCI_CONFIG_PROFILE);
/* 3 - AWS Authentication */
SET_COMBO_TAB(AWS_AUTH_TAB, AUTH_MODE);
SET_STRING_TAB(AWS_AUTH_TAB, AUTH_REGION);
SET_STRING_TAB(AWS_AUTH_TAB, AUTH_HOST);
SET_UNSIGNED_TAB(AWS_AUTH_TAB, AUTH_PORT);
SET_UNSIGNED_TAB(AWS_AUTH_TAB, AUTH_EXPIRATION);
SET_STRING_TAB(AWS_AUTH_TAB, AUTH_SECRET_ID);
/* 4 - Federated Authentication */
SET_COMBO_TAB(FED_AUTH_TAB, FED_AUTH_MODE);
SET_STRING_TAB(FED_AUTH_TAB, IDP_USERNAME);
SET_STRING_TAB(FED_AUTH_TAB, IDP_PASSWORD);
SET_STRING_TAB(FED_AUTH_TAB, IDP_ENDPOINT);
SET_STRING_TAB(FED_AUTH_TAB, APP_ID);
SET_STRING_TAB(FED_AUTH_TAB, IAM_ROLE_ARN);
SET_STRING_TAB(FED_AUTH_TAB, IAM_IDP_ARN);
SET_UNSIGNED_TAB(FED_AUTH_TAB, IDP_PORT);
SET_STRING_TAB(FED_AUTH_TAB, FED_AUTH_REGION);
SET_STRING_TAB(FED_AUTH_TAB, FED_AUTH_HOST);
SET_UNSIGNED_TAB(FED_AUTH_TAB, FED_AUTH_PORT);
SET_UNSIGNED_TAB(FED_AUTH_TAB, FED_AUTH_EXPIRATION);
SET_UNSIGNED_TAB(FED_AUTH_TAB, CLIENT_CONNECT_TIMEOUT);
SET_UNSIGNED_TAB(FED_AUTH_TAB, CLIENT_SOCKET_TIMEOUT);
SET_BOOL_TAB(FED_AUTH_TAB, ENABLE_SSL);
/* 5 - Custom Endpoint */
SET_BOOL_TAB(CUSTOM_ENDPOINT_TAB, ENABLE_CUSTOM_ENDPOINT_MONITORING);
SET_BOOL_TAB(CUSTOM_ENDPOINT_TAB, WAIT_FOR_CUSTOM_ENDPOINT_INFO);
if (params->opt_CUSTOM_ENDPOINT_INFO_REFRESH_RATE_MS > 0)
{
SET_UNSIGNED_TAB(CUSTOM_ENDPOINT_TAB, CUSTOM_ENDPOINT_INFO_REFRESH_RATE_MS);
}
if (params->opt_CUSTOM_ENDPOINT_MONITOR_EXPIRATION_MS > 0)
{
SET_UNSIGNED_TAB(CUSTOM_ENDPOINT_TAB, CUSTOM_ENDPOINT_MONITOR_EXPIRATION_MS);
}
if (params->opt_WAIT_FOR_CUSTOM_ENDPOINT_INFO_TIMEOUT_MS > 0)
{
SET_UNSIGNED_TAB(CUSTOM_ENDPOINT_TAB, WAIT_FOR_CUSTOM_ENDPOINT_INFO_TIMEOUT_MS);
}
SET_STRING_TAB(CUSTOM_ENDPOINT_TAB, CUSTOM_ENDPOINT_REGION);
/* 6 - Failover */
SET_BOOL_TAB(FAILOVER_TAB, ENABLE_CLUSTER_FAILOVER);
SET_COMBO_TAB(FAILOVER_TAB, FAILOVER_MODE);
SET_BOOL_TAB(FAILOVER_TAB, GATHER_PERF_METRICS);
if(READ_BOOL_TAB(FAILOVER_TAB, GATHER_PERF_METRICS))
{
#ifdef _WIN32
SET_ENABLED(FAILOVER_TAB, IDC_CHECK_GATHER_PERF_METRICS_PER_INSTANCE, TRUE);
#endif
SET_CHECKED_TAB(FAILOVER_TAB, GATHER_PERF_METRICS, TRUE);
SET_BOOL_TAB(FAILOVER_TAB, GATHER_PERF_METRICS_PER_INSTANCE);
}
SET_STRING_TAB(FAILOVER_TAB, HOST_PATTERN);
SET_STRING_TAB(FAILOVER_TAB, CLUSTER_ID);
if (params->opt_TOPOLOGY_REFRESH_RATE > 0)
{
SET_UNSIGNED_TAB(FAILOVER_TAB, TOPOLOGY_REFRESH_RATE);
}
if (params->opt_FAILOVER_TIMEOUT > 0)
{
SET_UNSIGNED_TAB(FAILOVER_TAB, FAILOVER_TIMEOUT);
}
if (params->opt_FAILOVER_TOPOLOGY_REFRESH_RATE > 0)
{
SET_UNSIGNED_TAB(FAILOVER_TAB, FAILOVER_TOPOLOGY_REFRESH_RATE);
}
if (params->opt_FAILOVER_WRITER_RECONNECT_INTERVAL > 0)
{
SET_UNSIGNED_TAB(FAILOVER_TAB, FAILOVER_WRITER_RECONNECT_INTERVAL);
}
if (params->opt_FAILOVER_READER_CONNECT_TIMEOUT > 0)
{
SET_UNSIGNED_TAB(FAILOVER_TAB, FAILOVER_READER_CONNECT_TIMEOUT);
}
if (params->opt_CONNECT_TIMEOUT > 0)
{
SET_UNSIGNED_TAB(FAILOVER_TAB, CONNECT_TIMEOUT);
}
if (params->opt_NETWORK_TIMEOUT > 0)
{
SET_UNSIGNED_TAB(FAILOVER_TAB, NETWORK_TIMEOUT);
}
/* 7 - Monitoring */
SET_BOOL_TAB(MONITORING_TAB, ENABLE_FAILURE_DETECTION);
if (READ_BOOL_TAB(MONITORING_TAB, ENABLE_FAILURE_DETECTION)) {
#ifdef _WIN32
SET_ENABLED(MONITORING_TAB, IDC_EDIT_FAILURE_DETECTION_TIME, TRUE);
SET_ENABLED(MONITORING_TAB, IDC_EDIT_FAILURE_DETECTION_INTERVAL, TRUE);
SET_ENABLED(MONITORING_TAB, IDC_EDIT_FAILURE_DETECTION_COUNT, TRUE);
SET_ENABLED(MONITORING_TAB, IDC_EDIT_MONITOR_DISPOSAL_TIME, TRUE);
SET_ENABLED(MONITORING_TAB, IDC_EDIT_FAILURE_DETECTION_TIMEOUT, TRUE);
#endif
SET_UNSIGNED_TAB(MONITORING_TAB, FAILURE_DETECTION_TIME);
SET_UNSIGNED_TAB(MONITORING_TAB, FAILURE_DETECTION_INTERVAL);
SET_UNSIGNED_TAB(MONITORING_TAB, FAILURE_DETECTION_COUNT);
SET_UNSIGNED_TAB(MONITORING_TAB, MONITOR_DISPOSAL_TIME);
SET_UNSIGNED_TAB(MONITORING_TAB, FAILURE_DETECTION_TIMEOUT);
}
/* 8 - Metadata */
SET_BOOL_TAB(METADATA_TAB, NO_BIGINT);
SET_BOOL_TAB(METADATA_TAB, NO_BINARY_RESULT);
SET_BOOL_TAB(METADATA_TAB, FULL_COLUMN_NAMES);
SET_BOOL_TAB(METADATA_TAB, NO_CATALOG);
SET_BOOL_TAB(METADATA_TAB, NO_SCHEMA);
SET_BOOL_TAB(METADATA_TAB, COLUMN_SIZE_S32);
/* 9 - Cursors/Results */
SET_BOOL_TAB(CURSORS_TAB, FOUND_ROWS);
SET_BOOL_TAB(CURSORS_TAB, AUTO_IS_NULL);
SET_BOOL_TAB(CURSORS_TAB, DYNAMIC_CURSOR);
SET_BOOL_TAB(CURSORS_TAB, NO_DEFAULT_CURSOR);
SET_BOOL_TAB(CURSORS_TAB, PAD_SPACE);
SET_BOOL_TAB(CURSORS_TAB, NO_CACHE);
SET_BOOL_TAB(CURSORS_TAB, FORWARD_CURSOR);
SET_BOOL_TAB(CURSORS_TAB, ZERO_DATE_TO_MIN);
if(params->opt_PREFETCH > 0)
{
#ifdef _WIN32
SET_ENABLED(CURSORS_TAB, IDC_EDIT_PREFETCH, TRUE);
#endif
SET_CHECKED_TAB(CURSORS_TAB, CURSOR_PREFETCH_ACTIVE, TRUE);
SET_UNSIGNED_TAB(CURSORS_TAB, PREFETCH);
}
/* 10 - debug*/
SET_BOOL_TAB(DEBUG_TAB,LOG_QUERY);
/* 11 - ssl related */
#ifdef _WIN32
if ( getTabCtrlTabPages(SSL_TAB-1) )
#endif
{
if(params->opt_SSL_KEY)
SET_STRING_TAB(SSL_TAB, SSL_KEY);
if (params->opt_SSL_CERT)
SET_STRING_TAB(SSL_TAB, SSL_CERT);
if (params->opt_SSL_CA)
SET_STRING_TAB(SSL_TAB, SSL_CA);
if (params->opt_SSL_CAPATH)
SET_STRING_TAB(SSL_TAB, SSL_CAPATH);
if (params->opt_SSL_CIPHER)
SET_STRING_TAB(SSL_TAB, SSL_CIPHER);
if (params->opt_SSL_MODE)
SET_COMBO_TAB(SSL_TAB, SSL_MODE);
if (params->opt_RSAKEY)
SET_STRING_TAB(SSL_TAB, RSAKEY);
if (params->opt_SSL_CRL)
SET_STRING_TAB(SSL_TAB, SSL_CRL);
if (params->opt_SSL_CRLPATH)
SET_STRING_TAB(SSL_TAB, SSL_CRLPATH);
SET_BOOL_TAB(SSL_TAB, NO_TLS_1_2);
SET_BOOL_TAB(SSL_TAB, NO_TLS_1_3);
SET_STRING_TAB(SSL_TAB, TLS_VERSIONS);
}
/* 12 - Misc*/
SET_BOOL_TAB(MISC_TAB, SAFE);
SET_BOOL_TAB(MISC_TAB, NO_LOCALE);
SET_BOOL_TAB(MISC_TAB, IGNORE_SPACE);
SET_BOOL_TAB(MISC_TAB, USE_MYCNF);
SET_BOOL_TAB(MISC_TAB, NO_TRANSACTIONS);
SET_BOOL_TAB(MISC_TAB, MIN_DATE_TO_ZERO);
SET_BOOL_TAB(MISC_TAB, NO_SSPS);
SET_BOOL_TAB(MISC_TAB, DFLT_BIGINT_BIND_STR);
SET_BOOL_TAB(MISC_TAB, NO_DATE_OVERFLOW);
SET_BOOL_TAB(MISC_TAB, ENABLE_LOCAL_INFILE);
SET_STRING_TAB(MISC_TAB, LOAD_DATA_LOCAL_DIR);
}
void FillParameters(HWND hwnd, DataSource *params)
{
syncData(hwnd, params );
#if MYSQL_VERSION_ID >= 80300
// Turn off AUTO_RECONNECT unconditionally.
params->opt_AUTO_RECONNECT.set_default(false);
#endif
#ifdef _WIN32
// Controls in Details cannot be read unless it is expanded.
if(getTabCtrlTab())
#endif
syncTabsData(hwnd, params);
}