Re: [GENERAL] Notify argument? - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: [GENERAL] Notify argument?
Date
Msg-id 200204150024.g3F0OU327803@candle.pha.pa.us
Whole thread Raw
In response to Re: [GENERAL] Notify argument?  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Here is a patch that implements Tom's suggestion of mallocing the
relation name string as part of PQnotify and not depending on
NAMEDATALEN.  Nice trick.

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

Tom Lane wrote:
> Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > The breakage will come when we lengthen NAMEDATALEN, which I plan to
> > tackle for 7.3.  We will need to re-order the NOTIFY structure and put
> > the NAMEDATALEN string at the end of the struct so differing namedatalen
> > backend/clients will work.  If you want to break it, 7.3 would probably
> > be the time to do it.  :-)  Users will need a recompile pre-7.3 to use
> > notify for 7.3 and later anyway.
>
> If we're going to change the structure anyway, let's fix it to be
> independent of NAMEDATALEN.  Instead of
>
>     char        relname[NAMEDATALEN];
>     int         be_pid;
>
> let's do
>
>     char       *relname;
>     int         be_pid;
>
> This should require no source-level changes in calling C code, thanks
> to C's equivalence between pointers and arrays.  We can preserve the
> fact that freeing a PQnotifies result takes only one free() with a
> little hacking to make the string be allocated in the same malloc call:
>
>     newNotify = (PGnotify *) malloc(sizeof(PGnotify) + strlen(str) + 1);
>     newNotify->relname = (char *) newNotify + sizeof(PGnotify);
>     strcpy(newNotify->relname, str);
>
> Thus, with one line of extra ugliness inside the library, we solve the
> problem permanently.
>
>             regards, tom lane
>

--
  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
Index: src/interfaces/libpq/fe-exec.c
===================================================================
RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v
retrieving revision 1.118
diff -c -r1.118 fe-exec.c
*** src/interfaces/libpq/fe-exec.c    8 Apr 2002 03:48:10 -0000    1.118
--- src/interfaces/libpq/fe-exec.c    15 Apr 2002 00:15:29 -0000
***************
*** 1510,1517 ****
          return EOF;
      if (pqGets(&conn->workBuffer, conn))
          return EOF;
!     newNotify = (PGnotify *) malloc(sizeof(PGnotify));
!     strncpy(newNotify->relname, conn->workBuffer.data, NAMEDATALEN);
      newNotify->be_pid = be_pid;
      DLAddTail(conn->notifyList, DLNewElem(newNotify));
      return 0;
--- 1510,1525 ----
          return EOF;
      if (pqGets(&conn->workBuffer, conn))
          return EOF;
!
!     /*
!      * Store the relation name right after the PQnotify structure so it can
!      * all be freed at once.  We don't use NAMEDATALEN because we don't
!      * want to tie this interface to a specific server name length.
!      */
!     newNotify = (PGnotify *) malloc(sizeof(PGnotify) +
!                 strlen(conn->workBuffer.data) + 1);
!     newNotify->relname = (char *)newNotify + sizeof(PGnotify);
!     strcpy(newNotify->relname, conn->workBuffer.data);
      newNotify->be_pid = be_pid;
      DLAddTail(conn->notifyList, DLNewElem(newNotify));
      return 0;
Index: src/interfaces/libpq/libpq-fe.h
===================================================================
RCS file: /cvsroot/pgsql/src/interfaces/libpq/libpq-fe.h,v
retrieving revision 1.83
diff -c -r1.83 libpq-fe.h
*** src/interfaces/libpq/libpq-fe.h    5 Mar 2002 06:07:26 -0000    1.83
--- src/interfaces/libpq/libpq-fe.h    15 Apr 2002 00:15:40 -0000
***************
*** 105,112 ****
   */
  typedef struct pgNotify
  {
!     char        relname[NAMEDATALEN];    /* name of relation containing
!                                          * data */
      int            be_pid;            /* process id of backend */
  } PGnotify;

--- 105,111 ----
   */
  typedef struct pgNotify
  {
!     char        *relname;        /* name of relation containing data */
      int            be_pid;            /* process id of backend */
  } PGnotify;


pgsql-hackers by date:

Previous
From: John Gray
Date:
Subject: Re: command.c breakup
Next
From: Brian Bruns
Date:
Subject: Re: 7.3 schedule