From eef5c4f0e51a3cde51fc0739e8622b38e2bceea1 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Sat, 20 Apr 2002 23:35:43 +0000 Subject: [PATCH] pq_getstring doesn't go through pq_getbyte anymore, for better performance. --- src/backend/libpq/pqcomm.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index db9e52c0c3..a14292a6d9 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; + } } -- 2.40.0