]> granicus.if.org Git - postgresql/commitdiff
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;
+       }
 }