libpgtcl for tcl >= 8.0 (Unix & Windows) - Mailing list pgsql-patches

From Mikhail Terekhov
Subject libpgtcl for tcl >= 8.0 (Unix & Windows)
Date
Msg-id 3B7465A8.111207EA@emc.com
Whole thread Raw
List pgsql-patches
Hi,

I've re-implemented notify messages handling in libpgtcl for
Tcl versions >= 8.0. It works now on Windows (using VC 6.0).
Below is the patch against REL7_1_STABLE. I've tested it on
Windows NT (VC6.0), Linux (SuSE 7.1) and Solaris 2.6 using
Tcl 8.3.3. If there is an interest I can export a makefile for
building libpgtcl.dll on Windows.

Regards,
Mikhail Terekhov


Index: libpgtcl/pgtclCmds.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpgtcl/pgtclCmds.h,v
retrieving revision 1.21
diff -c -r1.21 pgtclCmds.h
*** libpgtcl/pgtclCmds.h    2001/03/22 04:01:24    1.21
--- libpgtcl/pgtclCmds.h    2001/08/10 22:26:40
***************
*** 64,70 ****
--- 64,74 ----

      Pg_TclNotifies *notify_list;/* head of list of notify info */
      int            notifier_running;        /* notify event source is live */
+ #if TCL_MAJOR_VERSION >= 8
+     Tcl_Channel notifier_channel;/* Tcl_Channel on which notifier is listening */
+ #else
      int            notifier_socket;/* PQsocket on which notifier is listening */
+ #endif
  }            Pg_ConnectionId;

  /* Values of res_copyStatus */
Index: libpgtcl/pgtclId.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpgtcl/pgtclId.c,v
retrieving revision 1.25
diff -c -r1.25 pgtclId.c
*** libpgtcl/pgtclId.c    2001/02/10 02:31:29    1.25
--- libpgtcl/pgtclId.c    2001/08/10 22:26:41
***************
*** 174,183 ****
          connid->results[i] = NULL;
      connid->notify_list = NULL;
      connid->notifier_running = 0;
-     connid->notifier_socket = -1;

      sprintf(connid->id, "pgsql%d", PQsocket(conn));

  #if TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION == 5
      /* Original signature (only seen in Tcl 7.5) */
      conn_chan = Tcl_CreateChannel(&Pg_ConnType, connid->id, NULL, NULL, (ClientData) connid);
--- 174,188 ----
          connid->results[i] = NULL;
      connid->notify_list = NULL;
      connid->notifier_running = 0;

      sprintf(connid->id, "pgsql%d", PQsocket(conn));

+ #if TCL_MAJOR_VERSION >= 8
+     connid->notifier_channel = Tcl_MakeTcpClientChannel((ClientData) PQsocket(conn));
+ #else
+     connid->notifier_socket = -1;
+ #endif
+
  #if TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION == 5
      /* Original signature (only seen in Tcl 7.5) */
      conn_chan = Tcl_CreateChannel(&Pg_ConnType, connid->id, NULL, NULL, (ClientData) connid);
***************
*** 581,587 ****
          event->info = *notify;
          event->connid = connid;
          Tcl_QueueEvent((Tcl_Event *) event, TCL_QUEUE_TAIL);
!         free(notify);
      }

      /*
--- 586,592 ----
          event->info = *notify;
          event->connid = connid;
          Tcl_QueueEvent((Tcl_Event *) event, TCL_QUEUE_TAIL);
!         PQfreeNotify(notify);
      }

      /*
***************
*** 688,705 ****
          if (pqsock >= 0)
          {
  #if TCL_MAJOR_VERSION >= 8
!             /* In Tcl 8, Tcl_CreateFileHandler takes a socket directly. */
!             Tcl_CreateFileHandler(pqsock, TCL_READABLE,
!                              Pg_Notify_FileHandler, (ClientData) connid);
  #else
              /* In Tcl 7.5 and 7.6, we need to gin up a Tcl_File. */
              Tcl_File    tclfile = Tcl_GetFile((ClientData) pqsock, TCL_UNIX_FD);

              Tcl_CreateFileHandler(tclfile, TCL_READABLE,
                               Pg_Notify_FileHandler, (ClientData) connid);
  #endif
              connid->notifier_running = 1;
