diff options
author | Bruce Momjian <bruce@momjian.us> | 2001-06-12 15:14:47 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 2001-06-12 15:14:47 +0000 |
commit | 13a52c1f0345c1b86b2bf43d766851a6ab852934 (patch) | |
tree | 5188e9c6770c85983088d9dc4bb6ce0440ff9c25 | |
parent | 55abc36e151f1b0b897cd6ad757059ac4c8cb798 (diff) | |
download | postgresql-13a52c1f0345c1b86b2bf43d766851a6ab852934.tar.gz postgresql-13a52c1f0345c1b86b2bf43d766851a6ab852934.zip |
I installed postgres 7.1 with --enable-odbc. I then installed
tclodbc (http://sourceforge.net/projects/tclodbc) and libiodbc-2.50.3
(http://www.iodbc.org/dist/libiodbc-2.50.3.tar.gz). I could not
get either to work... postgres would not find the global odbcinst.ini
file. I traced this to src/interfaces/odbc/gpps.c -- here are the
many things I think are wrong:
Run tclodbc and do a ``database db <DSNname>'' where ``DSNname'' is
one of the DSN's in /usr/local/etc/odbcinst.ini (or wherever the
global ini file is installed.) The result is always the error
message that ``one of server,port,database,etc. are missing''.
Run libiodbc-2.50.3/samples/odbctest <DSNname>. The command fails
to connect to the database and just exits.
Dave Bodenstab
-rw-r--r-- | src/interfaces/odbc/gpps.c | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/src/interfaces/odbc/gpps.c b/src/interfaces/odbc/gpps.c index 93acebe1d55..ec5ada65078 100644 --- a/src/interfaces/odbc/gpps.c +++ b/src/interfaces/odbc/gpps.c @@ -37,6 +37,7 @@ #include <string.h> #include "misc.h" #include "gpps.h" +#include "dlg_specific.h" #ifndef TRUE #define TRUE ((BOOL)1) @@ -46,6 +47,12 @@ #endif +/* + * theIniFileName is searched for in: + * $HOME/theIniFileName + * theIniFileName + * ODBCINST_INI + */ DWORD GetPrivateProfileString(char *theSection, /* section name */ char *theKey, /* search key name */ @@ -70,46 +77,38 @@ GetPrivateProfileString(char *theSection, /* section name */ size_t aReturnLength = 0; BOOL aSectionFound = FALSE; BOOL aKeyFound = FALSE; - int j = 0; + size_t aReturnLength = 0; + BOOL aSectionFound = FALSE; + BOOL aKeyFound = FALSE; - j = strlen(theIniFileName) + 1; ptr = (char *) getpwuid(getuid()); /* get user info */ - if (ptr == NULL) - { - if (MAXPGPATH - 1 < j) - theIniFileName[MAXPGPATH - 1] = '\0'; - - sprintf(buf, "%s", theIniFileName); - } - ptr = ((struct passwd *) ptr)->pw_dir; /* get user home dir */ - if (ptr == NULL || *ptr == '\0') + if (ptr == NULL || (((struct passwd *) ptr)->pw_dir) == NULL || *(((struct passwd *) ptr)->pw_dir) == '\0') ptr = "/home"; + else + ptr = ((struct passwd *) ptr)->pw_dir; /* get user home dir */ /* - * This doesn't make it so we find an ini file but allows normal - * processing to continue further on down. The likelihood is that the - * file won't be found and thus the default value will be returned. + * If it can't be opened because the paths are too long, then + * skip it, don't just truncate the path string... The truncated path + * might accidently be an existing file. The default value will be + * returned instead. */ - if (MAXPGPATH - 1 < strlen(ptr) + j) + if (MAXPGPATH - 1 >= strlen(ptr) + 1 + strlen(theIniFileName)) { - if (MAXPGPATH - 1 < strlen(ptr)) - ptr[MAXPGPATH - 1] = '\0'; - else - theIniFileName[MAXPGPATH - 1 - strlen(ptr)] = '\0'; + sprintf(buf, "%s/%s", ptr, theIniFileName); + aFile = (FILE *) fopen(buf, PG_BINARY_R); } - sprintf(buf, "%s/%s", ptr, theIniFileName); - /* * This code makes it so that a file in the users home dir overrides a * the "default" file as passed in */ - aFile = (FILE *) (buf ? fopen(buf, PG_BINARY_R) : NULL); if (!aFile) { - sprintf(buf, "%s", theIniFileName); - aFile = (FILE *) (buf ? fopen(buf, PG_BINARY_R) : NULL); + aFile = (FILE *) fopen(theIniFileName, PG_BINARY_R); + if (!aFile) + aFile = (FILE *) fopen(ODBCINST_INI, PG_BINARY_R); } aLength = (theDefault == NULL) ? 0 : strlen(theDefault); |