Changeset: 5723762a433b for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/5723762a433b Modified Files: clients/odbc/winsetup/banner.bmp clients/odbc/winsetup/resource.h clients/odbc/winsetup/setup.c clients/odbc/winsetup/setup.rc Branch: Aug2024 Log Message:
Extend ODBC Data Source Setup program with fields to specify Client Information. Changed layout of the fields in the dialog to two columns to limit the height of the dialog and making it wider. diffs (truncated from 451 to 300 lines): diff --git a/clients/odbc/winsetup/banner.bmp b/clients/odbc/winsetup/banner.bmp index 55ca8c7c1dfb2244e729d3f8aeb829e9aa753669..128fe2edf3ab2fbfb791c4933a7b5772a6513385 GIT binary patch literal 129654 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 wCK&qy>D&%VODMWy7ytkO00000000000000000000000000000006Y)>4>oTy6#xJL diff --git a/clients/odbc/winsetup/resource.h b/clients/odbc/winsetup/resource.h --- a/clients/odbc/winsetup/resource.h +++ b/clients/odbc/winsetup/resource.h @@ -40,8 +40,13 @@ #define IDC_EDIT_TIMEZONE 2026 #define IDC_EDIT_LOGFILE 2027 -#define IDC_BUTTON_TEST 2031 -#define IDC_BUTTON_HELP 2032 +// Client Info settings +#define IDC_EDIT_CLIENTINFO 2031 +#define IDC_EDIT_APPLICNAME 2032 +#define IDC_EDIT_CLIENTREMARK 2033 + +#define IDC_BUTTON_TEST 2041 +#define IDC_BUTTON_HELP 2042 // Next default values for new objects // diff --git a/clients/odbc/winsetup/setup.c b/clients/odbc/winsetup/setup.c --- a/clients/odbc/winsetup/setup.c +++ b/clients/odbc/winsetup/setup.c @@ -91,6 +91,13 @@ struct data { char *host; char *port; /* positive integer */ char *database; + // TLS settings + char *use_tls; /* only on or off allowed */ + char *servercert; + char *servercerthash; + char *clientkey; + char *clientcert; + // Advanced settings char *schema; char *logintimeout; /* empty, 0 or positive integer (millisecs) */ char *replytimeout; /* empty, 0 or positive integer (millisecs) */ @@ -98,12 +105,10 @@ struct data { char *autocommit; /* only on or off allowed */ char *timezone; /* empty, 0 or signed integer (minutes) */ char *logfile; - // TLS settings - char *use_tls; /* only on or off allowed */ - char *servercert; - char *servercerthash; - char *clientkey; - char *clientcert; + // Client info + char *clientinfo; /* only on or off allowed */ + char *applicationname; + char *clientremark; HWND parent; WORD request; @@ -153,6 +158,7 @@ TestConnection(HWND hwndDlg, struct data } // Only when use_tls is "on", add TLS parameters if (datap->use_tls && strcmp(datap->use_tls, "on") == 0) { + pos += snprintf(inStr + pos, strSize - pos, "TLS=on;"); if (datap->servercert && strlen(datap->servercert) > 0) { pos += snprintf(inStr + pos, strSize - pos, "CERT=%s;", datap->servercert); } @@ -179,9 +185,9 @@ TestConnection(HWND hwndDlg, struct data if (datap->replysize && strlen(datap->replysize) > 0) { pos += snprintf(inStr + pos, strSize - pos, "REPLYSIZE=%s;", datap->replysize); } - // in ODBC autocommit is on by default. Only when set to off, add it to the connection string. + // in ODBC autocommit is on by specification. Only when set to off, add it to the connection string. if (datap->autocommit && strcmp(datap->autocommit, "off") == 0) { - pos += snprintf(inStr + pos, strSize - pos, "AUTOCOMMIT=%s;", datap->autocommit); + pos += snprintf(inStr + pos, strSize - pos, "AUTOCOMMIT=off;"); } if (datap->timezone && strlen(datap->timezone) > 0) { pos += snprintf(inStr + pos, strSize - pos, "TIMEZONE=%s;", datap->timezone); @@ -191,27 +197,21 @@ TestConnection(HWND hwndDlg, struct data } // test the constructed connection string ret = SQLDriverConnect(dbc, hwndDlg, (SQLCHAR *) inStr, SQL_NTS, (SQLCHAR *) outStr, strSize, &outLen, SQL_DRIVER_NOPROMPT); - switch (ret) { - case SQL_SUCCESS: - case SQL_SUCCESS_WITH_INFO: - MessageBox(hwndDlg, "Connection successful", boxtitle, MB_OK); - ret = SQLDisconnect(dbc); - break; - case SQL_ERROR: - default: - { - SQLCHAR state[6]; - SQLINTEGER errnr; - SQLCHAR msg[2560]; - SQLSMALLINT msglen; - char buf[2600 + strSize + strSize]; - // get Error msg - ret = SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, state, &errnr, msg, sizeof(msg), &msglen); - sprintf(buf, "Connection failed!\n\nError message: %s\n\nSQLstate %s, Errnr %d\n\nConnectString used: %s\n\nReturned ConnectString: %s", - (char *) msg, (char *) state, (int) errnr, inStr, outStr); - MessageBox(hwndDlg, buf, boxtitle, MB_ICONERROR); - break; - } + if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { + MessageBox(hwndDlg, "Connection successful", boxtitle, MB_OK); + ret = SQLDisconnect(dbc); + } else { + SQLCHAR state[6]; + SQLINTEGER errnr; + SQLCHAR msg[2560]; + SQLSMALLINT msglen; + char buf[2600 + strSize + strSize]; + + // get Error msg + ret = SQLGetDiagRec(SQL_HANDLE_DBC, dbc, 1, state, &errnr, msg, sizeof(msg), &msglen); + sprintf(buf, "Connection failed!\n\nError message: %s\n\nSQLstate %s, Errnr %d\n\nConnectString used: %s\n\nReturned ConnectString: %s", + (char *) msg, (char *) state, (int) errnr, inStr, outStr); + MessageBox(hwndDlg, buf, boxtitle, MB_ICONERROR); } ret = SQLFreeHandle(SQL_HANDLE_DBC, dbc); #undef strSize @@ -280,6 +280,10 @@ DialogProc(HWND hwndDlg, UINT uMsg, WPAR SetDlgItemText(hwndDlg, IDC_EDIT_AUTOCOMMIT, datap->autocommit ? datap->autocommit : "on"); SetDlgItemText(hwndDlg, IDC_EDIT_TIMEZONE, datap->timezone ? datap->timezone : ""); SetDlgItemText(hwndDlg, IDC_EDIT_LOGFILE, datap->logfile ? datap->logfile : ""); + // Client Info + SetDlgItemText(hwndDlg, IDC_EDIT_CLIENTINFO, datap->clientinfo ? datap->clientinfo : "off"); + SetDlgItemText(hwndDlg, IDC_EDIT_APPLICNAME, datap->applicationname ? datap->applicationname : ""); + SetDlgItemText(hwndDlg, IDC_EDIT_CLIENTREMARK, datap->clientremark ? datap->clientremark : ""); if (datap->request == ODBC_ADD_DSN && datap->dsn && *datap->dsn) EnableWindow(GetDlgItem(hwndDlg, IDC_EDIT_DSN), FALSE); return TRUE; @@ -300,7 +304,7 @@ DialogProc(HWND hwndDlg, UINT uMsg, WPAR } /* fall through */ case IDC_BUTTON_TEST: - /* validate entered string values */ + /* validate entered string values for on/off fields */ GetDlgItemText(hwndDlg, IDC_EDIT_AUTOCOMMIT, buf, sizeof(buf)); if (strcmp("on", buf) != 0 && strcmp("off", buf) != 0) { MessageBox(hwndDlg, "Autocommit must be set to on or off. Default is on.", NULL, MB_ICONERROR); @@ -311,6 +315,11 @@ DialogProc(HWND hwndDlg, UINT uMsg, WPAR MessageBox(hwndDlg, "TLS Encrypt must be set to on or off. Default is off.", NULL, MB_ICONERROR); return TRUE; } + GetDlgItemText(hwndDlg, IDC_EDIT_CLIENTINFO, buf, sizeof(buf)); + if (strcmp("on", buf) != 0 && strcmp("off", buf) != 0) { + MessageBox(hwndDlg, "Client Info must be set to on or off. Default is off.", NULL, MB_ICONERROR); + return TRUE; + } GetDlgItemText(hwndDlg, IDC_EDIT_DESC, buf, sizeof(buf)); if (datap->desc) @@ -386,6 +395,19 @@ DialogProc(HWND hwndDlg, UINT uMsg, WPAR if (datap->logfile) free(datap->logfile); datap->logfile = strdup(buf); + GetDlgItemText(hwndDlg, IDC_EDIT_CLIENTINFO, buf, sizeof(buf)); + if (datap->clientinfo) + free(datap->clientinfo); + datap->clientinfo = strdup(buf); + GetDlgItemText(hwndDlg, IDC_EDIT_APPLICNAME, buf, sizeof(buf)); + if (datap->applicationname) + free(datap->applicationname); + datap->applicationname = strdup(buf); + GetDlgItemText(hwndDlg, IDC_EDIT_CLIENTREMARK, buf, sizeof(buf)); + if (datap->clientremark) + free(datap->clientremark); + datap->clientremark = strdup(buf); + if (LOWORD(wParam) == IDC_BUTTON_TEST) { TestConnection(hwndDlg, datap); @@ -438,6 +460,12 @@ ConfigDSN(HWND parent, WORD request, LPC data.host = NULL; data.port = NULL; data.database = NULL; + // TLS settings + data.use_tls = NULL; + data.servercert = NULL; + data.servercerthash = NULL; + data.clientkey = NULL; + data.clientcert = NULL; // Advanced settings data.logfile = NULL; data.schema = NULL; @@ -447,12 +475,10 @@ ConfigDSN(HWND parent, WORD request, LPC data.autocommit = NULL; data.timezone = NULL; data.logfile = NULL; - // TLS settings - data.use_tls = NULL; - data.servercert = NULL; - data.servercerthash = NULL; - data.clientkey = NULL; - data.clientcert = NULL; + // Client Info + data.clientinfo = NULL; + data.applicationname = NULL; + data.clientremark = NULL; data.parent = parent; data.request = request; @@ -504,6 +530,12 @@ ConfigDSN(HWND parent, WORD request, LPC data.timezone = strdup(value); else if (strncasecmp("LogFile=", attributes, value - attributes) == 0) data.logfile = strdup(value); + else if (strncasecmp("ClientInfo=", attributes, value - attributes) == 0) + data.clientinfo = strdup(value); + else if (strncasecmp("ApplicationName=", attributes, value - attributes) == 0) _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org