Обсуждение: libpgtcl for tcl >= 8.0 (Unix & Windows)
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
Hi,
This is the second version of my patch. It includes the win32.mak and libpgtcl.def
files for libpgtcl on windows and more accurate tcl channel hanling.
Regards,
Mikhail Terekhovdiff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/libpgtcl.def
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/libpgtcl.def
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/libpgtcl.def Wed Dec 31 19:00:00 1969
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/libpgtcl.def Tue Aug 14 14:09:46 2001
***************
*** 0 ****
--- 1,8 ----
+ ;libpgtcl.def
+ ; The LIBRARY entry must be same as the name of your DLL, the name of
+ ; our DLL is libpgtcl.dll
+ LIBRARY libpgtcl
+ EXPORTS
+
+ Pgtcl_Init
+ Pgtcl_SafeInit
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.c
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.c
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.c Wed Mar 21 23:01:23 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.c Tue Aug 14 13:02:09 2001
***************
*** 403,408 ****
--- 403,410 ----
int
Pg_disconnect(ClientData cData, Tcl_Interp *interp, int argc, char *argv[])
{
+ Pg_ConnectionId *connid;
+ PGconn *conn;
Tcl_Channel conn_chan;
if (argc != 2)
***************
*** 418,423 ****
--- 420,431 ----
Tcl_AppendResult(interp, argv[1], " is not a valid connection\n", 0);
return TCL_ERROR;
}
+
+ #if TCL_MAJOR_VERSION >= 8
+ conn = PgGetConnectionId(interp, argv[1], &connid);
+ if (connid->notifier_channel != NULL)
+ Tcl_UnregisterChannel(interp, connid->notifier_channel);
+ #endif
return Tcl_UnregisterChannel(interp, conn_chan);
}
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.h
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.h
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.h Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.h Tue Aug 14 13:02:09 2001
***************
*** 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 */
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclId.c
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclId.c
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclId.c Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclId.c Tue Aug 14 13:02:09 2001
***************
*** 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,189 ----
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));
+ Tcl_RegisterChannel(interp, connid->notifier_channel);
+ #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);
}
/*
--- 587,593 ----
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;
}
}
}
--- 694,710 ----
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,
--- 716,723 ----
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,
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/win32.mak
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/win32.mak
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/win32.mak Wed Dec 31 19:00:00 1969
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/win32.mak Tue Aug 14 14:09:46 2001
***************
*** 0 ****
--- 1,201 ----
+ # Microsoft Developer Studio Generated NMAKE File, Based on libpgtcl_REL7_1_STABLE.dsp
+ !IF "$(CFG)" == ""
+ CFG=libpgtcl - Win32 Release
+ !MESSAGE No configuration specified. Defaulting to libpgtcl - Win32 Release.
+ !ENDIF
+
+ !IF "$(CFG)" != "libpgtcl - Win32 Release" && "$(CFG)" != "libpgtcl - Win32 Debug"
+ !MESSAGE Invalid configuration "$(CFG)" specified.
+ !MESSAGE You can specify a configuration when running NMAKE
+ !MESSAGE by defining the macro CFG on the command line. For example:
+ !MESSAGE
+ !MESSAGE NMAKE /f "libpgtcl.mak" CFG="libpgtcl - Win32 Debug"
+ !MESSAGE
+ !MESSAGE Possible choices for configuration are:
+ !MESSAGE
+ !MESSAGE "libpgtcl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+ !MESSAGE "libpgtcl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+ !MESSAGE
+ !ERROR An invalid configuration is specified.
+ !ENDIF
+
+ !IF "$(OS)" == "Windows_NT"
+ NULL=
+ !ELSE
+ NULL=nul
+ !ENDIF
+
+ CPP=cl.exe
+ MTL=midl.exe
+ RSC=rc.exe
+
+ TCLBASE=\usr\local\tcltk833
+ PGINCLUDE=/I ..\..\include /I ..\libpq /I $(TCLBASE)\include
+
+ !IF "$(CFG)" == "libpgtcl - Win32 Release"
+
+ OUTDIR=.\Release
+ INTDIR=.\Release
+ # Begin Custom Macros
+ OutDir=.\Release
+ # End Custom Macros
+
+ ALL : "$(OUTDIR)\libpgtcl.dll" "$(OUTDIR)\libpgtcl.bsc"
+
+
+ CLEAN :
+ -@erase "$(INTDIR)\pgtcl.obj"
+ -@erase "$(INTDIR)\pgtcl.sbr"
+ -@erase "$(INTDIR)\pgtclCmds.obj"
+ -@erase "$(INTDIR)\pgtclCmds.sbr"
+ -@erase "$(INTDIR)\pgtclId.obj"
+ -@erase "$(INTDIR)\pgtclId.sbr"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\libpgtcl.dll"
+ -@erase "$(OUTDIR)\libpgtcl.exp"
+ -@erase "$(OUTDIR)\libpgtcl.lib"
+ -@erase "$(OUTDIR)\libpgtcl.bsc"
+
+ "$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+ CPP_PROJ=/nologo /MT /W3 /GX /O2 $(PGINCLUDE) /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"
/FR"$(INTDIR)\\"/Fp"$(INTDIR)\libpgtcl.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+ MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+ BSC32=bscmake.exe
+ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libpgtcl.bsc"
+ BSC32_SBRS= \
+ "$(INTDIR)\pgtcl.sbr" \
+ "$(INTDIR)\pgtclCmds.sbr" \
+ "$(INTDIR)\pgtclId.sbr"
+
+ "$(OUTDIR)\libpgtcl.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+ $(BSC32) @<<
+ $(BSC32_FLAGS) $(BSC32_SBRS)
+ <<
+
+ LINK32=link.exe
+ LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.libuuid.lib odbc32.lib odbccp32.lib tcl83.lib libpq.lib /nologo /dll /incremental:no
/pdb:"$(OUTDIR)\libpgtcl.pdb"/machine:I386 /def:".\libpgtcl.def" /out:"$(OUTDIR)\libpgtcl.dll"
/implib:"$(OUTDIR)\libpgtcl.lib"/libpath:"$(TCLBASE)\lib" /libpath:"..\libpq\Release"
+ DEF_FILE= \
+ ".\libpgtcl.def"
+ LINK32_OBJS= \
+ "$(INTDIR)\pgtcl.obj" \
+ "$(INTDIR)\pgtclCmds.obj" \
+ "$(INTDIR)\pgtclId.obj"
+
+ "$(OUTDIR)\libpgtcl.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+ <<
+
+ !ELSEIF "$(CFG)" == "libpgtcl - Win32 Debug"
+
+ OUTDIR=.\Debug
+ INTDIR=.\Debug
+ # Begin Custom Macros
+ OutDir=.\Debug
+ # End Custom Macros
+
+ ALL : "$(OUTDIR)\libpgtcl.dll" "$(OUTDIR)\libpgtcl.bsc"
+
+
+ CLEAN :
+ -@erase "$(INTDIR)\pgtcl.obj"
+ -@erase "$(INTDIR)\pgtcl.sbr"
+ -@erase "$(INTDIR)\pgtclCmds.obj"
+ -@erase "$(INTDIR)\pgtclCmds.sbr"
+ -@erase "$(INTDIR)\pgtclId.obj"
+ -@erase "$(INTDIR)\pgtclId.sbr"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\libpgtcl.dll"
+ -@erase "$(OUTDIR)\libpgtcl.exp"
+ -@erase "$(OUTDIR)\libpgtcl.ilk"
+ -@erase "$(OUTDIR)\libpgtcl.lib"
+ -@erase "$(OUTDIR)\libpgtcl.pdb"
+ -@erase "$(OUTDIR)\libpgtcl.bsc"
+
+ "$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+ CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od $(PGINCLUDE) /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"
/FR"$(INTDIR)\\"/Fp"$(INTDIR)\libpgtcl.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+ MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
+ BSC32=bscmake.exe
+ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libpgtcl.bsc"
+ BSC32_SBRS= \
+ "$(INTDIR)\pgtcl.sbr" \
+ "$(INTDIR)\pgtclCmds.sbr" \
+ "$(INTDIR)\pgtclId.sbr"
+
+ "$(OUTDIR)\libpgtcl.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+ $(BSC32) @<<
+ $(BSC32_FLAGS) $(BSC32_SBRS)
+ <<
+
+ LINK32=link.exe
+ LINK32_FLAGS=tcl83.lib libpq.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib
ole32.liboleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"$(OUTDIR)\libpgtcl.pdb"
/debug/machine:I386 /def:".\libpgtcl.def" /out:"$(OUTDIR)\libpgtcl.dll" /implib:"$(OUTDIR)\libpgtcl.lib" /pdbtype:sept
/libpath:"$(TCLBASE)\lib"/libpath:"..\libpq\Debug"
+ DEF_FILE= \
+ ".\libpgtcl.def"
+ LINK32_OBJS= \
+ "$(INTDIR)\pgtcl.obj" \
+ "$(INTDIR)\pgtclCmds.obj" \
+ "$(INTDIR)\pgtclId.obj"
+
+ "$(OUTDIR)\libpgtcl.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+ <<
+
+ !ENDIF
+
+ .c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ !IF "$(CFG)" == "libpgtcl - Win32 Release" || "$(CFG)" == "libpgtcl - Win32 Debug"
+ SOURCE=pgtcl.c
+
+ "$(INTDIR)\pgtcl.obj" "$(INTDIR)\pgtcl.sbr" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+ SOURCE=pgtclCmds.c
+
+ "$(INTDIR)\pgtclCmds.obj" "$(INTDIR)\pgtclCmds.sbr" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+ SOURCE=pgtclId.c
+
+ "$(INTDIR)\pgtclId.obj" "$(INTDIR)\pgtclId.sbr" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+
+ !ENDIF
+
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/fe-exec.c
work/REL7_1_STABLE/pgsql/src/interfaces/libpq/fe-exec.c
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/fe-exec.c Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpq/fe-exec.c Tue Aug 14 13:02:09 2001
***************
*** 1349,1354 ****
--- 1349,1368 ----
}
/*
+ * PQfreeNotify - free's the memory associated with a PGnotify
+ *
+ * This function is needed on Windows when using 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)
+ {
+ free(notify);
+ }
+
+ /*
* PQgetline - gets a newline-terminated string from the backend.
*
* Chiefly here so that applications can use "COPY <rel> to stdout"
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpq-fe.h
work/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpq-fe.h
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpq-fe.h Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpq-fe.h Tue Aug 14 13:02:09 2001
***************
*** 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);
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpqdll.def
work/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpqdll.def
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpqdll.def Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpqdll.def Tue Aug 14 13:02:09 2001
***************
*** 79,81 ****
--- 79,82 ----
destroyPQExpBuffer @ 76
createPQExpBuffer @ 77
PQconninfoFree @ 78
+ PQfreeNotify @ 79
Hi,
This is the second version of my patch. It includes the win32.mak and libpgtcl.def
files for libpgtcl on windows and more accurate tcl channel hanling.
Regards,
Mikhail Terekhovdiff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/libpgtcl.def
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/libpgtcl.def
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/libpgtcl.def Wed Dec 31 19:00:00 1969
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/libpgtcl.def Tue Aug 14 14:09:46 2001
***************
*** 0 ****
--- 1,8 ----
+ ;libpgtcl.def
+ ; The LIBRARY entry must be same as the name of your DLL, the name of
+ ; our DLL is libpgtcl.dll
+ LIBRARY libpgtcl
+ EXPORTS
+
+ Pgtcl_Init
+ Pgtcl_SafeInit
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.c
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.c
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.c Wed Mar 21 23:01:23 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.c Tue Aug 14 13:02:09 2001
***************
*** 403,408 ****
--- 403,410 ----
int
Pg_disconnect(ClientData cData, Tcl_Interp *interp, int argc, char *argv[])
{
+ Pg_ConnectionId *connid;
+ PGconn *conn;
Tcl_Channel conn_chan;
if (argc != 2)
***************
*** 418,423 ****
--- 420,431 ----
Tcl_AppendResult(interp, argv[1], " is not a valid connection\n", 0);
return TCL_ERROR;
}
+
+ #if TCL_MAJOR_VERSION >= 8
+ conn = PgGetConnectionId(interp, argv[1], &connid);
+ if (connid->notifier_channel != NULL)
+ Tcl_UnregisterChannel(interp, connid->notifier_channel);
+ #endif
return Tcl_UnregisterChannel(interp, conn_chan);
}
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.h
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.h
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.h Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclCmds.h Tue Aug 14 13:02:09 2001
***************
*** 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 */
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclId.c
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclId.c
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclId.c Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/pgtclId.c Tue Aug 14 13:02:09 2001
***************
*** 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,189 ----
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));
+ Tcl_RegisterChannel(interp, connid->notifier_channel);
+ #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);
}
/*
--- 587,593 ----
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;
}
}
}
--- 694,710 ----
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,
--- 716,723 ----
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,
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/win32.mak
work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/win32.mak
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/win32.mak Wed Dec 31 19:00:00 1969
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpgtcl/win32.mak Tue Aug 14 14:09:46 2001
***************
*** 0 ****
--- 1,201 ----
+ # Microsoft Developer Studio Generated NMAKE File, Based on libpgtcl_REL7_1_STABLE.dsp
+ !IF "$(CFG)" == ""
+ CFG=libpgtcl - Win32 Release
+ !MESSAGE No configuration specified. Defaulting to libpgtcl - Win32 Release.
+ !ENDIF
+
+ !IF "$(CFG)" != "libpgtcl - Win32 Release" && "$(CFG)" != "libpgtcl - Win32 Debug"
+ !MESSAGE Invalid configuration "$(CFG)" specified.
+ !MESSAGE You can specify a configuration when running NMAKE
+ !MESSAGE by defining the macro CFG on the command line. For example:
+ !MESSAGE
+ !MESSAGE NMAKE /f "libpgtcl.mak" CFG="libpgtcl - Win32 Debug"
+ !MESSAGE
+ !MESSAGE Possible choices for configuration are:
+ !MESSAGE
+ !MESSAGE "libpgtcl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+ !MESSAGE "libpgtcl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+ !MESSAGE
+ !ERROR An invalid configuration is specified.
+ !ENDIF
+
+ !IF "$(OS)" == "Windows_NT"
+ NULL=
+ !ELSE
+ NULL=nul
+ !ENDIF
+
+ CPP=cl.exe
+ MTL=midl.exe
+ RSC=rc.exe
+
+ TCLBASE=\usr\local\tcltk833
+ PGINCLUDE=/I ..\..\include /I ..\libpq /I $(TCLBASE)\include
+
+ !IF "$(CFG)" == "libpgtcl - Win32 Release"
+
+ OUTDIR=.\Release
+ INTDIR=.\Release
+ # Begin Custom Macros
+ OutDir=.\Release
+ # End Custom Macros
+
+ ALL : "$(OUTDIR)\libpgtcl.dll" "$(OUTDIR)\libpgtcl.bsc"
+
+
+ CLEAN :
+ -@erase "$(INTDIR)\pgtcl.obj"
+ -@erase "$(INTDIR)\pgtcl.sbr"
+ -@erase "$(INTDIR)\pgtclCmds.obj"
+ -@erase "$(INTDIR)\pgtclCmds.sbr"
+ -@erase "$(INTDIR)\pgtclId.obj"
+ -@erase "$(INTDIR)\pgtclId.sbr"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(OUTDIR)\libpgtcl.dll"
+ -@erase "$(OUTDIR)\libpgtcl.exp"
+ -@erase "$(OUTDIR)\libpgtcl.lib"
+ -@erase "$(OUTDIR)\libpgtcl.bsc"
+
+ "$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+ CPP_PROJ=/nologo /MT /W3 /GX /O2 $(PGINCLUDE) /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"
/FR"$(INTDIR)\\"/Fp"$(INTDIR)\libpgtcl.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c
+ MTL_PROJ=/nologo /D "NDEBUG" /mktyplib203 /win32
+ BSC32=bscmake.exe
+ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libpgtcl.bsc"
+ BSC32_SBRS= \
+ "$(INTDIR)\pgtcl.sbr" \
+ "$(INTDIR)\pgtclCmds.sbr" \
+ "$(INTDIR)\pgtclId.sbr"
+
+ "$(OUTDIR)\libpgtcl.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+ $(BSC32) @<<
+ $(BSC32_FLAGS) $(BSC32_SBRS)
+ <<
+
+ LINK32=link.exe
+ LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.libuuid.lib odbc32.lib odbccp32.lib tcl83.lib libpq.lib /nologo /dll /incremental:no
/pdb:"$(OUTDIR)\libpgtcl.pdb"/machine:I386 /def:".\libpgtcl.def" /out:"$(OUTDIR)\libpgtcl.dll"
/implib:"$(OUTDIR)\libpgtcl.lib"/libpath:"$(TCLBASE)\lib" /libpath:"..\libpq\Release"
+ DEF_FILE= \
+ ".\libpgtcl.def"
+ LINK32_OBJS= \
+ "$(INTDIR)\pgtcl.obj" \
+ "$(INTDIR)\pgtclCmds.obj" \
+ "$(INTDIR)\pgtclId.obj"
+
+ "$(OUTDIR)\libpgtcl.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+ <<
+
+ !ELSEIF "$(CFG)" == "libpgtcl - Win32 Debug"
+
+ OUTDIR=.\Debug
+ INTDIR=.\Debug
+ # Begin Custom Macros
+ OutDir=.\Debug
+ # End Custom Macros
+
+ ALL : "$(OUTDIR)\libpgtcl.dll" "$(OUTDIR)\libpgtcl.bsc"
+
+
+ CLEAN :
+ -@erase "$(INTDIR)\pgtcl.obj"
+ -@erase "$(INTDIR)\pgtcl.sbr"
+ -@erase "$(INTDIR)\pgtclCmds.obj"
+ -@erase "$(INTDIR)\pgtclCmds.sbr"
+ -@erase "$(INTDIR)\pgtclId.obj"
+ -@erase "$(INTDIR)\pgtclId.sbr"
+ -@erase "$(INTDIR)\vc60.idb"
+ -@erase "$(INTDIR)\vc60.pdb"
+ -@erase "$(OUTDIR)\libpgtcl.dll"
+ -@erase "$(OUTDIR)\libpgtcl.exp"
+ -@erase "$(OUTDIR)\libpgtcl.ilk"
+ -@erase "$(OUTDIR)\libpgtcl.lib"
+ -@erase "$(OUTDIR)\libpgtcl.pdb"
+ -@erase "$(OUTDIR)\libpgtcl.bsc"
+
+ "$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+ CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od $(PGINCLUDE) /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"
/FR"$(INTDIR)\\"/Fp"$(INTDIR)\libpgtcl.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c
+ MTL_PROJ=/nologo /D "_DEBUG" /mktyplib203 /win32
+ BSC32=bscmake.exe
+ BSC32_FLAGS=/nologo /o"$(OUTDIR)\libpgtcl.bsc"
+ BSC32_SBRS= \
+ "$(INTDIR)\pgtcl.sbr" \
+ "$(INTDIR)\pgtclCmds.sbr" \
+ "$(INTDIR)\pgtclId.sbr"
+
+ "$(OUTDIR)\libpgtcl.bsc" : "$(OUTDIR)" $(BSC32_SBRS)
+ $(BSC32) @<<
+ $(BSC32_FLAGS) $(BSC32_SBRS)
+ <<
+
+ LINK32=link.exe
+ LINK32_FLAGS=tcl83.lib libpq.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib
ole32.liboleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:yes /pdb:"$(OUTDIR)\libpgtcl.pdb"
/debug/machine:I386 /def:".\libpgtcl.def" /out:"$(OUTDIR)\libpgtcl.dll" /implib:"$(OUTDIR)\libpgtcl.lib" /pdbtype:sept
/libpath:"$(TCLBASE)\lib"/libpath:"..\libpq\Debug"
+ DEF_FILE= \
+ ".\libpgtcl.def"
+ LINK32_OBJS= \
+ "$(INTDIR)\pgtcl.obj" \
+ "$(INTDIR)\pgtclCmds.obj" \
+ "$(INTDIR)\pgtclId.obj"
+
+ "$(OUTDIR)\libpgtcl.dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+ <<
+
+ !ENDIF
+
+ .c{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .cpp{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .cxx{$(INTDIR)}.obj::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .c{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .cpp{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ .cxx{$(INTDIR)}.sbr::
+ $(CPP) @<<
+ $(CPP_PROJ) $<
+ <<
+
+ !IF "$(CFG)" == "libpgtcl - Win32 Release" || "$(CFG)" == "libpgtcl - Win32 Debug"
+ SOURCE=pgtcl.c
+
+ "$(INTDIR)\pgtcl.obj" "$(INTDIR)\pgtcl.sbr" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+ SOURCE=pgtclCmds.c
+
+ "$(INTDIR)\pgtclCmds.obj" "$(INTDIR)\pgtclCmds.sbr" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+ SOURCE=pgtclId.c
+
+ "$(INTDIR)\pgtclId.obj" "$(INTDIR)\pgtclId.sbr" : $(SOURCE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+
+ !ENDIF
+
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/fe-exec.c
work/REL7_1_STABLE/pgsql/src/interfaces/libpq/fe-exec.c
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/fe-exec.c Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpq/fe-exec.c Tue Aug 14 13:02:09 2001
***************
*** 1349,1354 ****
--- 1349,1368 ----
}
/*
+ * PQfreeNotify - free's the memory associated with a PGnotify
+ *
+ * This function is needed on Windows when using 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)
+ {
+ free(notify);
+ }
+
+ /*
* PQgetline - gets a newline-terminated string from the backend.
*
* Chiefly here so that applications can use "COPY <rel> to stdout"
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpq-fe.h
work/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpq-fe.h
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpq-fe.h Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpq-fe.h Tue Aug 14 13:02:09 2001
***************
*** 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);
diff -Nacr -x CVS cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpqdll.def
work/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpqdll.def
*** cvs/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpqdll.def Tue Aug 14 12:57:25 2001
--- work/REL7_1_STABLE/pgsql/src/interfaces/libpq/libpqdll.def Tue Aug 14 13:02:09 2001
***************
*** 79,81 ****
--- 79,82 ----
destroyPQExpBuffer @ 76
createPQExpBuffer @ 77
PQconninfoFree @ 78
+ PQfreeNotify @ 79