]> granicus.if.org Git - postgresql/commitdiff
someone added pg_listen and pg_notifies to libpgtcl. But first
authorMarc G. Fournier <scrappy@hub.org>
Fri, 3 Jan 1997 18:48:31 +0000 (18:48 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Fri, 3 Jan 1997 18:48:31 +0000 (18:48 +0000)
    these routines try to use the old pointer casting stuff to get
    the connection id, second the notification hash table should
    be part of the cliendData. Otherwise, one interpreter might
    eat up the notifies for another one.

    Please apply the patch below to the current 6.0 tree.

Submitted by: wieck@sapserv.debis.de

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

index cc77d7e6857ce230c5c50a5cc6086f1af8383d9f..8df0c42105c8c51e77c8e31fe6f3dac0783f5665 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtcl.c,v 1.6 1996/12/19 05:02:47 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtcl.c,v 1.7 1997/01/03 18:48:28 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -49,6 +49,7 @@ Pgtcl_AtExit (ClientData cData)
 
   Tcl_DeleteHashTable(&(cd->dbh_hash));
   Tcl_DeleteHashTable(&(cd->res_hash));
+  Tcl_DeleteHashTable(&(cd->notify_hash));
 
   Tcl_DeleteExitHandler(Pgtcl_AtExit, cData);
 }
@@ -71,6 +72,7 @@ Pgtcl_Init (Tcl_Interp *interp)
   cd = (Pg_clientData *)ckalloc(sizeof(Pg_clientData));
   Tcl_InitHashTable(&(cd->dbh_hash), TCL_STRING_KEYS);
   Tcl_InitHashTable(&(cd->res_hash), TCL_STRING_KEYS);
+  Tcl_InitHashTable(&(cd->notify_hash), TCL_STRING_KEYS);
   cd->dbh_count = 0L;
   cd->res_count = 0L;
 
@@ -162,12 +164,12 @@ Pgtcl_Init (Tcl_Interp *interp)
   Tcl_CreateCommand(interp,
                    "pg_listen",
                    Pg_listen,
-                   (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL);
+                   (ClientData)cd, (Tcl_CmdDeleteProc*)NULL);
 
   Tcl_CreateCommand(interp,
                    "pg_notifies",
                    Pg_notifies,
-                   (ClientData)NULL, (Tcl_CmdDeleteProc*)NULL);
+                   (ClientData)cd, (Tcl_CmdDeleteProc*)NULL);
 
   Tcl_PkgProvide(interp, "Pgtcl", "1.0");
 
index 65839b18b2cab1953aee41168b9d0a1a0c243ec6..1b1356627d39a2a964ce21847962eb4db257161b 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.8 1996/12/19 05:02:49 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/interfaces/libpgtcl/Attic/pgtclCmds.c,v 1.9 1997/01/03 18:48:30 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -24,8 +24,6 @@
 #include "pgtclCmds.h"
 #include "pgtclId.h"
 
-static Tcl_HashTable notifyTable = { NULL };
-
 #ifdef TCL_ARRAYS
 #define ISOCTAL(c)     (((c) >= '0') && ((c) <= '7'))
 #define DIGIT(c)       ((c) - '0')
