Re: PQescapeBytea on Win32 - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: PQescapeBytea on Win32
Date
Msg-id 200303250246.h2P2kIE25463@candle.pha.pa.us
Whole thread Raw
In response to Re: PQescapeBytea on Win32  (Peter Eisentraut <peter_e@gmx.net>)
List pgsql-hackers
OK, patch applied to document PQfreemem() for notify.

PQfreeNotify wasn't even documented, but I kept it in for binary
compatibility, and added a #define to map it to PQfreemem().

I updated various interfaces to use PQfreemem() rather than free().

---------------------------------------------------------------------------

Peter Eisentraut wrote:
> Bruce Momjian writes:
>
> > The problem with that is the new versions are still going to reference
> > PQfreeNotify, and then we still can't remove it. I think we need the
> > macro for PQfreeNotify pointing to PQfreemem, but keep the PQfreeNotify
> > function around for a release or two, then remove it, and remove all
> > documentation about it in 7.4.
>
> Too complicated.  Just implement PQfreemem independently and tell people
> to use it.  Please don't remove documentation just because a feature is
> deprecated.  How are people supposed to do the conversion if they can't
> find information about what they are supposed to convert from?
>
> --
> Peter Eisentraut   peter_e@gmx.net
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: doc/src/sgml/libpq.sgml
===================================================================
RCS file: /cvsroot/pgsql-server/doc/src/sgml/libpq.sgml,v
retrieving revision 1.115
diff -c -c -r1.115 libpq.sgml
*** doc/src/sgml/libpq.sgml    24 Mar 2003 18:33:52 -0000    1.115
--- doc/src/sgml/libpq.sgml    25 Mar 2003 02:40:07 -0000
***************
*** 1049,1056 ****
  <function>PQescapeString</> performs this operation.
  </para>
  <para>
! The
! parameter <parameter>from</> points to the first character of the string that
  is to be escaped, and the <parameter>length</> parameter counts the
  number of characters in this string.  (A terminating zero byte is
  neither necessary nor counted.)  <parameter>to</> shall point to a
--- 1049,1055 ----
  <function>PQescapeString</> performs this operation.
  </para>
  <para>
! The parameter <parameter>from</> points to the first character of the string that
  is to be escaped, and the <parameter>length</> parameter counts the
  number of characters in this string.  (A terminating zero byte is
  neither necessary nor counted.)  <parameter>to</> shall point to a
***************
*** 1117,1123 ****

    <para>
     <function>PQescapeBytea</> returns an escaped version of the
!    <parameter>from</parameter> parameter binary string in memory allocated with <function>malloc()</>.
     The return string has all special characters replaced
     so that they can be properly processed by the PostgreSQL string literal
     parser, and the <type>bytea</type> input function. A terminating zero
--- 1116,1124 ----

    <para>
     <function>PQescapeBytea</> returns an escaped version of the
!    <parameter>from</parameter> parameter binary string in memory
!    allocated with <function>malloc()</>, and must be freed using
!    <function>PQfreemem()</>.
     The return string has all special characters replaced
     so that they can be properly processed by the PostgreSQL string literal
     parser, and the <type>bytea</type> input function. A terminating zero
***************
*** 1143,1150 ****
     such as might be returned by <function>PQgetvalue</function> when applied to a
     <type>bytea</type> column. <function>PQunescapeBytea</function> converts
     this string representation into its binary representation.
!    It returns a pointer to a buffer allocated with <function>malloc()</function>, or null on error, and puts the size
!    of the buffer in <parameter>to_length</parameter>.
    </para>
    </listitem>
    </varlistentry>
--- 1144,1154 ----
     such as might be returned by <function>PQgetvalue</function> when applied to a
     <type>bytea</type> column. <function>PQunescapeBytea</function> converts
     this string representation into its binary representation.
!    It returns a pointer to a buffer allocated with
!    <function>malloc()</function>, or null on error, and puts the size of
!    the buffer in <parameter>to_length</parameter>. The memory must be
!    freed using <function>PQfreemem()</>.
!
    </para>
    </listitem>
    </varlistentry>
