Re: Unix domain socket - Mailing list pgsql-odbc

From Ramon Danieli
Subject Re: Unix domain socket
Date
Msg-id 1109667659.42242f4bb5c42@webmail2.tau.ac.il
Whole thread Raw
In response to Re: Unix domain socket  (Peter Eisentraut <peter_e@gmx.net>)
Responses Re: Unix domain socket
List pgsql-odbc
Quoting Peter Eisentraut <peter_e@gmx.net>:

> Dave Page wrote:
> > Hmm, did even realise it had crept in there. Well to enable it you
> > will need to define the HAVE_UNIX_SOCKETS macro when you compile.
> > Does it then work? As for why it's done the way it is, I have no idea
> > - it was committed by Hiroshi Inoue, so he'd need to answer that -
> > unfortunately though, he no longer works on psqlODBC.
>
> HAVE_UNIX_SOCKETS is defined in the server source tree, so I guess this
> could be a leftover from those days.  Turn on the macro and see if you
> get it working.
>
> --

The macro is turned on automatically (RHL 4.0AS, gcc version 3.4.2 20041017 (Red
Hat 3.4.2-6.fc3)) and it works.

The following patch allow users to configure the Unix domain socket path,
using the "Uds" property.
I took some code from the unixODBC PG driver and performed the necessary
adjustments.
Please note that unlike unixODBC, I have followed the current convention, which
means that:
1) "Uds" is considered only if "Servername" is empty.
2) Default path is "/tmp".
3) The provided path should point the folder that comtains the UDS node.

Please let me know if you find anything wrong in this patch and whether it will
be included sometimes in the near future.

Thanks,
Ramon


diff -Naur psqlodbc-08.00.0004/connection.c
psqlodbc-08.00.0004.patch/connection.c
--- psqlodbc-08.00.0004/connection.c    2005-01-28 23:36:14.000000000 +0200
+++ psqlodbc-08.00.0004.patch/connection.c    2005-02-27 14:40:34.430232000 +0200
@@ -725,7 +725,16 @@
             return 0;
         }

-        mylog("CC_connect(): DSN = '%s', server = '%s', port = '%s', database = '%s',
username = '%s', password='%s'\n", ci->dsn, ci->server, ci->port, ci->database,
ci->username, ci->password ? "xxxxx" : "");
+        mylog("CC_connect(): DSN = '%s', server = '%s', port = '%s',"
+#ifdef HAVE_UNIX_SOCKETS
+              " uds = '%s',"
+#endif
+              " database = '%s', username = '%s',"
+              " password='%s'\n", ci->dsn, ci->server, ci->port,
+#ifdef HAVE_UNIX_SOCKETS
+              ci->uds,
+#endif
+              ci->database, ci->username, ci->password ? "xxxxx" : "");

 another_version_retry:

@@ -747,7 +756,11 @@

         mylog("connecting to the server socket...\n");

