Back out tcl patch, per Tom Lane:
authorBruce Momjian
Sun, 18 Aug 2002 01:39:43 +0000 (01:39 +0000)
committerBruce Momjian
Sun, 18 Aug 2002 01:39:43 +0000 (01:39 +0000)
Everytime if I do PQconsumeInput (when the backend channel gets
readable) I check for the return value. (0 == error) and generate a
notification manually, e.g. fixed string connection_closed) and pass it to the

src/interfaces/libpgtcl/pgtclCmds.c
src/interfaces/libpgtcl/pgtclId.c
src/interfaces/libpgtcl/pgtclId.h

index 4b047b1b6e5af6034677c917f28515c0149503b8..0cb46686dc105af349a7f1f0fef3ee3a44a08596 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.63 2002/08/17 12:19:31 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.64 2002/08/18 01:39:43 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -419,11 +419,8 @@ Pg_disconnect(ClientData cData, Tcl_Interp *interp, int argc, char *argv[])
 
 #if TCL_MAJOR_VERSION >= 8
    conn = PgGetConnectionId(interp, argv[1], &connid);
-   if (connid->notifier_channel != NULL) {
-       /* stop listening for NOTIFY events on that channel */
-       PgStopNotifyEventSource(connid,1);
+   if (connid->notifier_channel != NULL)
        Tcl_UnregisterChannel(interp, connid->notifier_channel);
-   }
 #endif
 
    return Tcl_UnregisterChannel(interp, conn_chan);
index d5474ce61c9cdee89bcff1c33a8aa5e7be5952df..3a3bee63fd8979666804a6293a9188ac4112c220 100644 (file)
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.31 2002/08/17 12:19:31 momjian Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclId.c,v 1.32 2002/08/18 01:39:43 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -277,7 +277,7 @@ PgDelConnectionId(DRIVER_DEL_PROTO)
     * Turn off the Tcl event source for this connection, and delete any
     * pending notify events.
     */
-   PgStopNotifyEventSource(connid,1);
+   PgStopNotifyEventSource(connid);
 
    /* Close the libpq connection too */
    PQfinish(connid->conn);
@@ -441,7 +441,7 @@ PgGetConnByResultId(Tcl_Interp *interp, char *resid_c)
    *mark = '.';
    if (conn_chan && Tcl_GetChannelType(conn_chan) == &Pg_ConnType)
    {
-       Tcl_SetResult(interp, (char *)Tcl_GetChannelName(conn_chan), TCL_VOLATILE);
+       Tcl_SetResult(interp, Tcl_GetChannelName(conn_chan), TCL_VOLATILE);
        return TCL_OK;
    }
 
@@ -611,9 +611,7 @@ PgNotifyTransferEvents(Pg_ConnectionId * connid)
     * closed socket descriptor.
     */
    if (PQsocket(connid->conn) < 0)
-       /* do not remove any pending events, so that the virtual notification
-         connection_closed will be processed */
-       PgStopNotifyEventSource(connid,0);
+       PgStopNotifyEventSource(connid);
 }
 
 /*
@@ -677,17 +675,7 @@ Pg_Notify_FileHandler(ClientData clientData, int mask)
     * it internally to libpq; but it will clear the read-ready
     * condition).
     */
-   if (!PQconsumeInput(connid->conn)) {
-       NotifyEvent *event = (NotifyEvent *) ckalloc(sizeof(NotifyEvent));
-       
-       PGnotify *closed = (PGnotify *) ckalloc(sizeof(PGnotify));
-       strcpy(closed->relname,"connection_closed");
-       event->header.proc = Pg_Notify_EventProc;
-       event->info= *closed;
-       event->connid = connid;
-       Tcl_QueueEvent((Tcl_Event *) event, TCL_QUEUE_TAIL);
-       ckfree((void *)closed);
-   }
+   PQconsumeInput(connid->conn);
 
    /* Transfer notify events from libpq to Tcl event queue. */
    PgNotifyTransferEvents(connid);
@@ -736,7 +724,7 @@ PgStartNotifyEventSource(Pg_ConnectionId * connid)
 }
 
 void
-PgStopNotifyEventSource(Pg_ConnectionId * connid, int remove_pending)
+PgStopNotifyEventSource(Pg_ConnectionId * connid)
 {
    /* Remove the event source */
    if (connid->notifier_running)
@@ -755,5 +743,5 @@ PgStopNotifyEventSource(Pg_ConnectionId * connid, int remove_pending)
    }
 
    /* Kill any queued Tcl events that reference this channel */
-   if (remove_pending) Tcl_DeleteEvents(NotifyEventDeleteProc, (ClientData) connid);
+   Tcl_DeleteEvents(NotifyEventDeleteProc, (ClientData) connid);
 }
index 6a918e41f8c2f3593a53f87063cc887ad934fc08..ac99b9c6e00a8619fcb0d5d00bc9cf95904caef4 100644 (file)
@@ -10,7 +10,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pgtclId.h,v 1.19 2002/08/17 12:19:31 momjian Exp $
+ * $Id: pgtclId.h,v 1.20 2002/08/18 01:39:43 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -44,7 +44,7 @@ extern PGresult *PgGetResultId(Tcl_Interp *interp, char *id);
 extern void PgDelResultId(Tcl_Interp *interp, char *id);
 extern int PgGetConnByResultId(Tcl_Interp *interp, char *resid);
 extern void PgStartNotifyEventSource(Pg_ConnectionId * connid);
-extern void PgStopNotifyEventSource(Pg_ConnectionId * connid, int remove_pend);
+extern void PgStopNotifyEventSource(Pg_ConnectionId * connid);
 extern void PgNotifyTransferEvents(Pg_ConnectionId * connid);
 extern void PgNotifyInterpDelete(ClientData clientData, Tcl_Interp *interp);