***************
*** 1161,1167 ****

  <para>
     Frees memory allocated by <application>libpq</>, particularly
!    <function>PQescapeBytea</function> and <function>PQunescapeBytea</function>.
     It is needed by Win32, which can not free memory across
     DLL's, unless multithreaded DLL's (/MD in VC6) are used.
    </para>
--- 1165,1173 ----

  <para>
     Frees memory allocated by <application>libpq</>, particularly
!    <function>PQescapeBytea</function>,
!    <function>PQunescapeBytea</function>,
!    and <function>PQnotifies</function>.
     It is needed by Win32, which can not free memory across
     DLL's, unless multithreaded DLL's (/MD in VC6) are used.
    </para>
***************
*** 1926,1932 ****
  } PGnotify;
  </synopsis>
  After processing a <structname>PGnotify</structname> object returned by <function>PQnotifies</function>,
! be sure to free it with <function>free()</function> to avoid a memory leak.
  </para>

  <note>
--- 1932,1938 ----
  } PGnotify;
  </synopsis>
  After processing a <structname>PGnotify</structname> object returned by <function>PQnotifies</function>,
! be sure to free it with <function>PQfreemem()</function>.
  </para>

  <note>
***************
*** 2867,2873 ****
              fprintf(stderr,
                   "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
                      notify->relname, notify->be_pid);
!             free(notify);
          }
      }

--- 2873,2879 ----
              fprintf(stderr,
                   "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
                      notify->relname, notify->be_pid);
!             PQfreemem(notify);
          }
      }

Index: src/bin/psql/common.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/common.c,v
retrieving revision 1.61
diff -c -c -r1.61 common.c
*** src/bin/psql/common.c    20 Mar 2003 15:39:52 -0000    1.61
--- src/bin/psql/common.c    25 Mar 2003 02:40:08 -0000
***************
*** 441,447 ****
      {
          fprintf(pset.queryFout, gettext("Asynchronous NOTIFY '%s' from backend with pid %d received.\n"),
                  notify->relname, notify->be_pid);
!         free(notify);
          fflush(pset.queryFout);
      }
  }
--- 441,447 ----
      {
          fprintf(pset.queryFout, gettext("Asynchronous NOTIFY '%s' from backend with pid %d received.\n"),
                  notify->relname, notify->be_pid);
!         PQfreemem(notify);
          fflush(pset.queryFout);
      }
  }
Index: src/interfaces/ecpg/ecpglib/execute.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/ecpg/ecpglib/execute.c,v
retrieving revision 1.4
diff -c -c -r1.4 execute.c
*** src/interfaces/ecpg/ecpglib/execute.c    20 Mar 2003 15:56:50 -0000    1.4
--- src/interfaces/ecpg/ecpglib/execute.c    25 Mar 2003 02:40:10 -0000
***************
*** 1197,1203 ****
      {
          ECPGlog("ECPGexecute line %d: ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
                  stmt->lineno, notify->relname, notify->be_pid);
!         ECPGfree(notify);
      }

      return status;
--- 1197,1203 ----
      {
          ECPGlog("ECPGexecute line %d: ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
                  stmt->lineno, notify->relname, notify->be_pid);
!         PQfreemem(notify);
      }

      return status;
Index: src/interfaces/libpgtcl/pgtclId.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpgtcl/pgtclId.c,v
retrieving revision 1.40
diff -c -c -r1.40 pgtclId.c
*** src/interfaces/libpgtcl/pgtclId.c    1 Feb 2003 00:22:12 -0000    1.40
--- src/interfaces/libpgtcl/pgtclId.c    25 Mar 2003 02:40:11 -0000
***************
*** 554,560 ****
      if (event->connid == NULL)
      {
          if (event->notify)
!             PQfreeNotify(event->notify);
          return 1;
      }

--- 554,560 ----
      if (event->connid == NULL)
      {
          if (event->notify)
!             PQfreemem(event->notify);
          return 1;
      }

