Re: [HACKERS] [GENERAL] Notify argument?

2002-04-15 Thread Bruce Momjian


Fix applied.

---

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
 
 charrelname[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

---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]



Re: [HACKERS] [GENERAL] Notify argument?

2002-04-14 Thread Bruce Momjian


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
 
 charrelname[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 -   1.118
--- src/interfaces/libpq/fe-exec.c  15 Apr 2002 00:15:29 -
***
*** 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 -   1.83
--- src/interfaces/libpq/libpq-fe.h 15 Apr 2002 00:15:40 -
***
*** 105,112 
   */
  typedef struct pgNotify
  {
!   charrelname[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]



Re: [HACKERS] [GENERAL] Notify argument?

2002-03-20 Thread Bruce Momjian

Neil Conway wrote:
 On Wed, Mar 20, 2002 at 04:10:14PM -0500, 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.
 
 Sounds good. If we're making other backwards-incompatible changes to
 pgNotify, one thing that bugs me about the API is the use of relname
 to refer to name of the NOTIFY/LISTEN condition. This is incorrect
 because the name of a condition is _not_ the name of a relation -- there
 is no necessary correspondence between these. The names of NOTIFY
 conditions are arbitrary, and chosen by the application developer.
 
 The same terminology is used in the backend NOTIFY/LISTEN code (e.g.
 pg_listener), but the major source of incompatibility will be the change
 to libpq. Would it be a good idea to rename relname to something more
 sensible?

Renaming the column would make an API change.  I was talking only about
requiring a recompile.

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

---(end of broadcast)---
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly



Re: [HACKERS] [GENERAL] Notify argument?

2002-03-20 Thread Tom Lane

[EMAIL PROTECTED] (Neil Conway) writes:
 If we're going to change the structure anyway, let's fix it to be
 independent of NAMEDATALEN.

 Sounds good. If we're making other backwards-incompatible changes to
 pgNotify, one thing that bugs me about the API is the use of relname
 to refer to name of the NOTIFY/LISTEN condition.

I hear you ... but my proposal only requires a recompile, *not* any
source code changes.  Renaming the field would break client source code.
I doubt it's worth that.

regards, tom lane

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])



Re: [HACKERS] [GENERAL] Notify argument?

2002-03-20 Thread Neil Conway

On Thu, 2002-03-21 at 00:16, Tom Lane wrote:
 [EMAIL PROTECTED] (Neil Conway) writes:
  If we're going to change the structure anyway, let's fix it to be
  independent of NAMEDATALEN.
 
  Sounds good. If we're making other backwards-incompatible changes to
  pgNotify, one thing that bugs me about the API is the use of relname
  to refer to name of the NOTIFY/LISTEN condition.
 
 I hear you ... but my proposal only requires a recompile, *not* any
 source code changes.  Renaming the field would break client source code.
 I doubt it's worth that.

Okay, that's fair -- I'll leave it as it is.

Cheers,

Neil

-- 
Neil Conway [EMAIL PROTECTED]
PGP Key ID: DB3C29FC


---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html



Re: [HACKERS] [GENERAL] Notify argument?

2002-03-20 Thread Tom Lane

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

charrelname[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

---(end of broadcast)---
TIP 4: Don't 'kill -9' the postmaster