-        SOCK_connect_to(sock, (short) atoi(ci->port), ci->server);
+        SOCK_connect_to(sock, (short) atoi(ci->port), ci->server
+#ifdef HAVE_UNIX_SOCKETS
+                , ci->uds
+#endif
+                );
         if (SOCK_get_errcode(sock) != 0)
         {
             mylog("connection to the server socket failed.\n");
diff -Naur psqlodbc-08.00.0004/connection.h
psqlodbc-08.00.0004.patch/connection.h
--- psqlodbc-08.00.0004/connection.h    2005-01-28 23:36:14.000000000 +0200
+++ psqlodbc-08.00.0004.patch/connection.h    2005-02-27 16:04:37.469858000 +0200
@@ -19,6 +19,10 @@
 #include <pthread.h>
 #endif

+#if !defined WIN32 && defined HAVE_SYS_UN_H && !defined HAVE_UNIX_SOCKETS
+#define HAVE_UNIX_SOCKETS
+#endif
+
 typedef enum
 {
     CONN_NOT_CONNECTED,            /* Connection has not been established */
@@ -239,6 +243,9 @@
     char        conn_settings[LARGE_REGISTRY_LEN];
     char        protocol[SMALL_REGISTRY_LEN];
     char        port[SMALL_REGISTRY_LEN];
+#ifdef HAVE_UNIX_SOCKETS
+    char        uds[LARGE_REGISTRY_LEN];
+#endif
     char        onlyread[SMALL_REGISTRY_LEN];
     char        fake_oid_index[SMALL_REGISTRY_LEN];
     char        show_oid_column[SMALL_REGISTRY_LEN];
diff -Naur psqlodbc-08.00.0004/dlg_specific.c
psqlodbc-08.00.0004.patch/dlg_specific.c
--- psqlodbc-08.00.0004/dlg_specific.c    2005-01-28 23:36:15.000000000 +0200
+++ psqlodbc-08.00.0004.patch/dlg_specific.c    2005-02-27 16:03:10.559495000
+0200
@@ -286,6 +286,11 @@
     else if (stricmp(attribute, INI_PORT) == 0)
         strcpy(ci->port, value);

+#ifdef HAVE_UNIX_SOCKETS
+    else if (stricmp(attribute, INI_UDS) == 0)
+        strcpy(ci->uds, value);
+#endif
+
     else if (stricmp(attribute, INI_READONLY) == 0 || stricmp(attribute, "A0") ==
0)
         strcpy(ci->onlyread, value);

@@ -492,6 +497,11 @@
     if (ci->port[0] == '\0' || overwrite)
         SQLGetPrivateProfileString(DSN, INI_PORT, "", ci->port, sizeof(ci->port),
ODBC_INI);

+#ifdef HAVE_UNIX_SOCKETS
+    if (ci->uds[0] == '\0' || overwrite)
+        SQLGetPrivateProfileString(DSN, INI_UDS, "", ci->uds, sizeof(ci->uds),
ODBC_INI);
+#endif
+
     if (ci->onlyread[0] == '\0' || overwrite)
         SQLGetPrivateProfileString(DSN, INI_READONLY, "", ci->onlyread,
sizeof(ci->onlyread), ODBC_INI);

@@ -725,6 +735,13 @@
                                  ci->port,
                                  ODBC_INI);

+#ifdef HAVE_UNIX_SOCKETS
+    SQLWritePrivateProfileString(DSN,
+                                 INI_UDS,
+                                 ci->uds,
+                                 ODBC_INI);
+#endif
+
     SQLWritePrivateProfileString(DSN,
                                  INI_USER,
                                  ci->username,
diff -Naur psqlodbc-08.00.0004/dlg_specific.h
psqlodbc-08.00.0004.patch/dlg_specific.h
--- psqlodbc-08.00.0004/dlg_specific.h    2005-01-28 23:36:15.000000000 +0200
+++ psqlodbc-08.00.0004.patch/dlg_specific.h    2005-02-27 14:10:03.393190000
+0200
@@ -38,6 +38,14 @@
 #define INI_KDESC            "Description"    /* Data source description */
 #define INI_SERVER            "Servername"    /* Name of Server running PostgreSQL */
 #define INI_PORT            "Port"        /* Port on which the Postmaster is listening */
+
+#if !defined WIN32 && defined HAVE_SYS_UN_H
+#ifndef HAVE_UNIX_SOCKETS
+#define HAVE_UNIX_SOCKETS
+#endif
+#define INI_UDS                "Uds"        /* Unix domain socket path*/
+#endif
+
 #define INI_DATABASE            "Database"    /* Database Name */
 #define INI_USER            "Username"    /* Default User Name */
 #define INI_PASSWORD            "Password"    /* Default Password */
diff -Naur psqlodbc-08.00.0004/socket.c psqlodbc-08.00.0004.patch/socket.c
--- psqlodbc-08.00.0004/socket.c    2005-01-28 23:36:20.000000000 +0200
+++ psqlodbc-08.00.0004.patch/socket.c    2005-02-27 16:20:34.993553000 +0200
@@ -109,7 +109,11 @@


 char
-SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname)
+SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname
+#ifdef HAVE_UNIX_SOCKETS
+        , char *uds /* unix domain socket path */
+#endif
+        )
 {
 #if defined (POSIX_MULTITHREAD_SUPPORT)
     const int bufsz = 8192;
@@ -140,7 +144,7 @@


     /*
-     * If it is a valid IP address, use it. Otherwise use hostname lookup.
+     * If it is a valid IP address, use it. Otherwise use AF_UNIX socket.
      */
     if (hostname && hostname[0])
     {
@@ -196,7 +200,7 @@
         }
         un->sun_family = family = AF_UNIX;
         /* passing NULL means that this only suports the pg default "/tmp" */
-        UNIXSOCK_PATH(un, port, ((char *) NULL));
+        UNIXSOCK_PATH(un, port, uds);
         sLen = UNIXSOCK_LEN(un);
         self->sadr = (struct sockaddr *) un;
     }
diff -Naur psqlodbc-08.00.0004/socket.h psqlodbc-08.00.0004.patch/socket.h
--- psqlodbc-08.00.0004/socket.h    2005-01-28 23:36:20.000000000 +0200
+++ psqlodbc-08.00.0004.patch/socket.h    2005-02-27 16:18:22.733047000 +0200
@@ -34,7 +34,7 @@

 #define SOCK_ERRNO    errno
 #define SOCK_ERRNO_SET(e)    (errno = e)
-#ifdef    HAVE_SYS_UN_H
+#if defined HAVE_SYS_UN_H && !defined HAVE_UNIX_SOCKETS
 #define HAVE_UNIX_SOCKETS
 #endif /* HAVE_SYS_UN_H */
 #else
@@ -121,7 +121,12 @@
 /* Socket prototypes */
 SocketClass *SOCK_Constructor(const ConnectionClass *conn);
 void        SOCK_Destructor(SocketClass *self);
-char        SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname);
+char        SOCK_connect_to(SocketClass *self, unsigned short port,
+                char *hostname
+#ifdef HAVE_UNIX_SOCKETS
+                , char *uds
+#endif
+                );
 void        SOCK_get_n_char(SocketClass *self, char *buffer, int len);
 void        SOCK_put_n_char(SocketClass *self, char *buffer, int len);
 BOOL        SOCK_get_string(SocketClass *self, char *buffer, int bufsize);


----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.


pgsql-odbc by date:

Previous
From: Janet Borschowa
Date:
Subject: Re: (Fwd) SQLSetPos problem under Linux
Next
From: "Philippe Lang"
Date:
Subject: Re: New snapshot - 08.00.0005