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 <[EMAIL PROTECTED]> 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
[EMAIL PROTECTED] | (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;
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]