libpgtcl.dll
Hi,
Below is the patch against current cvs for libpgtcl and
two additional files win32.mak and libpgtcl.def.
This patch allows to compile libpgtcl.dll on Windows
with tcl > 8.0. I've tested it on WinNT (VC6.0), SUSE Linux (7.0)
and Solaris 2.6 with tcl 8.3.3.
Regards,
Mikhail Terekhov
Your patch has been added to the PostgreSQL unapplied patches list at:
http://candle.pha.pa.us/cgi-bin/pgpatches
I will try to apply it within the next 48 hours.
Hi,
Below is the patch against current cvs for libpgtcl and
two additional files win32.mak and libpgtcl.def.
This patch allows to compile libpgtcl.dll on Windows
with tcl > 8.0. I've tested it on WinNT (VC6.0), SUSE Linux (7.0)
and Solaris 2.6 with tcl 8.3.3.Regards,
Mikhail Terekhov
Index: libpgtcl/pgtclCmds.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpgtcl/pgtclCmds.c,v retrieving revision 1.56 diff -C3 -r1.56 pgtclCmds.c *** libpgtcl/pgtclCmds.c 2001/08/10 22:50:10 1.56 --- libpgtcl/pgtclCmds.c 2001/08/24 16:05:01 *************** *** 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); + #endifreturn Tcl_UnregisterChannel(interp, conn_chan); } Index: libpgtcl/pgtclCmds.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpgtcl/pgtclCmds.h,v retrieving revision 1.21 diff -C3 -r1.21 pgtclCmds.h *** libpgtcl/pgtclCmds.h 2001/03/22 04:01:24 1.21 --- libpgtcl/pgtclCmds.h 2001/08/24 16:05:01 *************** *** 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 -C3 -r1.25 pgtclId.c *** libpgtcl/pgtclId.c 2001/02/10 02:31:29 1.25 --- libpgtcl/pgtclId.c 2001/08/24 16:05:01 *************** *** 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, Index: libpq/fe-exec.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v retrieving revision 1.108 diff -C3 -r1.108 fe-exec.c *** libpq/fe-exec.c 2001/08/21 20:39:53 1.108 --- libpq/fe-exec.c 2001/08/24 16:05:01 *************** *** 1346,1351 **** --- 1346,1365 ---- }/* + * 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" Index: libpq/libpq-fe.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/libpq-fe.h,v retrieving revision 1.72 diff -C3 -r1.72 libpq-fe.h *** libpq/libpq-fe.h 2001/08/21 20:39:54 1.72 --- libpq/libpq-fe.h 2001/08/24 16:05:01 *************** *** 254,259 **** --- 254,260 ---- /* 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.13 diff -C3 -r1.13 libpqdll.def *** libpq/libpqdll.def 2001/06/07 00:10:18 1.13 --- libpq/libpqdll.def 2001/08/24 16:05:01 *************** *** 87,90 **** PQresetStart @ 84 PQsetClientEncoding @ 85 PQsetnonblocking @ 86 ! --- 87,90 ---- PQresetStart @ 84 PQsetClientEncoding @ 85 PQsetnonblocking @ 86 ! PQfreeNotify @ 87
;libpgtcl.def
; The LIBRARY entry must be same as the name of your DLL, the name of
; our DLL is libpgtcl.dll
LIBRARY libpgtcl
EXPORTSPgtcl_Init
Pgtcl_SafeInit
# 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
!ENDIFCPP=cl.exe
MTL=midl.exe
RSC=rc.exeTCLBASE=\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 MacrosALL : "$(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.lib uuid.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 MacrosALL : "$(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.lib oleaut32.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
---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
Patch applied. Thanks.
Hi,
Below is the patch against current cvs for libpgtcl and
two additional files win32.mak and libpgtcl.def.
This patch allows to compile libpgtcl.dll on Windows
with tcl > 8.0. I've tested it on WinNT (VC6.0), SUSE Linux (7.0)
and Solaris 2.6 with tcl 8.3.3.Regards,
Mikhail Terekhov
Index: libpgtcl/pgtclCmds.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpgtcl/pgtclCmds.c,v retrieving revision 1.56 diff -C3 -r1.56 pgtclCmds.c *** libpgtcl/pgtclCmds.c 2001/08/10 22:50:10 1.56 --- libpgtcl/pgtclCmds.c 2001/08/24 16:05:01 *************** *** 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); + #endifreturn Tcl_UnregisterChannel(interp, conn_chan); } Index: libpgtcl/pgtclCmds.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpgtcl/pgtclCmds.h,v retrieving revision 1.21 diff -C3 -r1.21 pgtclCmds.h *** libpgtcl/pgtclCmds.h 2001/03/22 04:01:24 1.21 --- libpgtcl/pgtclCmds.h 2001/08/24 16:05:01 *************** *** 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 -C3 -r1.25 pgtclId.c *** libpgtcl/pgtclId.c 2001/02/10 02:31:29 1.25 --- libpgtcl/pgtclId.c 2001/08/24 16:05:01 *************** *** 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, Index: libpq/fe-exec.c =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v retrieving revision 1.108 diff -C3 -r1.108 fe-exec.c *** libpq/fe-exec.c 2001/08/21 20:39:53 1.108 --- libpq/fe-exec.c 2001/08/24 16:05:01 *************** *** 1346,1351 **** --- 1346,1365 ---- }/* + * 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" Index: libpq/libpq-fe.h =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/src/interfaces/libpq/libpq-fe.h,v retrieving revision 1.72 diff -C3 -r1.72 libpq-fe.h *** libpq/libpq-fe.h 2001/08/21 20:39:54 1.72 --- libpq/libpq-fe.h 2001/08/24 16:05:01 *************** *** 254,259 **** --- 254,260 ---- /* 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.13 diff -C3 -r1.13 libpqdll.def *** libpq/libpqdll.def 2001/06/07 00:10:18 1.13 --- libpq/libpqdll.def 2001/08/24 16:05:01 *************** *** 87,90 **** PQresetStart @ 84 PQsetClientEncoding @ 85 PQsetnonblocking @ 86 ! --- 87,90 ---- PQresetStart @ 84 PQsetClientEncoding @ 85 PQsetnonblocking @ 86 ! PQfreeNotify @ 87
;libpgtcl.def
; The LIBRARY entry must be same as the name of your DLL, the name of
; our DLL is libpgtcl.dll
LIBRARY libpgtcl
EXPORTSPgtcl_Init
Pgtcl_SafeInit
# 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
!ENDIFCPP=cl.exe
MTL=midl.exe
RSC=rc.exeTCLBASE=\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 MacrosALL : "$(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.lib uuid.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 MacrosALL : "$(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.lib oleaut32.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
---------------------------(end of broadcast)---------------------------
TIP 5: Have you checked our extensive FAQ?
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
Bruce Momjian wrote:
Patch applied. Thanks.
Hi,
The win32.mak and libpgtcl.def files had been lost (patch doesn't handle
new files). I'm attaching those two files below.
Regards
Mikhail Terekhov
Attachments:
Sorry, I had them in the wrong directory. Fixed now.
Bruce Momjian wrote:
Patch applied. Thanks.
Hi,
The win32.mak and libpgtcl.def files had been lost (patch doesn't handle
new files). I'm attaching those two files below.Regards
Mikhail Terekhov
[ application/x-zip-compressed is not supported, skipping... ]
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026