diff -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.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 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.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 + 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 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