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: