mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
|
|We're all too familiar with psql's "no response from backend" message. |Users can't tell what this means, and psql continues prompting for |commands after it even though the backend is dead and no commands can |succeed. It eventually dies on a signal when the dead socket fills |up. I extended the message to offer a better explanation and made |psql exit when it finds the backend is dead. | |I also added a short message and newline when the user does a ctl-D so |it doesn't mess up the terminal display. | | Submitted by: Bryan Henderson <bryanh@giraffe.netgate.net>
This commit is contained in:
parent
6b9ecd8348
commit
011ee13131
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.17 1996/08/10 05:02:53 scrappy Exp $
|
||||
* $Header: /cvsroot/pgsql/src/bin/psql/Attic/psql.c,v 1.18 1996/08/14 04:56:48 scrappy Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -988,6 +988,10 @@ MainLoop(PsqlSettings *settings, FILE *source)
|
||||
bool querySent = 0;
|
||||
bool interactive;
|
||||
READ_ROUTINE GetNextLine;
|
||||
bool connected = 1;
|
||||
/* We are connected to the backend (last time we looked) */
|
||||
bool eof = 0;
|
||||
/* We've reached the end of our command input. */
|
||||
|
||||
interactive = ((source == stdin) && !settings->notty);
|
||||
#define PROMPT "=> "
|
||||
@ -1012,9 +1016,13 @@ MainLoop(PsqlSettings *settings, FILE *source)
|
||||
query[0] = '\0';
|
||||
|
||||
/* main loop for getting queries and executing them */
|
||||
while ((line = GetNextLine(settings->prompt, source)) != NULL)
|
||||
{
|
||||
exitStatus = 0;
|
||||
while (connected && !eof) {
|
||||
line = GetNextLine(settings->prompt, source);
|
||||
if (line == NULL) { /* No more input. Time to quit */
|
||||
printf("EOF\n"); /* Goes on prompt line */
|
||||
eof = 1;
|
||||
} else {
|
||||
exitStatus = 0;
|
||||
line = rightTrim(line); /* remove whitespaces on the right, incl. \n's */
|
||||
|
||||
if (line[0] == '\0') {
|
||||
@ -1099,11 +1107,16 @@ MainLoop(PsqlSettings *settings, FILE *source)
|
||||
|
||||
exitStatus = SendQuery(settings, query);
|
||||
querySent = 1;
|
||||
if (PQstatus(settings->db) == CONNECTION_BAD) {
|
||||
connected = 0;
|
||||
fprintf(stderr, "We have lost the connection to the backend, so "
|
||||
"further processing is impossible. Terminating.\n");
|
||||
}
|
||||
}
|
||||
|
||||
free(line); /* free storage malloc'd by GetNextLine */
|
||||
} /* while */
|
||||
return exitStatus;
|
||||
free(line); /* free storage malloc'd by GetNextLine */
|
||||
}
|
||||
} /* while */
|
||||
return exitStatus;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.15 1996/08/13 01:34:27 scrappy Exp $
|
||||
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.16 1996/08/14 04:56:55 scrappy Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -387,17 +387,26 @@ PQexec(PGconn* conn, const char* query)
|
||||
|
||||
/* check to see if the query string is too long */
|
||||
if (strlen(query) > MAX_MESSAGE_LEN) {
|
||||
sprintf(conn->errorMessage, "PQexec() -- query is too long. Maximum length is %d\n", MAX_MESSAGE_LEN -2 );
|
||||
sprintf(conn->errorMessage, "PQexec() -- query is too long. "
|
||||
"Maximum length is %d\n", MAX_MESSAGE_LEN -2 );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Don't try to send if we know there's no live connection. */
|
||||
if (conn->status != CONNECTION_OK) {
|
||||
sprintf(conn->errorMessage, "PQexec() -- There is no connection "
|
||||
"to the backend.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* the frontend-backend protocol uses 'Q' to designate queries */
|
||||
sprintf(buffer,"Q%s",query);
|
||||
|
||||
/* send the query to the backend; */
|
||||
if (pqPuts(buffer,pfout, pfdebug) == 1) {
|
||||
(void) sprintf(conn->errorMessage,
|
||||
"PQexec() -- while sending query: %s\n-- fprintf to Pfout failed: errno=%d\n%s\n",
|
||||
"PQexec() -- while sending query: %s\n"
|
||||
"-- fprintf to Pfout failed: errno=%d\n%s\n",
|
||||
query, errno,strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
@ -414,7 +423,12 @@ PQexec(PGconn* conn, const char* query)
|
||||
if (id == EOF) {
|
||||
/* hmm, no response from the backend-end, that's bad */
|
||||
(void) sprintf(conn->errorMessage,
|
||||
"PQexec() -- No response from backend\n");
|
||||
"PQexec() -- Request was sent to backend, but backend "
|
||||
"closed the channel before "
|
||||
"responding. This probably means the backend "
|
||||
"terminated abnormally before or while processing "
|
||||
"the request.\n");
|
||||
conn->status = CONNECTION_BAD; /* No more connection to backend */
|
||||
return (PGresult*)NULL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user