From d4dbfdb4c0ca03915e0bf2a6181fa8141b919c1a Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Sat, 28 Dec 1996 01:57:13 +0000 Subject: [PATCH] Patch for copy from stdin. --- src/interfaces/libpq/fe-exec.c | 52 ++++++++++++++++------------------ 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index c43dbbb0cb..9e3bc3f594 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.24 1996/12/26 22:08:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.25 1996/12/28 01:57:13 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -370,8 +370,9 @@ PQexec(PGconn* conn, const char* query) char pname[MAX_MESSAGE_LEN]; /* portal name */ PGnotify *newNotify; FILE *pfin, *pfout, *pfdebug; - int emptiesSent = 0; - + static int emptiesPending = 0; + bool emptySent = false; + pname[0]='\0'; if (!conn) return NULL; @@ -457,12 +458,13 @@ PQexec(PGconn* conn, const char* query) // send an empty query down, and keep reading out of the pipe // until an 'I' is received. */ - pqPuts("Q ",pfout,pfdebug); /* send an empty query */ + pqPuts("Q",pfout,pfdebug); /* send an empty query */ /* * Increment a flag and process messages in the usual way because * there may be async notifications pending. DZ - 31-8-1996 */ - emptiesSent++; + emptiesPending++; + emptySent = true; } break; case 'E': /* error return */ @@ -480,8 +482,8 @@ PQexec(PGconn* conn, const char* query) if ((c = pqGetc(pfin,pfdebug)) != '\0') { fprintf(stderr,"error!, unexpected character %c following 'I'\n", c); } - if (emptiesSent) { - if (--emptiesSent == 0) { /* is this the last one? */ + if (emptiesPending) { + if (--emptiesPending == 0 && emptySent) { /* is this the last one? */ /* * If this is the result of a portal query command set the * command status and message accordingly. DZ - 31-8-1996 @@ -621,42 +623,36 @@ PQputline(PGconn *conn, const char *s) * to a "copy". * * RETURNS: - * 0 on failure - * 1 on success + * 0 on success + * 1 on failure */ int PQendcopy(PGconn *conn) { - char id; FILE *pfin, *pfdebug; + bool valid = true; if (!conn) return (int)NULL; pfin = conn->Pfin; pfdebug = conn->Pfdebug; - if ( (id = pqGetc(pfin,pfdebug)) > 0) - return(0); - switch (id) { - case 'Z': /* backend finished the copy */ - return(1); - case 'E': - case 'N': - if (pqGets(conn->errorMessage, ERROR_MSG_LENGTH, pfin, pfdebug) == 1) { - sprintf(conn->errorMessage, + if ( pqGetc(pfin,pfdebug) == 'C') + { + char command[MAX_MESSAGE_LEN]; + pqGets(command,MAX_MESSAGE_LEN, pfin, pfdebug); /* read command tag */ + } + else valid = false; + + if ( valid ) + return (0); + else { + sprintf(conn->errorMessage, "Error return detected from backend, " "but attempt to read the message failed."); - } - return(0); - break; - default: - (void) sprintf(conn->errorMessage, - "FATAL: PQendcopy: protocol error: id=%x\n", - id); - fputs(conn->errorMessage, stderr); fprintf(stderr,"resetting connection\n"); PQreset(conn); - return(0); + return(1); } } -- 2.40.0