aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2000-02-21 19:40:42 +0000
committerPeter Eisentraut <peter_e@gmx.net>2000-02-21 19:40:42 +0000
commitc8009959c9320e9cf1e73324bc0f7dee966131d3 (patch)
treee0c6d307847eefe99efdbaf157b67be61dc01a64 /src
parentfc8e6c7746ad309b7b57989358a949a387bb14c4 (diff)
downloadpostgresql-c8009959c9320e9cf1e73324bc0f7dee966131d3.tar.gz
postgresql-c8009959c9320e9cf1e73324bc0f7dee966131d3.zip
Fixed psql's Control-C handling when COPY in progress
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/common.c15
-rw-r--r--src/bin/psql/copy.c15
-rw-r--r--src/bin/psql/copy.h4
3 files changed, 27 insertions, 7 deletions
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index cb352793a21..e149d7ec539 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -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)
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
index b0bba40889e..7caf82edfdd 100644
--- a/src/bin/psql/copy.c
+++ b/src/bin/psql/copy.c
@@ -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;
}
diff --git a/src/bin/psql/copy.h b/src/bin/psql/copy.h
index cf36d324c0a..e25dfa9b6b7 100644
--- a/src/bin/psql/copy.h
+++ b/src/bin/psql/copy.h
@@ -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);