Re: Win32 fix for pg_dumpall - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: Win32 fix for pg_dumpall
Date
Msg-id 200408160126.i7G1QKX09226@candle.pha.pa.us
Whole thread Raw
In response to Re: Win32 fix for pg_dumpall  (Andrew Dunstan <andrew@dunslane.net>)
Responses Re: Win32 fix for pg_dumpall
List pgsql-patches
OK, I have cleaned up this code and clarified the comment.  Attached and
applied.


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

Andrew Dunstan wrote:
>
>
> Bruce Momjian wrote:
>
> >
> >              /*
> >+              *    Sometime the child returns "\r\n", which doesn't match
> >+              *    our version string.  The backend uses
> >+              *    setvbuf(stdout, NULL, _IONBF, 0), but pg_dump doesn't
> >+              *    so we have to fix it here.
> >+              */
> >+             if (strlen(line) >= 2 &&
> >+                 line[strlen(line)-2] == '\r' &&
> >+                 line[strlen(line)-1] == '\n')
> >+             {
> >+                 line[strlen(line)-2] == '\n';
> >+                 line[strlen(line)-1] == '\0';
> >+             }
> >+
> >+             /*
> >
> >
> >
>
> I do not see how the comment relates at all to the code following it -
> buffer mode and line end mode are two different things. Also, the
> repeated calls to strlen(line) are horribly inefficient - it should be
> called once and stashed in an int (I once made an order of magnitude
> speedup in a program by correcting a piece of someone else's code that
> looked like this: for (i = 0; i <= strlen(s); i++) where s was an
> invariant very long string)
>
> cheers
>
> andrew
>
> ---------------------------(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: src/port/exec.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/port/exec.c,v
retrieving revision 1.21
diff -c -c -r1.21 exec.c
*** src/port/exec.c    9 Aug 2004 20:20:46 -0000    1.21
--- src/port/exec.c    16 Aug 2004 01:24:38 -0000
***************
*** 381,406 ****
          {
              /* So we read some data */
              retval = line;

              /*
!              *    Sometime the child returns "\r\n", which doesn't match
!              *    our version string.  The backend uses
!              *    setvbuf(stdout, NULL, _IONBF, 0), but pg_dump doesn't
!              *    so we have to fix it here.
               */
!             if (strlen(line) >= 2 &&
!                 line[strlen(line)-2] == '\r' &&
!                 line[strlen(line)-1] == '\n')
              {
!                 line[strlen(line)-2] = '\n';
!                 line[strlen(line)-1] = '\0';
              }

              /*
               *    We emulate fgets() behaviour. So if there is no newline
               *    at the end, we add one...
               */
!             if (line[strlen(line)-1] != '\n')
                  strcat(line,"\n");
          }

--- 381,408 ----
          {
              /* So we read some data */
              retval = line;
+             int len = strlen(line);

              /*
!              *    If EOL is \r\n, convert to just \n.
!              *    Because stdout is a text-mode stream, the \n output by
!              *    the child process is received as \r\n, so we convert it
!              *    to \n.  The server main.c sets
!              *    setvbuf(stdout, NULL, _IONBF, 0) which has the effect
!              *    of disabling \n to \r\n expansion for stdout.
               */
!             if (len >= 2 && line[len-2] == '\r' && line[len-1] == '\n')
              {
!                 line[len-2] = '\n';
!                 line[len-1] = '\0';
!                 len--;
              }

              /*
               *    We emulate fgets() behaviour. So if there is no newline
               *    at the end, we add one...
               */
!             if (line[len-1] != '\n')
                  strcat(line,"\n");
          }


pgsql-patches by date:

Previous
From: Philip Warner
Date:
Subject: Re: [HACKERS] pg_dump 'die_on_errors'
Next
From: Bruce Momjian
Date:
Subject: Re: Postgresql.conf Documentation change