From 1f265596513602e015610604d5aa0277f9e56e97 Mon Sep 17 00:00:00 2001 From: "Juergen E. Fischer" Date: Wed, 27 Jun 2018 15:39:12 +0200 Subject: [PATCH 1/3] Add support for service connection parameters (TODO: Update japanese dialog) --- connection.c | 6 +++++- dlg_specific.c | 13 ++++++++++++- dlg_specific.h | 7 +++++-- dlg_wingui.c | 3 ++- docs/release.html | 2 +- drvconn.c | 4 ++++ editConfiguration.bat | 2 +- psqlodbc.h | 1 + psqlodbc.rc | 40 +++++++++++++++++++++------------------- resource.h | 1 + 10 files changed, 53 insertions(+), 26 deletions(-) diff --git a/connection.c b/connection.c index 069f428..82d1ed2 100644 --- a/connection.c +++ b/connection.c @@ -2718,6 +2718,10 @@ LIBPQ_connect(ConnectionClass *self) } /* Build arrays of keywords & values, for PQconnectDBParams */ cnt = 0; + if (ci->service[0]) + { + opts[cnt] = "service"; vals[cnt++] = ci->service; + } if (ci->server[0]) { opts[cnt] = "host"; vals[cnt++] = ci->server; @@ -2728,7 +2732,7 @@ LIBPQ_connect(ConnectionClass *self) } if (ci->database[0]) { - opts[cnt] = "dbname"; vals[cnt++] = ci->database; + opts[cnt] = "dbname"; vals[cnt++] = ci->database; } if (ci->username[0]) { diff --git a/dlg_specific.c b/dlg_specific.c index 2eff402..0f9db4b 100644 --- a/dlg_specific.c +++ b/dlg_specific.c @@ -296,9 +296,10 @@ MYLOG(DETAIL_LOG_LEVEL, "force_abbrev=%d abbrev=%d\n", ci->force_abbrev_connstr, encode(ci->password, encoded_item, sizeof(encoded_item)); /* fundamental info */ nlen = MAX_CONNECT_STRING; - olen = snprintf(connect_string, nlen, "%s=%s;DATABASE=%s;SERVER=%s;PORT=%s;UID=%s;PWD=%s", + olen = snprintf(connect_string, nlen, "%s=%s;SERVICE=%s;DATABASE=%s;SERVER=%s;PORT=%s;UID=%s;PWD=%s", got_dsn ? "DSN" : "DRIVER", got_dsn ? ci->dsn : ci->drivername, + ci->service, ci->database, ci->server, ci->port, @@ -589,6 +590,8 @@ copyConnAttributes(ConnInfo *ci, const char *attribute, const char *value) STRCPY_FIXED(ci->desc, value); else if (stricmp(attribute, INI_DATABASE) == 0) STRCPY_FIXED(ci->database, value); + else if (stricmp(attribute, INI_SERVICE) == 0 || stricmp(attribute, SPEC_SERVICE) == 0) + STRCPY_FIXED(ci->service, value); else if (stricmp(attribute, INI_SERVER) == 0 || stricmp(attribute, SPEC_SERVER) == 0) STRCPY_FIXED(ci->server, value); else if (stricmp(attribute, INI_USERNAME) == 0 || stricmp(attribute, INI_UID) == 0) @@ -911,6 +914,9 @@ MYLOG(0, "drivername=%s\n", drivername); SQLGetPrivateProfileString(DSN, INI_KDESC, NULL_STRING, ci->desc, sizeof(ci->desc), ODBC_INI); + if (SQLGetPrivateProfileString(DSN, INI_SERVICE, NULL_STRING, temp, sizeof(temp), ODBC_INI) > 0) + STRCPY_FIXED(ci->service, temp); + if (SQLGetPrivateProfileString(DSN, INI_SERVER, NULL_STRING, temp, sizeof(temp), ODBC_INI) > 0) STRCPY_FIXED(ci->server, temp); @@ -1186,6 +1192,11 @@ writeDSNinfo(const ConnInfo *ci) ci->database, ODBC_INI); + SQLWritePrivateProfileString(DSN, + INI_SERVICE, + ci->service, + ODBC_INI); + SQLWritePrivateProfileString(DSN, INI_SERVER, ci->server, diff --git a/dlg_specific.h b/dlg_specific.h index 993b89f..a758f78 100644 --- a/dlg_specific.h +++ b/dlg_specific.h @@ -44,12 +44,15 @@ extern "C" { #define INI_KDESC "Description" /* Data source * description */ +#define INI_SERVICE "Service" /* Name of the + * Postgres service */ #define INI_SERVER "Servername" /* Name of Server * running the Postgres * service */ +#define SPEC_SERVICE "service" #define SPEC_SERVER "server" -#define INI_PORT "Port" /* Port on which the - * Postmaster is listening */ +#define INI_PORT "Port" /* Port on which the + * Postmaster is listening */ #define INI_DATABASE "Database" /* Database Name */ #define INI_UID "UID" /* Default User Name */ #define INI_USERNAME "Username" /* Default User Name */ diff --git a/dlg_wingui.c b/dlg_wingui.c index 7980f5e..384483a 100644 --- a/dlg_wingui.c +++ b/dlg_wingui.c @@ -64,6 +64,7 @@ SetDlgStuff(HWND hdlg, const ConnInfo *ci) * description */ SetDlgItemText(hdlg, IDC_DSNAME, ci->dsn); + SetDlgItemText(hdlg, IDC_SERVICE, ci->service); SetDlgItemText(hdlg, IDC_DESC, ci->desc); SetDlgItemText(hdlg, IDC_DATABASE, ci->database); @@ -115,7 +116,7 @@ GetDlgStuff(HWND hdlg, ConnInfo *ci) char medium_buf[MEDIUM_REGISTRY_LEN]; GetDlgItemText(hdlg, IDC_DESC, ci->desc, sizeof(ci->desc)); - + GetDlgItemText(hdlg, IDC_SERVICE, ci->service, sizeof(ci->service)); GetDlgItemText(hdlg, IDC_DATABASE, ci->database, sizeof(ci->database)); GetDlgItemText(hdlg, IDC_SERVER, ci->server, sizeof(ci->server)); GetDlgItemText(hdlg, IDC_USER, ci->username, sizeof(ci->username)); diff --git a/docs/release.html b/docs/release.html index 06eb110..22bed3b 100644 --- a/docs/release.html +++ b/docs/release.html @@ -1041,7 +1041,7 @@ Changes:
Changes:
1.) Allow password which contains special characters like {,},=,;.
2.) Add a new data source option which makes it possible to use Kerberos for Windows library to reply to GSSAPI authentication request.
-3.) Native support for SSPI Kerberos or Negaotiate service. It may be useful for the 64-bit drivers.
+3.) Native support for SSPI Kerberos or Negotiate service. It may be useful for the 64-bit drivers.
4.) Fix an oversight of Memory overflow handling.
5.) Removed "#define SQL_WCHART_CONVERT" which causes a trouble on some platforms.
6.) Removed the use of misused strcat_s together with snprintf_s (bug report from Jap-Peter Seifert) and use strlcat instead of strncat.
diff --git a/drvconn.c b/drvconn.c index 7224c17..253b492 100644 --- a/drvconn.c +++ b/drvconn.c @@ -378,6 +378,8 @@ dconn_FDriverConnectProc( ShowWindow(GetDlgItem(hdlg, IDC_TEST), SW_HIDE); ShowWindow(GetDlgItem(hdlg, IDC_MANAGEDSN), SW_HIDE); // ShowWindow(GetDlgItem(hdlg, IDC_DATASOURCE), SW_HIDE); + if ('\0' != ci->service[0]) + EnableWindow(GetDlgItem(hdlg, IDC_SERVICE), FALSE); if ('\0' != ci->server[0]) EnableWindow(GetDlgItem(hdlg, IDC_SERVER), FALSE); if ('\0' != ci->port[0]) @@ -397,6 +399,8 @@ dconn_FDriverConnectProc( } else if (ci->database[0] == '\0') ; /* default focus */ + else if (ci->service[0] == '\0') + SetFocus(GetDlgItem(hdlg, IDC_SERVICE)); else if (ci->server[0] == '\0') SetFocus(GetDlgItem(hdlg, IDC_SERVER)); else if (ci->port[0] == '\0') diff --git a/editConfiguration.bat b/editConfiguration.bat index ee37fac..1ffe087 100755 --- a/editConfiguration.bat +++ b/editConfiguration.bat @@ -1,4 +1,4 @@ :: -:: Start editConfiguration with a mimimized console window +:: Start editConfiguration with a minimized console window :: powershell -Sta -WindowStyle Minimized "& '%~dp0\winbuild\editConfiguration.ps1' %*" diff --git a/psqlodbc.h b/psqlodbc.h index e08bf44..2549388 100644 --- a/psqlodbc.h +++ b/psqlodbc.h @@ -602,6 +602,7 @@ typedef struct char dsn[MEDIUM_REGISTRY_LEN]; char desc[MEDIUM_REGISTRY_LEN]; char drivername[MEDIUM_REGISTRY_LEN]; + char service[MEDIUM_REGISTRY_LEN]; char server[MEDIUM_REGISTRY_LEN]; char database[MEDIUM_REGISTRY_LEN]; char username[MEDIUM_REGISTRY_LEN]; diff --git a/psqlodbc.rc b/psqlodbc.rc index 7433a3b..1aa6cf6 100644 --- a/psqlodbc.rc +++ b/psqlodbc.rc @@ -472,7 +472,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US // Dialog // -DLG_CONFIG DIALOG DISCARDABLE 65, 43, 305, 142 +DLG_CONFIG DIALOG DISCARDABLE 65, 43, 305, 153 STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU #ifdef UNICODE_SUPPORT @@ -486,22 +486,24 @@ BEGIN EDITTEXT IDC_DSNAME,57,24,72,12,ES_AUTOHSCROLL | WS_GROUP RTEXT "Des&cription",IDC_DESCTEXT,143,24,45,12,NOT WS_GROUP EDITTEXT IDC_DESC,192,22,104,12,ES_AUTOHSCROLL - RTEXT "Data&base",IDC_STATIC,15,40,38,12,NOT WS_GROUP - EDITTEXT IDC_DATABASE,57,39,72,12,ES_AUTOHSCROLL + RTEXT "Service",IDC_STATIC,15,40,38,12,NOT WS_GROUP + EDITTEXT IDC_SERVICE,57,39,72,12,ES_AUTOHSCROLL + RTEXT "Data&base",IDC_STATIC,15,54,38,12,NOT WS_GROUP + EDITTEXT IDC_DATABASE,57,53,72,12,ES_AUTOHSCROLL RTEXT "SS&L Mode",IDC_STATIC,143,40,45,12,NOT WS_GROUP COMBOBOX IDC_SSLMODE,192,36,104,50,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CTEXT "Couldn't load libpq - SSL mode is unavailable", - IDC_NOTICE_USER,53,87,200,11,SS_NOTIFY | SS_CENTERIMAGE | + IDC_NOTICE_USER,53,100,200,11,SS_NOTIFY | SS_CENTERIMAGE | WS_BORDER - RTEXT "&Server",IDC_STATIC,24,55,29,12,NOT WS_GROUP - EDITTEXT IDC_SERVER,57,54,72,12,ES_AUTOHSCROLL - RTEXT "&Port",IDC_STATIC,166,56,22,12 - EDITTEXT IDC_PORT,192,54,37,12,ES_AUTOHSCROLL - RTEXT "&User Name",IDC_STATIC,14,70,39,12 - EDITTEXT IDC_USER,57,69,72,12,ES_AUTOHSCROLL - RTEXT "Pass&word",IDC_STATIC,154,72,34,9 - EDITTEXT IDC_PASSWORD,192,70,72,12,ES_PASSWORD | ES_AUTOHSCROLL + RTEXT "&Server",IDC_STATIC,24,68,29,12,NOT WS_GROUP + EDITTEXT IDC_SERVER,57,67,72,12,ES_AUTOHSCROLL + RTEXT "&Port",IDC_STATIC,166,53,22,12 + EDITTEXT IDC_PORT,192,51,37,12,ES_AUTOHSCROLL + RTEXT "&User Name",IDC_STATIC,14,83,39,12 + EDITTEXT IDC_USER,57,82,72,12,ES_AUTOHSCROLL + RTEXT "Pass&word",IDC_STATIC,154,84,34,9 + EDITTEXT IDC_PASSWORD,192,82,72,12,ES_PASSWORD | ES_AUTOHSCROLL // DEFPUSHBUTTON "OK",IDOK,12,114,44,15,WS_GROUP // PUSHBUTTON "Cancel",IDCANCEL,66,114,44,15 // GROUPBOX "Options",IDC_OPTIONS,121,101,177,35,BS_LEFT @@ -511,14 +513,14 @@ BEGIN DRV_MSG_LABEL,12,5,249,10 // PUSHBUTTON "Manage DSN",IDC_MANAGEDSN,240,115,52,14 - GROUPBOX "Options",IDC_OPTIONS,5,100,177,35,BS_LEFT - PUSHBUTTON "Datasource",IDC_DATASOURCE,12,114,50,14 - PUSHBUTTON "Global",IDC_DRIVER,67,114,50,14 - PUSHBUTTON "Manage DSN",IDC_MANAGEDSN,122,114,52,14 + GROUPBOX "Options",IDC_OPTIONS,5,113,177,35,BS_LEFT + PUSHBUTTON "Datasource",IDC_DATASOURCE,12,127,50,14 + PUSHBUTTON "Global",IDC_DRIVER,67,127,50,14 + PUSHBUTTON "Manage DSN",IDC_MANAGEDSN,122,127,52,14 - PUSHBUTTON "Test",IDC_TEST,254,103,44,15 - DEFPUSHBUTTON "OK",IDOK,203,121,44,15,WS_GROUP - PUSHBUTTON "Cancel",IDCANCEL,254,121,44,15 + PUSHBUTTON "Test",IDC_TEST,254,116,44,15 + DEFPUSHBUTTON "OK",IDOK,203,134,44,15,WS_GROUP + PUSHBUTTON "Cancel",IDCANCEL,254,134,44,15 END #undef MISC_Y diff --git a/resource.h b/resource.h index fb3e9a6..953eb0d 100644 --- a/resource.h +++ b/resource.h @@ -22,6 +22,7 @@ #define IDC_DSNAME 400 #define IDC_DSNAMETEXT 401 #define IDC_DESC 404 +#define IDC_SERVICE 405 #define IDC_SERVER 407 #define IDC_DATABASE 408 #define IDC_SSLMODE 409 -- 2.14.3