aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/libpq/pqcomm.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index db9e52c0c3d..a14292a6d9a 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -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;
+ }
}