OSDN Git Service

|
authorMarc G. Fournier <scrappy@hub.org>
Wed, 14 Aug 1996 04:56:55 +0000 (04:56 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Wed, 14 Aug 1996 04:56:55 +0000 (04:56 +0000)
|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>

src/bin/psql/psql.c
src/interfaces/libpq/fe-exec.c

index 8cb1ba6..e5b37a1 100644 (file)
@@ -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
index b81ae85..a1586bb 100644 (file)
@@ -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;
     }