libpgtcl.dll - Mailing list pgsql-patches

From Mikhail Terekhov
Subject libpgtcl.dll
Date
Msg-id 3B86BCC0.3FB5A596@emc.com
Whole thread Raw
Responses Re: libpgtcl.dll
Re: libpgtcl.dll
List pgsql-patches
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 TerekhovIndex: 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);
+ #endif

      return 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
EXPORTS

       Pgtcl_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
!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


pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] Re: nocreatetable for 7.1.2 [patch]
Next
From: Bruce Momjian
Date:
Subject: Re: MD5 removal of int64 code