libpgtcl for tcl >= 8.0 (Unix & Windows)

From: Mikhail Terekhov <terekhov(at)emc(dot)com>
To: pgsql-patches(at)postgresql(dot)org
Subject: libpgtcl for tcl >= 8.0 (Unix & Windows)
Date: 2001-08-10 22:52:24
Message-ID: 3B7465A8.111207EA@emc.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

Responses

Browse pgsql-patches by date

  From Date Subject
Next Message Ian Lance Taylor 2001-08-11 01:05:30 Select parser at runtime
Previous Message Tom Lane 2001-08-10 22:24:42 Re: Support building in a different directory on Solaris