From 0e6d72db55f2d8bb553c8f994c60902a44ac3bd1 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Fri, 14 Jan 2000 05:28:31 +0000 Subject: [PATCH] Make PSQLexec's behavior on loss of connection more reasonable; report original error before attempting reset, not after. --- src/bin/psql/common.c | 61 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index fd52d4de8b..584a8bf1c2 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -364,34 +364,43 @@ PSQLexec(PsqlSettings *pset, const char *query) pqsignal(SIGINT, SIG_DFL); /* now control-C is back to normal */ - if (PQstatus(pset->db) == CONNECTION_BAD) - { - fputs("The connection to the server was lost. Attempting reset: ", stderr); - PQreset(pset->db); - if (PQstatus(pset->db) == CONNECTION_BAD) - { - fputs("Failed.\n", stderr); - PQfinish(pset->db); - PQclear(res); - pset->db = NULL; - return NULL; - } - else - fputs("Succeeded.\n", stderr); - } - - if (res && (PQresultStatus(res) == PGRES_COMMAND_OK || - PQresultStatus(res) == PGRES_TUPLES_OK || - PQresultStatus(res) == PGRES_COPY_IN || - PQresultStatus(res) == PGRES_COPY_OUT) - ) - return res; - else + if (PQstatus(pset->db) == CONNECTION_OK) { + if (res && (PQresultStatus(res) == PGRES_COMMAND_OK || + PQresultStatus(res) == PGRES_TUPLES_OK || + PQresultStatus(res) == PGRES_COPY_IN || + PQresultStatus(res) == PGRES_COPY_OUT) + ) + return res; /* Normal success case... */ + /* Normal failure case --- display error and return NULL */ fputs(PQerrorMessage(pset->db), pset->queryFout); PQclear(res); return NULL; } + + /* Lost connection. Report whatever libpq has to say, + * then consider recovery. + */ + fputs(PQerrorMessage(pset->db), pset->queryFout); + PQclear(res); + if (!pset->cur_cmd_interactive) + { + fprintf(stderr, "%s: connection to server was lost\n", + pset->progname); + exit(EXIT_BADCONN); + } + fputs("The connection to the server was lost. Attempting reset: ", stderr); + fflush(stderr); + PQreset(pset->db); + if (PQstatus(pset->db) == CONNECTION_BAD) + { + fputs("Failed.\n", stderr); + PQfinish(pset->db); + pset->db = NULL; + } + else + fputs("Succeeded.\n", stderr); + return NULL; } @@ -517,17 +526,19 @@ SendQuery(PsqlSettings *pset, const char *query) { if (!pset->cur_cmd_interactive) { - fprintf(stderr, "%s: connection to server was lost", pset->progname); + fprintf(stderr, "%s: connection to server was lost\n", + pset->progname); exit(EXIT_BADCONN); } fputs("The connection to the server was lost. Attempting reset: ", stderr); + fflush(stderr); PQreset(pset->db); if (PQstatus(pset->db) == CONNECTION_BAD) { fputs("Failed.\n", stderr); PQfinish(pset->db); - PQclear(results); pset->db = NULL; + PQclear(results); return false; } else -- 2.11.0