@@ -1215,6 +1213,7 @@ Pg_select(ClientData cData, Tcl_Interp *interp, int argc, char **argv)
 int
 Pg_listen(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
 {
+    Pg_clientData *cd = (Pg_clientData *)cData;
     int new;
     char *relname;
     char *callback = NULL;
@@ -1228,22 +1227,15 @@ Pg_listen(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
        return TCL_ERROR;
     }
 
-    /*
-     * Initialize the notify hash table if not already done.
-     */
-    if (notifyTable.buckets == NULL) {
-       Tcl_InitHashTable(&notifyTable, TCL_STRING_KEYS);
-    }
-
     /*
      * Get the command arguments. Note that relname will copied by
      * Tcl_CreateHashEntry while callback must be allocated.
      */
-    if (!PgValidId(argv[1])) {
-       Tcl_AppendResult(interp, "not a valid connection\n", 0);
+    conn = (PGconn*)PgGetConnectionId(cd, argv[1]);
+    if (conn == (PGconn *)NULL) {
+       Tcl_AppendResult(interp, "First argument is not a valid connection\n", 0);
        return TCL_ERROR;
     }
-    conn = (PGconn*)PgGetId(argv[1]);
     relname = argv[2];
     if ((argc > 3) && *argv[3]) {
        callback = (char *) ckalloc((unsigned) (strlen(argv[3])+1));
@@ -1254,7 +1246,7 @@ Pg_listen(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
      * Set or update a callback for a relation;
      */
     if (callback) {
-       entry = Tcl_CreateHashEntry(&notifyTable, relname, &new);
+       entry = Tcl_CreateHashEntry(&(cd->notify_hash), relname, &new);
        if (new) {
            /* New callback, execute a listen command on the relation */
            char *cmd = (char *) ckalloc((unsigned) (strlen(argv[2])+8));
@@ -1284,7 +1276,7 @@ Pg_listen(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
      * the notify hash table.
      */
     if (callback == NULL) {
-       entry = Tcl_FindHashEntry(&notifyTable, relname);
+       entry = Tcl_FindHashEntry(&(cd->notify_hash), relname);
        if (entry == NULL) {
            Tcl_AppendResult(interp, "not listening on ", relname, 0);
            return TCL_ERROR;
@@ -1296,11 +1288,12 @@ Pg_listen(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
     return TCL_OK;
 }
 
+int
 Pg_notifies(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
 {
+    Pg_clientData *cd = (Pg_clientData *)cData;
     int count;
     char buff[12];
-    char *relname;
     char *callback;
     Tcl_HashEntry *entry;
     PGconn *conn;
@@ -1313,21 +1306,14 @@ Pg_notifies(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
        return TCL_ERROR;
     }
 
-    /*
-     * Initialize the notify hash table if not already done.
-     */
-    if (notifyTable.buckets == NULL) {
-       Tcl_InitHashTable(&notifyTable, TCL_STRING_KEYS);
-    }
-
     /*
      * Get the connection argument.
      */
-    if (!PgValidId(argv[1])) {
-       Tcl_AppendResult(interp, "not a valid connection\n", 0);
+    conn = (PGconn*)PgGetConnectionId(cd, argv[1]);
+    if (conn == (PGconn *)NULL) {
+       Tcl_AppendResult(interp, "First argument is not a valid connection\n", 0);
        return TCL_ERROR;
     }
-    conn = (PGconn*)PgGetId(argv[1]);
 
     /* Execute an empty command to retrieve asynchronous notifications */
     result = PQexec(conn, " ");
@@ -1347,7 +1333,7 @@ Pg_notifies(ClientData cData, Tcl_Interp *interp, int argc, char* argv[])
        if (notify == NULL) {
            break;
        }
-       entry = Tcl_FindHashEntry(&notifyTable, notify->relname);
+       entry = Tcl_FindHashEntry(&(cd->notify_hash), notify->relname);
        if (entry != NULL) {
            callback = Tcl_GetHashValue(entry);
            if (callback) {
index 78c4e1d770f1f5824dbc1529413e06ecdce66ff7..de69ad2e14c00d38cb5101e19f062fb20680a0c9 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pgtclCmds.h,v 1.5 1996/12/19 05:02:51 scrappy Exp $
+ * $Id: pgtclCmds.h,v 1.6 1997/01/03 18:48:31 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -21,6 +21,7 @@
 typedef struct Pg_clientData_s {
     Tcl_HashTable      dbh_hash;
     Tcl_HashTable      res_hash;
+    Tcl_HashTable      notify_hash;
     long               dbh_count;
     long               res_count;
 } Pg_clientData;