-             connid->notifier_socket = pqsock;
          }
      }
  }
--- 693,709 ----
          if (pqsock >= 0)
          {
  #if TCL_MAJOR_VERSION >= 8
!             Tcl_CreateChannelHandler(connid->notifier_channel, TCL_READABLE,
!                             Pg_Notify_FileHandler, (ClientData) connid);
  #else
              /* In Tcl 7.5 and 7.6, we need to gin up a Tcl_File. */
              Tcl_File    tclfile = Tcl_GetFile((ClientData) pqsock, TCL_UNIX_FD);

              Tcl_CreateFileHandler(tclfile, TCL_READABLE,
                               Pg_Notify_FileHandler, (ClientData) connid);
+             connid->notifier_socket = pqsock;
  #endif
              connid->notifier_running = 1;
          }
      }
  }
***************
*** 711,718 ****
      if (connid->notifier_running)
      {
  #if TCL_MAJOR_VERSION >= 8
!         /* In Tcl 8, Tcl_DeleteFileHandler takes a socket directly. */
!         Tcl_DeleteFileHandler(connid->notifier_socket);
  #else
          /* In Tcl 7.5 and 7.6, we need to gin up a Tcl_File. */
          Tcl_File    tclfile = Tcl_GetFile((ClientData) connid->notifier_socket,
--- 715,722 ----
      if (connid->notifier_running)
      {
  #if TCL_MAJOR_VERSION >= 8
!         Tcl_DeleteChannelHandler(connid->notifier_channel,
!                                 Pg_Notify_FileHandler, (ClientData) connid);
  #else
          /* In Tcl 7.5 and 7.6, we need to gin up a Tcl_File. */
          Tcl_File    tclfile = Tcl_GetFile((ClientData) connid->notifier_socket,
Index: libpq/fe-exec.c
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v
retrieving revision 1.101
diff -c -r1.101 fe-exec.c
*** libpq/fe-exec.c    2001/02/10 02:31:30    1.101
--- libpq/fe-exec.c    2001/08/10 22:26:41
***************
*** 1349,1354 ****
--- 1349,1370 ----
  }

  /*
+  * PQfreeNotify - free's the memory associated with a PGnotify
+  *
+  * This function is needed on Windows when building libpq.dll and
+  * for example libpgtcl.dll: All memory allocated inside a dll
+  * should be freed in the context of the same dll.
+  *
+  */
+
+ void
+ PQfreeNotify(PGnotify *notify)
+ {
+     if (notify)
+         free(notify);
+ }
+
+ /*
   * PQgetline - gets a newline-terminated string from the backend.
   *
   * Chiefly here so that applications can use "COPY <rel> to stdout"
Index: libpq/libpq-fe.h
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/libpq-fe.h,v
retrieving revision 1.71
diff -c -r1.71 libpq-fe.h
*** libpq/libpq-fe.h    2001/03/22 04:01:27    1.71
--- libpq/libpq-fe.h    2001/08/10 22:26:41
***************
*** 243,248 ****
--- 243,249 ----
      /* Simple synchronous query */
      extern PGresult *PQexec(PGconn *conn, const char *query);
      extern PGnotify *PQnotifies(PGconn *conn);
+     extern void      PQfreeNotify(PGnotify *notify);

      /* Interface for multiple-result or asynchronous queries */
      extern int    PQsendQuery(PGconn *conn, const char *query);
Index: libpq/libpqdll.def
===================================================================
RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/libpqdll.def,v
retrieving revision 1.12
diff -c -r1.12 libpqdll.def
*** libpq/libpqdll.def    2000/11/28 07:27:01    1.12
--- libpq/libpqdll.def    2001/08/10 22:26:41
***************
*** 79,81 ****
--- 79,82 ----
      destroyPQExpBuffer    @ 76
      createPQExpBuffer    @ 77
      PQconninfoFree        @ 78
+     PQfreeNotify        @ 79

pgsql-patches by date:

Previous
From: Barry Lind
Date:
Subject: Re: patch for JDBC PreparedStatement
Next
From: Mikhail Terekhov
Date:
Subject: Re: libpgtcl for tcl >= 8.0 (Unix & Windows)