Re: Re: Is it possible to set psql connection parameters before an ODBC connection?
От | Lindsay Stevens |
---|---|
Тема | Re: Re: Is it possible to set psql connection parameters before an ODBC connection? |
Дата | |
Msg-id | CAG2CW_Ld-=0rf4YXjAdxsczFbV4ddte1hYRn3VaVta7KhH+csg@mail.gmail.com обсуждение исходный текст |
Ответ на | Is it possible to set psql connection parameters before an ODBC connection? (Lindsay Stevens <lindsay.stevens.au@gmail.com>) |
Ответы |
Re: Re: Is it possible to set psql connection parameters
before an ODBC connection?
|
Список | pgsql-odbc |
The named service must match a service definition in a service file. The service file can be located in the default location (~/.pg_service.conf or %user%/AppData/postgresql) or in a location specified in a PGSERVICEFILE environment variable. As mentioned below, the service file allows specifying parameters like hostaddr, krbsrvname, sslcert (and others) for a connection.
Since there's no libpq servicefile parameter, I had a go at setting the service file for the libpq connection using a DSN servicefile keyword and _putenv, but that didn't seem to work, and I thought it would be better not to mess around with overriding user environment variables.
Also I haven't yet got my head around the ODBC manager dialog box stuff yet but this works just fine when specifying the parameter in a FileDSN or ODBC connection string. I also had trouble getting the installer to build - the light.exe step always failed for no apparent reason.
*** start patch ***
diff --git a/connection.c b/connection.c
index 131a0e7..63af8ca 100644
--- a/connection.c
+++ b/connection.c
@@ -312,6 +312,7 @@ CC_copy_conninfo(ConnInfo *ci, const ConnInfo *sci)
NAME_TO_NAME(ci->password, sci->password);
CORR_STRCPY(port);
CORR_STRCPY(sslmode);
+ CORR_STRCPY(service);
CORR_STRCPY(onlyread);
CORR_STRCPY(fake_oid_index);
CORR_STRCPY(show_oid_column);
@@ -2510,6 +2511,10 @@ LIBPQ_connect(ConnectionClass *self)
opts[cnt] = "sslmode";
vals[cnt++] = ci->sslmode;
}
+ if (ci->service[0])
+ {
+ opts[cnt] = "service"; vals[cnt++] = ci->service;
+ }
if (NAME_IS_VALID(ci->password))
{
opts[cnt] = "password"; vals[cnt++] = SAFE_NAME(ci->password);
diff --git a/connection.h b/connection.h
index 20d0bbb..f8aa808 100644
--- a/connection.h
+++ b/connection.h
@@ -218,6 +218,7 @@ typedef struct
pgNAME password;
char port[SMALL_REGISTRY_LEN];
char sslmode[16];
+ char service[MEDIUM_REGISTRY_LEN];
char onlyread[SMALL_REGISTRY_LEN];
char fake_oid_index[SMALL_REGISTRY_LEN];
char show_oid_column[SMALL_REGISTRY_LEN];
diff --git a/dlg_specific.c b/dlg_specific.c
index 6ab7464..cdc1a0d 100644
--- a/dlg_specific.c
+++ b/dlg_specific.c
@@ -289,6 +289,7 @@ inolog("hlen=%d", hlen);
strcpy(protocol_and, "7.4");
olen = snprintf(&connect_string[hlen], nlen, ";"
INI_SSLMODE "=%s;"
+ INI_SERVICE "=%s;"
INI_READONLY "=%s;"
INI_PROTOCOL "=%s;"
INI_FAKEOIDINDEX "=%s;"
@@ -323,6 +324,7 @@ inolog("hlen=%d", hlen);
INI_XAOPT "=%d" /* XAOPT */
#endif /* _HANDLE_ENLIST_IN_DTC_ */
,ci->sslmode
+ ,ci->service
,ci->onlyread
,protocol_and
,ci->fake_oid_index
@@ -660,6 +662,8 @@ copyAttributes(ConnInfo *ci, const char *attribute, const char *value)
break;
}
}
+ else if (stricmp(attribute, INI_SERVICE) == 0 || stricmp(attribute, ABBR_SERVICE) == 0)
+ strcpy(ci->service, value);
else if (stricmp(attribute, INI_ABBREVIATE) == 0)
unfoldCXAttribute(ci, value);
#ifdef _HANDLE_ENLIST_IN_DTC_
@@ -1000,6 +1004,9 @@ getDSNinfo(ConnInfo *ci, char overwrite)
if (ci->sslmode[0] == '\0' || overwrite)
SQLGetPrivateProfileString(DSN, INI_SSLMODE, "", ci->sslmode, sizeof(ci->sslmode), ODBC_INI);
+ if (ci->service[0] == '\0' || overwrite)
+ SQLGetPrivateProfileString(DSN, INI_SERVICE, "", ci->service, sizeof(ci->service), ODBC_INI);
+
#ifdef _HANDLE_ENLIST_IN_DTC_
if (ci->xa_opt < 0 || overwrite)
{
@@ -1270,6 +1277,10 @@ writeDSNinfo(const ConnInfo *ci)
INI_SSLMODE,
ci->sslmode,
ODBC_INI);
+ SQLWritePrivateProfileString(DSN,
+ INI_SERVICE,
+ ci->service,
+ ODBC_INI);
sprintf(temp, "%d", ci->keepalive_idle);
SQLWritePrivateProfileString(DSN,
INI_KEEPALIVETIME,
diff --git a/dlg_specific.h b/dlg_specific.h
index 30ea389..ceb3bea 100644
--- a/dlg_specific.h
+++ b/dlg_specific.h
@@ -157,6 +157,8 @@ extern "C" {
#define ABBR_LOWERCASEIDENTIFIER "C9"
#define INI_SSLMODE "SSLmode"
#define ABBR_SSLMODE "CA"
+#define INI_SERVICE "service"
+#define ABBR_SERVICE "SE"
#define INI_EXTRAOPTIONS "AB"
#define INI_LOGDIR "Logdir"
#define INI_GSSAUTHUSEGSSAPI "GssAuthUseGSS"
Thanks, I tried this but couldn't seem to get it to work, e.g. ConnSettings=/*krbsrvname=myvalue*/, or placing the comment in braces, or putting myvalue in quotes, or making the whole comment url encoded.
I haven't written a line of C before but I had a read of the source anyway and it seems that most of the DSN values get put in a ConnInfo object in dlg_specific which is passed in to libpq PQconnectdb. So it might just be a matter of adding "service" and/or the relevant keywords to the conninfo object. It also seems that there is no servicefile keyword, unfortunately. I'll have a go at this and see if it works, I think it would be a useful feature.
I'm using pg 9.3.5 and the latest odbc driver, by the way.
On 20/03/2015 4:17 AM, "Jacobo" <jsanchez@denodo.com> wrote:I was currently digging into the code to find a way to specify krbsrvname and
just found that before reading the PGKRBSRVNAME environment variable it
calls a function in order to find the krbsrvname.
Checking the implementation i realized that in order to read this parameter
from Connect Settings at this level they should be added inside a comment.
To verify this i have configured a DSN with Connect Settings
/*krbsrvname=myvalue*/ and from the logs it seems to be using this value.
I don't know for the rest of parameters but this may also work for them.
Hope this helps
Regards,
Jacobo
--
View this message in context: http://postgresql.nabble.com/Is-it-possible-to-set-psql-connection-parameters-before-an-ODBC-connection-tp5842291p5842571.html
Sent from the PostgreSQL - odbc mailing list archive at Nabble.com.
--
Sent via pgsql-odbc mailing list (pgsql-odbc@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-odbc
Вложения
В списке pgsql-odbc по дате отправления:
Предыдущее
От: Kadri RaudseppДата:
Сообщение: Re: Problem with client_encoding and PsqlODBC driver.