diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-06-28 00:06:01 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-06-28 00:06:01 +0000 |
commit | ea20397b79f795441d48eae0ace03caf4c108a3c (patch) | |
tree | 2866bb3122ca963b729258df91f1d8beae8787d4 /src | |
parent | bf75f1a063c5b03058c9caa07157d75f4945b673 (diff) | |
download | postgresql-ea20397b79f795441d48eae0ace03caf4c108a3c.tar.gz postgresql-ea20397b79f795441d48eae0ace03caf4c108a3c.zip |
When using new protocol, PQexec can get out of a COPY IN or COPY OUT
state by itself, so do so.
Diffstat (limited to 'src')
-rw-r--r-- | src/interfaces/libpq/fe-exec.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index a1ae2612569..9285adc4599 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.140 2003/06/23 19:20:24 tgl Exp $ + * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.141 2003/06/28 00:06:01 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1083,13 +1083,48 @@ PQexecStart(PGconn *conn) */ while ((result = PQgetResult(conn)) != NULL) { - if (result->resultStatus == PGRES_COPY_IN || - result->resultStatus == PGRES_COPY_OUT) + if (result->resultStatus == PGRES_COPY_IN) { - PQclear(result); - printfPQExpBuffer(&conn->errorMessage, - libpq_gettext("COPY state must be terminated first\n")); - return false; + if (PG_PROTOCOL_MAJOR(conn->pversion) >= 3) + { + /* In protocol 3, we can get out of a COPY IN state */ + if (PQputCopyEnd(conn, + libpq_gettext("COPY terminated by new PQexec")) < 0) + { + PQclear(result); + return false; + } + /* keep waiting to swallow the copy's failure message */ + } + else + { + /* In older protocols we have to punt */ + PQclear(result); + printfPQExpBuffer(&conn->errorMessage, + libpq_gettext("COPY IN state must be terminated first\n")); + return false; + } + } + else if (result->resultStatus == PGRES_COPY_OUT) + { + if (PG_PROTOCOL_MAJOR(conn->pversion) >= 3) + { + /* + * In protocol 3, we can get out of a COPY OUT state: we + * just switch back to BUSY and allow the remaining COPY + * data to be dropped on the floor. + */ + conn->asyncStatus = PGASYNC_BUSY; + /* keep waiting to swallow the copy's completion message */ + } + else + { + /* In older protocols we have to punt */ + PQclear(result); + printfPQExpBuffer(&conn->errorMessage, + libpq_gettext("COPY OUT state must be terminated first\n")); + return false; + } } PQclear(result); } |