]> granicus.if.org Git - postgresql/commitdiff
Fixed psql's Control-C handling when COPY in progress
authorPeter Eisentraut <peter_e@gmx.net>
Mon, 21 Feb 2000 19:40:42 +0000 (19:40 +0000)
committerPeter Eisentraut <peter_e@gmx.net>
Mon, 21 Feb 2000 19:40:42 +0000 (19:40 +0000)
src/bin/psql/common.c
src/bin/psql/copy.c
src/bin/psql/copy.h

index cb352793a21d6adb537e64e2190e9584ad880aa6..e149d7ec53968500b00d8edcab5f0e8aa6f49f9e 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.16 2000/02/20 14:28:20 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.17 2000/02/21 19:40:41 petere Exp $
  */
 #include "postgres.h"
 #include "common.h"
@@ -246,6 +246,11 @@ volatile bool cancel_pressed;
 void
 handle_sigint(SIGNAL_ARGS)
 {
+    cancel_pressed = true;
+
+    if (copy_state)
+        return;
+
        if (cancelConn == NULL)
 #ifndef WIN32
         siglongjmp(main_loop_jmp, 1);
@@ -253,8 +258,6 @@ handle_sigint(SIGNAL_ARGS)
                return;
 #endif
 
-    cancel_pressed = true;
-
        /* Try to send cancel request */
        if (PQrequestCancel(cancelConn))
                write_stderr("\nCancel request sent\n");
@@ -297,6 +300,9 @@ PSQLexec(const char *query)
 
        cancelConn = pset.db;
        res = PQexec(pset.db, query);
+    if (PQresultStatus(res) == PGRES_COPY_IN ||
+        PQresultStatus(res) == PGRES_COPY_OUT)
+        copy_state = true;
     cancelConn = NULL;
 
        if (PQstatus(pset.db) == CONNECTION_BAD)
@@ -388,6 +394,9 @@ SendQuery(const char *query)
 
        cancelConn = pset.db;
        results = PQexec(pset.db, query);
+    if (PQresultStatus(results) == PGRES_COPY_IN ||
+        PQresultStatus(results) == PGRES_COPY_OUT)
+        copy_state = true;
     cancelConn = NULL;
 
        if (results == NULL)
index b0bba40889e2c63b824e470b1145ff6099feb196..7caf82edfdd4cec6fafea4e9ed2928c4959c81af 100644 (file)
@@ -3,13 +3,14 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.10 2000/02/16 13:15:26 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.11 2000/02/21 19:40:41 petere Exp $
  */
 #include "postgres.h"
 #include "copy.h"
 
 #include <errno.h>
 #include <assert.h>
+#include <signal.h>
 #ifndef WIN32
 #include <unistd.h>                            /* for isatty */
 #else
@@ -17,6 +18,7 @@
 #endif
 
 #include "libpq-fe.h"
+#include "pqsignal.h"
 
 #include "settings.h"
 #include "common.h"
@@ -26,6 +28,8 @@
 #define strcasecmp(x,y) stricmp(x,y)
 #endif
 
+bool copy_state;
+
 /*
  * parse_slash_copy
  * -- parses \copy command line
@@ -358,7 +362,9 @@ handleCopyOut(PGconn *conn, FILE *copystream)
                }
        }
        fflush(copystream);
-       return !PQendcopy(conn);
+       ret = !PQendcopy(conn);
+    copy_state = false;
+    return ret;
 }
 
 
@@ -386,6 +392,7 @@ handleCopyIn(PGconn *conn, FILE *copystream, const char *prompt)
        char       *s;
        int                     bufleft;
        int                     c = 0;
+    int         ret;
 
        if (prompt)                                     /* disable prompt if not interactive */
        {
@@ -435,5 +442,7 @@ handleCopyIn(PGconn *conn, FILE *copystream, const char *prompt)
                }
                PQputline(conn, "\n");
        }
-       return !PQendcopy(conn);
+       ret = !PQendcopy(conn);
+    copy_state = false;
+    return ret;
 }
index cf36d324c0a80015b88f5c70b25fcc916589b4c7..e25dfa9b6b76efc76d87f57748eb5b1ce4011632 100644 (file)
@@ -3,13 +3,15 @@
  *
  * Copyright 2000 by PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/copy.h,v 1.7 2000/02/16 13:15:26 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/copy.h,v 1.8 2000/02/21 19:40:42 petere Exp $
  */
 #ifndef COPY_H
 #define COPY_H
 
 #include "libpq-fe.h"
 
+extern bool copy_state;
+
 /* handler for \copy */
 bool           do_copy(const char *args);