I installed postgres 7.1 with --enable-odbc. I then installed
authorBruce Momjian
Tue, 12 Jun 2001 15:14:47 +0000 (15:14 +0000)
committerBruce Momjian
Tue, 12 Jun 2001 15:14:47 +0000 (15:14 +0000)
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 '' 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 .  The command fails
to connect to the database and just exits.

Dave Bodenstab

src/interfaces/odbc/gpps.c

index 93acebe1d557b9289cfc43097f3f57a2acef34ff..ec5ada6507833e5f28482035b61338cb8f15e3a2 100644 (file)
@@ -37,6 +37,7 @@
 #include 
 #include "misc.h"
 #include "gpps.h"
+#include "dlg_specific.h"
 
 #ifndef TRUE
 #define TRUE   ((BOOL)1)
 #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);