pq_getstring doesn't go through pq_getbyte anymore, for better performance.
authorPeter Eisentraut <peter_e@gmx.net>
Sat, 20 Apr 2002 23:35:43 +0000 (23:35 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Sat, 20 Apr 2002 23:35:43 +0000 (23:35 +0000)
src/backend/libpq/pqcomm.c

index db9e52c0c3d9b423b4b58179309bcd94c58dbcfa..a14292a6d9a60d15f3a8694fa90e49ca9905b5b4 100644 (file)
@@ -29,7 +29,7 @@
  * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pqcomm.c,v 1.130 2002/04/03 00:44:27 tgl Exp $
+ * $Id: pqcomm.c,v 1.131 2002/04/20 23:35:43 petere Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -569,20 +569,37 @@ pq_getbytes(char *s, size_t len)
 int
 pq_getstring(StringInfo s)
 {
-   int         c;
+   int         i;
 
    /* Reset string to empty */
    s->len = 0;
    s->data[0] = '\0';
 
    /* Read until we get the terminating '\0' */
-   while ((c = pq_getbyte()) != EOF && c != '\0')
-       appendStringInfoCharMacro(s, c);
+   for(;;)
+   {
+       while (PqRecvPointer >= PqRecvLength)
+       {
+           if (pq_recvbuf())       /* If nothing in buffer, then recv some */
+               return EOF;         /* Failed to recv data */
+       }
 
-   if (c == EOF)
-       return EOF;
+       for (i = PqRecvPointer; i < PqRecvLength; i++)
+           if (PqRecvBuffer[i] == '\0')
+           {
+               /* does not copy the \0 */
+               appendBinaryStringInfo(s, PqRecvBuffer + PqRecvPointer,
+                                      i - PqRecvPointer);
+               PqRecvPointer += i + 1;
+               return 0;
+           }
 
-   return 0;
+       /* If we're here we haven't got the \0 in the buffer yet. */
+
+       appendBinaryStringInfo(s, PqRecvBuffer + PqRecvPointer,
+                              PqRecvLength - PqRecvPointer);
+       PqRecvPointer = PqRecvLength;
+   }
 }