aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/command.c6
-rw-r--r--src/bin/psql/common.c44
-rw-r--r--src/bin/psql/common.h3
-rw-r--r--src/bin/psql/copy.c17
-rw-r--r--src/bin/psql/copy.h4
-rw-r--r--src/bin/psql/create_help.pl14
-rw-r--r--src/bin/psql/help.c5
-rw-r--r--src/bin/psql/mainloop.c36
-rw-r--r--src/bin/psql/startup.c29
-rwxr-xr-xsrc/test/regress/regress.sh4
-rwxr-xr-xsrc/test/regress/run_check.sh4
11 files changed, 99 insertions, 67 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 07581fd82c6..e515f1e151b 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.23 2000/02/21 02:05:12 ishii Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.24 2000/03/01 21:09:58 petere Exp $
*/
#include "postgres.h"
#include "command.h"
@@ -432,7 +432,7 @@ exec_command(const char *cmd,
}
else
{
- success = process_file(fname) == EXIT_SUCCESS;
+ success = (process_file(fname) == EXIT_SUCCESS);
free (fname);
}
}
@@ -727,7 +727,7 @@ exec_command(const char *cmd,
else if (strcmp(cmd, "?") == 0)
slashUsage();
-#if 1
+#if 0
/*
* These commands don't do anything. I just use them to test the
* parser.
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index e149d7ec539..30e0cb5473e 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.17 2000/02/21 19:40:41 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.18 2000/03/01 21:09:58 petere Exp $
*/
#include "postgres.h"
#include "common.h"
@@ -170,6 +170,8 @@ NoticeProcessor(void * arg, const char * message)
*
* Returns a malloc()'ed string with the input (w/o trailing newline).
*/
+static bool prompt_state;
+
char *
simple_prompt(const char *prompt, int maxlen, bool echo)
{
@@ -187,6 +189,8 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
if (prompt)
fputs(prompt, stderr);
+ prompt_state = true;
+
#ifdef HAVE_TERMIOS_H
if (!echo)
{
@@ -207,6 +211,8 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
}
#endif
+ prompt_state = false;
+
length = strlen(destination);
if (length > 0 && destination[length - 1] != '\n')
{
@@ -238,7 +244,7 @@ simple_prompt(const char *prompt, int maxlen, bool echo)
* facilities in a signal handler.
*/
-static PGconn *cancelConn;
+PGconn *cancelConn;
volatile bool cancel_pressed;
#define write_stderr(String) write(fileno(stderr), String, strlen(String))
@@ -246,24 +252,20 @@ volatile bool cancel_pressed;
void
handle_sigint(SIGNAL_ARGS)
{
- cancel_pressed = true;
-
- if (copy_state)
+ /* Don't muck around if copying in or prompting for a password. */
+ if ((copy_in_state && pset.cur_cmd_interactive) || prompt_state)
return;
if (cancelConn == NULL)
-#ifndef WIN32
siglongjmp(main_loop_jmp, 1);
-#else
- return;
-#endif
- /* Try to send cancel request */
+ cancel_pressed = true;
+
if (PQrequestCancel(cancelConn))
- write_stderr("\nCancel request sent\n");
+ write_stderr("Cancel request sent\n");
else
{
- write_stderr("\nCould not send cancel request: ");
+ write_stderr("Could not send cancel request: ");
write_stderr(PQerrorMessage(cancelConn));
}
}
@@ -300,10 +302,11 @@ 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 (PQresultStatus(res) == PGRES_COPY_IN)
+ copy_in_state = true;
+ /* keep cancel connection for copy out state */
+ if (PQresultStatus(res) != PGRES_COPY_OUT)
+ cancelConn = NULL;
if (PQstatus(pset.db) == CONNECTION_BAD)
{
@@ -394,10 +397,11 @@ 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 (PQresultStatus(results) == PGRES_COPY_IN)
+ copy_in_state = true;
+ /* keep cancel connection for copy out state */
+ if (PQresultStatus(results) != PGRES_COPY_OUT)
+ cancelConn = NULL;
if (results == NULL)
{
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
index 6a7be3ec202..96c8a799489 100644
--- a/src/bin/psql/common.h
+++ b/src/bin/psql/common.h
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/common.h,v 1.7 2000/02/20 14:28:20 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/common.h,v 1.8 2000/03/01 21:09:58 petere Exp $
*/
#ifndef COMMON_H
#define COMMON_H
@@ -29,6 +29,7 @@ void NoticeProcessor(void * arg, const char * message);
char * simple_prompt(const char *prompt, int maxlen, bool echo);
extern volatile bool cancel_pressed;
+extern PGconn *cancelConn;
void handle_sigint(SIGNAL_ARGS);
PGresult * PSQLexec(const char *query);
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
index 7caf82edfdd..9f338979f18 100644
--- a/src/bin/psql/copy.c
+++ b/src/bin/psql/copy.c
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.11 2000/02/21 19:40:41 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.12 2000/03/01 21:09:58 petere Exp $
*/
#include "postgres.h"
#include "copy.h"
@@ -28,7 +28,7 @@
#define strcasecmp(x,y) stricmp(x,y)
#endif
-bool copy_state;
+bool copy_in_state;
/*
* parse_slash_copy
@@ -335,6 +335,8 @@ handleCopyOut(PGconn *conn, FILE *copystream)
char copybuf[COPYBUFSIZ];
int ret;
+ assert(cancelConn);
+
while (!copydone)
{
ret = PQgetline(conn, copybuf, COPYBUFSIZ);
@@ -363,7 +365,7 @@ handleCopyOut(PGconn *conn, FILE *copystream)
}
fflush(copystream);
ret = !PQendcopy(conn);
- copy_state = false;
+ cancelConn = NULL;
return ret;
}
@@ -394,6 +396,10 @@ handleCopyIn(PGconn *conn, FILE *copystream, const char *prompt)
int c = 0;
int ret;
+#ifdef USE_ASSERT_CHECKING
+ assert(copy_in_state);
+#endif
+
if (prompt) /* disable prompt if not interactive */
{
if (! isatty(fileno(copystream)))
@@ -409,6 +415,7 @@ handleCopyIn(PGconn *conn, FILE *copystream, const char *prompt)
}
firstload = true;
linedone = false;
+
while (!linedone)
{ /* for each bufferload in line ... */
s = copybuf;
@@ -427,6 +434,8 @@ handleCopyIn(PGconn *conn, FILE *copystream, const char *prompt)
{
PQputline(conn, "\\.");
copydone = true;
+ if (pset.cur_cmd_interactive)
+ puts("\\.");
break;
}
PQputline(conn, copybuf);
@@ -443,6 +452,6 @@ handleCopyIn(PGconn *conn, FILE *copystream, const char *prompt)
PQputline(conn, "\n");
}
ret = !PQendcopy(conn);
- copy_state = false;
+ copy_in_state = false;
return ret;
}
diff --git a/src/bin/psql/copy.h b/src/bin/psql/copy.h
index e25dfa9b6b7..66114fdbf42 100644
--- a/src/bin/psql/copy.h
+++ b/src/bin/psql/copy.h
@@ -3,14 +3,14 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/copy.h,v 1.8 2000/02/21 19:40:42 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/copy.h,v 1.9 2000/03/01 21:09:58 petere Exp $
*/
#ifndef COPY_H
#define COPY_H
#include "libpq-fe.h"
-extern bool copy_state;
+extern bool copy_in_state;
/* handler for \copy */
bool do_copy(const char *args);
diff --git a/src/bin/psql/create_help.pl b/src/bin/psql/create_help.pl
index 638b96600f8..f8e5379c893 100644
--- a/src/bin/psql/create_help.pl
+++ b/src/bin/psql/create_help.pl
@@ -5,35 +5,33 @@
#
# Copyright 2000 by PostgreSQL Global Development Group
#
-# $Header: /cvsroot/pgsql/src/bin/psql/create_help.pl,v 1.4 2000/02/07 23:10:06 petere Exp $
+# $Header: /cvsroot/pgsql/src/bin/psql/create_help.pl,v 1.5 2000/03/01 21:09:58 petere Exp $
#################################################################
#
# This script automatically generates the help on SQL in psql from
# the SGML docs. So far the format of the docs was consistent
-# enough that this worked, but this here is my no means an SGML
+# enough that this worked, but this here is by no means an SGML
# parser.
#
# Call: perl create_help.pl sql_help.h
# The name of the header file doesn't matter to this script, but it
# sure does matter to the rest of the source.
#
-# A rule for this is also in the psql makefile.
-#
$docdir = "./../../../doc/src/sgml/ref";
-$outputfile = $ARGV[0] or die "Missing required argument.\n";
+$outputfile = $ARGV[0] or die "$0: missing required argument\n";
$define = $outputfile;
$define =~ tr/a-z/A-Z/;
$define =~ s/\W/_/g;
-opendir DIR, $docdir or die "Couldn't open documentation sources: $!\n";
-open OUT, ">$outputfile" or die "Couldn't open output file '$outputfile': $!\n";
+opendir DIR, $docdir or die "$0: could not open documentation sources: $!\n";
+open OUT, ">$outputfile" or die "$0: could not open output file '$outputfile': $!\n";
print OUT
"/*
- * *** Do not change this file directly. Changes will be overwritten. ***
+ * *** Do not change this file. It is machine-generated. ***
*
* This file was generated by
* $^X $0 $outputfile
diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c
index 8fa9187d2da..33c187bdb2a 100644
--- a/src/bin/psql/help.c
+++ b/src/bin/psql/help.c
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.22 2000/02/20 14:28:20 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.23 2000/03/01 21:09:58 petere Exp $
*/
#include "postgres.h"
#include "help.h"
@@ -124,10 +124,11 @@ usage(void)
env = user;
printf(" -U <username> Specify database username (default: %s)\n", env);
- puts( " -x Turn on expanded table output (-P expanded)");
puts( " -v name=val Set psql variable 'name' to 'value'");
puts( " -V Show version information and exit");
puts( " -W Prompt for password (should happen automatically)");
+ puts( " -x Turn on expanded table output (-P expanded)");
+ puts( " -X Do not read startup file (~/.psqlrc)");
puts( "\nFor more information, type \"\\?\" (for internal commands) or \"\\help\"");
puts( "(for SQL commands) from within psql, or consult the psql section in");
diff --git a/src/bin/psql/mainloop.c b/src/bin/psql/mainloop.c
index 9b3834cca7d..4c5c7c55858 100644
--- a/src/bin/psql/mainloop.c
+++ b/src/bin/psql/mainloop.c
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/mainloop.c,v 1.22 2000/02/20 14:28:20 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/mainloop.c,v 1.23 2000/03/01 21:09:58 petere Exp $
*/
#include "postgres.h"
#include "mainloop.h"
@@ -40,18 +40,17 @@ MainLoop(FILE *source)
yet, use this one for \e, etc. */
char *line; /* current line of input */
int len; /* length of the line */
- int successResult = EXIT_SUCCESS;
- backslashResult slashCmdStatus;
+ volatile int successResult = EXIT_SUCCESS;
+ volatile backslashResult slashCmdStatus;
bool success;
- char in_quote; /* == 0 for no in_quote */
- bool xcomment; /* in extended comment */
- int paren_level;
+ volatile char in_quote; /* == 0 for no in_quote */
+ volatile bool xcomment; /* in extended comment */
+ volatile int paren_level;
unsigned int query_start;
- int count_eof = 0;
+ volatile int count_eof = 0;
const char *var;
- bool was_bslash;
- unsigned int bslash_count = 0;
+ volatile unsigned int bslash_count = 0;
int i,
prevlen,
@@ -98,7 +97,6 @@ MainLoop(FILE *source)
*/
if (cancel_pressed)
{
- cancel_pressed = false;
if (!pset.cur_cmd_interactive)
{
/*
@@ -109,23 +107,33 @@ MainLoop(FILE *source)
successResult = EXIT_USER;
break;
}
+
+ cancel_pressed = false;
}
-#ifndef WIN32
+
if (sigsetjmp(main_loop_jmp, 1) != 0)
{
/* got here with longjmp */
+
if (pset.cur_cmd_interactive)
{
fputc('\n', stdout);
resetPQExpBuffer(query_buf);
+
+ /* reset parsing state */
+ xcomment = false;
+ in_quote = 0;
+ paren_level = 0;
+ count_eof = 0;
+ slashCmdStatus = CMD_UNKNOWN;
}
else
{
successResult = EXIT_USER;
break;
- }
+ }
}
-#endif
+
if (slashCmdStatus == CMD_NEWEDIT)
{
@@ -273,7 +281,7 @@ MainLoop(FILE *source)
ADVANCE_1)
{
/* was the previous character a backslash? */
- was_bslash = (i > 0 && line[i - prevlen] == '\\');
+ bool was_bslash = (i > 0 && line[i - prevlen] == '\\');
if (was_bslash)
bslash_count++;
else
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 82a7bcd4d13..81c21a225b0 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -3,7 +3,7 @@
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.26 2000/02/27 01:10:31 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.27 2000/03/01 21:09:58 petere Exp $
*/
#include "postgres.h"
@@ -70,6 +70,7 @@ struct adhoc_opts
enum _actions action;
char *action_string;
bool no_readline;
+ bool no_psqlrc;
};
static void
@@ -192,7 +193,7 @@ main(int argc, char *argv[])
int success = listAllDbs(false);
PQfinish(pset.db);
- exit(!success);
+ exit(success ? EXIT_SUCCESS : EXIT_FAILURE);
}
SetVariable(pset.vars, "DBNAME", PQdb(pset.db));
@@ -213,7 +214,12 @@ main(int argc, char *argv[])
* process file given by -f
*/
if (options.action == ACT_FILE)
+ {
+ if (!options.no_psqlrc)
+ process_psqlrc();
+
successResult = process_file(options.action_string);
+ }
/*
* process slash command if one was given to -c
*/
@@ -257,7 +263,8 @@ main(int argc, char *argv[])
SetVariable(pset.vars, "PROMPT1", DEFAULT_PROMPT1);
SetVariable(pset.vars, "PROMPT2", DEFAULT_PROMPT2);
SetVariable(pset.vars, "PROMPT3", DEFAULT_PROMPT3);
- process_psqlrc();
+ if (!options.no_psqlrc)
+ process_psqlrc();
if (!pset.notty)
initializeInput(options.no_readline ? 0 : 1);
successResult = MainLoop(stdin);
@@ -310,11 +317,12 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
{"tuples-only", no_argument, NULL, 't'},
{"table-attr", required_argument, NULL, 'T'},
{"username", required_argument, NULL, 'U'},
- {"expanded", no_argument, NULL, 'x'},
{"set", required_argument, NULL, 'v'},
{"variable", required_argument, NULL, 'v'},
{"version", no_argument, NULL, 'V'},
{"password", no_argument, NULL, 'W'},
+ {"expanded", no_argument, NULL, 'x'},
+ {"no-psqlrc", no_argument, NULL, 'X'},
{"help", no_argument, NULL, '?'},
};
@@ -329,13 +337,13 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
memset(options, 0, sizeof *options);
#ifdef HAVE_GETOPT_LONG
- while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:lh:Hno:p:P:qRsStT:uU:v:VWx?", long_options, &optindex)) != -1)
+ while ((c = getopt_long(argc, argv, "aAc:d:eEf:F:lh:Hno:p:P:qRsStT:uU:v:VWxX?", long_options, &optindex)) != -1)
#else /* not HAVE_GETOPT_LONG */
/*
* Be sure to leave the '-' in here, so we can catch accidental long
* options.
*/
- while ((c = getopt(argc, argv, "aAc:d:eEf:F:lh:Hno:p:P:qRsStT:uU:v:VWx?-")) != -1)
+ while ((c = getopt(argc, argv, "aAc:d:eEf:F:lh:Hno:p:P:qRsStT:uU:v:VWxX?-")) != -1)
#endif /* not HAVE_GETOPT_LONG */
{
switch (c)
@@ -439,9 +447,6 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
case 'U':
options->username = optarg;
break;
- case 'x':
- pset.popt.topt.expanded = true;
- break;
case 'v':
{
char *value;
@@ -478,6 +483,12 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
case 'W':
pset.getPassword = true;
break;
+ case 'x':
+ pset.popt.topt.expanded = true;
+ break;
+ case 'X':
+ options->no_psqlrc = true;
+ break;
case '?':
/* Actual help option given */
if (strcmp(argv[optind-1], "-?")==0 || strcmp(argv[optind-1], "--help")==0)
diff --git a/src/test/regress/regress.sh b/src/test/regress/regress.sh
index b717f34dfb9..3e422be9c5f 100755
--- a/src/test/regress/regress.sh
+++ b/src/test/regress/regress.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-# $Header: /cvsroot/pgsql/src/test/regress/Attic/regress.sh,v 1.42 2000/03/01 19:11:06 momjian Exp $
+# $Header: /cvsroot/pgsql/src/test/regress/Attic/regress.sh,v 1.43 2000/03/01 21:10:04 petere Exp $
#
if [ $# -eq 0 ]
then
@@ -30,7 +30,7 @@ fi
PGTZ="PST8PDT"; export PGTZ
PGDATESTYLE="Postgres,US"; export PGDATESTYLE
-FRONTEND="psql $HOSTLOC -a -q"
+FRONTEND="psql $HOSTLOC -a -q -X"
# ----------
# Scan resultmap file to find which platform-specific expected files to use.
diff --git a/src/test/regress/run_check.sh b/src/test/regress/run_check.sh
index 3e4e1baae1c..68c524bb9ab 100755
--- a/src/test/regress/run_check.sh
+++ b/src/test/regress/run_check.sh
@@ -1,6 +1,6 @@
#!/bin/sh
#
-# $Header: /cvsroot/pgsql/src/test/regress/Attic/run_check.sh,v 1.10 2000/02/24 23:37:30 petere Exp $
+# $Header: /cvsroot/pgsql/src/test/regress/Attic/run_check.sh,v 1.11 2000/03/01 21:10:05 petere Exp $
# ----------
# Check call syntax
@@ -91,7 +91,7 @@ PGDATESTYLE="ISO,US"; export PGDATESTYLE
# ----------
# The SQL shell to use during this test
# ----------
-FRONTEND="$BINDIR/psql $HOSTLOC -a -q"
+FRONTEND="$BINDIR/psql $HOSTLOC -a -q -X"
# ----------
# Scan resultmap file to find which platform-specific expected files to use.