***************
*** 634,640 ****
      Tcl_Release((ClientData) event->connid);

      if (event->notify)
!         PQfreeNotify(event->notify);

      return 1;
  }
--- 634,640 ----
      Tcl_Release((ClientData) event->connid);

      if (event->notify)
!         PQfreemem(event->notify);

      return 1;
  }
Index: src/interfaces/libpq/fe-exec.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-exec.c,v
retrieving revision 1.127
diff -c -c -r1.127 fe-exec.c
*** src/interfaces/libpq/fe-exec.c    22 Mar 2003 03:29:06 -0000    1.127
--- src/interfaces/libpq/fe-exec.c    25 Mar 2003 02:40:15 -0000
***************
*** 1578,1597 ****
  }

  /*
-  * 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"
--- 1578,1583 ----
***************
*** 2470,2472 ****
--- 2456,2477 ----
  {
      return pqSendSome(conn);
  }
+
+ /*
+  * PQfreeNotify - free's the memory associated with a PGnotify
+  *
+  * This function is here only for binary backward compatibility.
+  * New code should use PQfreemem().  A macro will automatically map
+  * calls to PQfreemem.  It should be removed in the future.  bjm 2003-03-24
+  */
+
+ #undef PQfreeNotify
+ void PQfreeNotify(PGnotify *notify);
+
+ void
+ PQfreeNotify(PGnotify *notify)
+ {
+     PQfreemem(notify);
+ }
+
+
Index: src/interfaces/libpq/libpq-fe.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/libpq-fe.h,v
retrieving revision 1.90
diff -c -c -r1.90 libpq-fe.h
*** src/interfaces/libpq/libpq-fe.h    22 Mar 2003 03:29:06 -0000    1.90
--- src/interfaces/libpq/libpq-fe.h    25 Mar 2003 02:40:16 -0000
***************
*** 260,266 ****
  /* 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);
--- 260,267 ----
  /* Simple synchronous query */
  extern PGresult *PQexec(PGconn *conn, const char *query);
  extern PGnotify *PQnotifies(PGconn *conn);
! /* Exists for backward compatibility.  bjm 2003-03-24 */
! #define PQfreeNotify(ptr) PQfreemem(ptr)

  /* Interface for multiple-result or asynchronous queries */
  extern int    PQsendQuery(PGconn *conn, const char *query);
Index: src/interfaces/python/pgmodule.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/python/pgmodule.c,v
retrieving revision 1.44
diff -c -c -r1.44 pgmodule.c
*** src/interfaces/python/pgmodule.c    10 Mar 2003 22:28:22 -0000    1.44
--- src/interfaces/python/pgmodule.c    25 Mar 2003 02:40:18 -0000
***************
*** 2066,2072 ****
          }

          PyTuple_SET_ITEM(notify_result, 1, temp);
!         free(notify);
      }
      else
      {
--- 2066,2072 ----
          }

          PyTuple_SET_ITEM(notify_result, 1, temp);
!         PQfreemem(notify);
      }
      else
      {
Index: src/test/examples/testlibpq2.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/test/examples/testlibpq2.c,v
retrieving revision 1.7
diff -c -c -r1.7 testlibpq2.c
*** src/test/examples/testlibpq2.c    7 Feb 1999 22:08:54 -0000    1.7
--- src/test/examples/testlibpq2.c    25 Mar 2003 02:40:18 -0000
***************
*** 98,104 ****
              fprintf(stderr,
                   "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
                      notify->relname, notify->be_pid);
!             free(notify);
              break;
          }
          PQclear(res);
--- 98,104 ----
              fprintf(stderr,
                   "ASYNC NOTIFY of '%s' from backend pid '%d' received\n",
                      notify->relname, notify->be_pid);
!             PQfreemem(notify);
              break;
          }
          PQclear(res);

pgsql-hackers by date:

Previous
From: "Christopher Kings-Lynne"
Date:
Subject: Re: DEFAULT in
Next
From: Hiroshi Inoue
Date:
Subject: Re: updateable cursors & visibility