Fix \? and \pset pager handling. \? wasn't honoring pager before.

This commit is contained in:
Bruce Momjian 2002-07-15 01:56:25 +00:00
parent d5fa19c6ee
commit 91dfa1af97
6 changed files with 98 additions and 92 deletions

View File

@ -1,5 +1,5 @@
<!-- <!--
$Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.67 2002/06/20 16:00:43 momjian Exp $ $Header: /cvsroot/pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.68 2002/07/15 01:56:25 momjian Exp $
PostgreSQL documentation PostgreSQL documentation
--> -->
@ -1036,7 +1036,7 @@ lo_import 152801
<term><literal>pager</literal></term> <term><literal>pager</literal></term>
<listitem> <listitem>
<para> <para>
Toggles the list of a pager to do table output. If the Toggles the use of a pager for query and psql help output. If the
environment variable <envar>PAGER</envar> is set, the output environment variable <envar>PAGER</envar> is set, the output
is piped to the specified program. Otherwise is piped to the specified program. Otherwise
<filename>more</filename> is used. <filename>more</filename> is used.
@ -1050,7 +1050,7 @@ lo_import 152801
of the printing routines it is not always possible to predict of the printing routines it is not always possible to predict
the number of lines that will actually be printed. For that the number of lines that will actually be printed. For that
reason <application>psql</application> might not appear very reason <application>psql</application> might not appear very
discriminating about when to use the pager and when not to. discriminating about when to use the pager.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -3,7 +3,7 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.72 2002/04/24 05:24:00 petere Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.73 2002/07/15 01:56:25 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "command.h" #include "command.h"
@ -846,7 +846,7 @@ exec_command(const char *cmd,
/* \? -- slash command help */ /* \? -- slash command help */
else if (strcmp(cmd, "?") == 0) else if (strcmp(cmd, "?") == 0)
slashUsage(); slashUsage(pset.popt.topt.pager);
#if 0 #if 0

View File

@ -3,9 +3,10 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.51 2002/06/20 20:29:42 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/help.c,v 1.52 2002/07/15 01:56:25 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "print.h"
#include "help.h" #include "help.h"
#include <signal.h> #include <signal.h>
@ -138,7 +139,6 @@ usage(void)
} }
/* /*
* slashUsage * slashUsage
* *
@ -154,98 +154,106 @@ struct winsize
#endif #endif
void void
slashUsage(void) slashUsage(bool pager)
{ {
bool usePipe = false; FILE *output, *pagerfd = NULL;
const char *pagerenv;
FILE *fout; /* check whether we need / can / are supposed to use pager */
struct winsize screen_size; if (pager
#ifndef WIN32
&&
isatty(fileno(stdin)) &&
isatty(fileno(stdout))
#endif
)
{
const char *pagerprog;
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
if (pset.notty == 0 && int result;
(ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1 || struct winsize screen_size;
screen_size.ws_col == 0 ||
screen_size.ws_row == 0)) result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
{ if (result == -1 || 50 > screen_size.ws_row)
{
#endif #endif
screen_size.ws_row = 24; pagerprog = getenv("PAGER");
screen_size.ws_col = 80; if (!pagerprog)
pagerprog = DEFAULT_PAGER;
pagerfd = popen(pagerprog, "w");
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
}
#endif
} }
#endif
if (pset.notty == 0 && if (pagerfd)
(pagerenv = getenv("PAGER")) &&
(pagerenv[0] != '\0') &&
screen_size.ws_row <= 46 &&
(fout = popen(pagerenv, "w")))
{ {
usePipe = true; output = pagerfd;
#ifndef WIN32 #ifndef WIN32
pqsignal(SIGPIPE, SIG_IGN); pqsignal(SIGPIPE, SIG_IGN);
#endif #endif
} }
else else
fout = stdout; output = stdout;
/* if you add/remove a line here, change the row test above */ /* if you add/remove a line here, change the row test above */
/* if this " is the start of the string then it ought to end there to fit in 80 columns >> " */ /* if this " is the start of the string then it ought to end there to fit in 80 columns >> " */
fprintf(fout, _(" \\a toggle between unaligned and aligned output mode\n")); fprintf(output, _(" \\a toggle between unaligned and aligned output mode\n"));
fprintf(fout, _(" \\c[onnect] [DBNAME|- [USER]]\n" fprintf(output, _(" \\c[onnect] [DBNAME|- [USER]]\n"
" connect to new database (currently \"%s\")\n"), " connect to new database (currently \"%s\")\n"),
PQdb(pset.db)); PQdb(pset.db));
fprintf(fout, _(" \\C [STRING] set table title, or unset if none\n")); fprintf(output, _(" \\C [STRING] set table title, or unset if none\n"));
fprintf(fout, _(" \\cd [DIR] change the current working directory\n")); fprintf(output, _(" \\cd [DIR] change the current working directory\n"));
fprintf(fout, _(" \\copy ... perform SQL COPY with data stream to the client host\n")); fprintf(output, _(" \\copy ... perform SQL COPY with data stream to the client host\n"));
fprintf(fout, _(" \\copyright show PostgreSQL usage and distribution terms\n")); fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n"));
fprintf(fout, _(" \\d [NAME] describe table (or view, index, sequence)\n")); fprintf(output, _(" \\d [NAME] describe table (or view, index, sequence)\n"));
fprintf(fout, _(" \\d{t|i|s|v|S} [PATTERN]\n")); fprintf(output, _(" \\d{t|i|s|v|S} [PATTERN]\n"));
fprintf(fout, _(" list tables/indexes/sequences/views/system tables\n")); fprintf(output, _(" list tables/indexes/sequences/views/system tables\n"));
fprintf(fout, _(" \\da [PATTERN] list aggregate functions\n")); fprintf(output, _(" \\da [PATTERN] list aggregate functions\n"));
fprintf(fout, _(" \\dd [PATTERN] show comment for object\n")); fprintf(output, _(" \\dd [PATTERN] show comment for object\n"));
fprintf(fout, _(" \\dD [PATTERN] list domains\n")); fprintf(output, _(" \\dD [PATTERN] list domains\n"));
fprintf(fout, _(" \\df [PATTERN] list functions\n")); fprintf(output, _(" \\df [PATTERN] list functions\n"));
fprintf(fout, _(" \\do [NAME] list operators\n")); fprintf(output, _(" \\do [NAME] list operators\n"));
fprintf(fout, _(" \\dl list large objects, same as lo_list\n")); fprintf(output, _(" \\dl list large objects, same as lo_list\n"));
fprintf(fout, _(" \\dp [PATTERN] list table access privileges\n")); fprintf(output, _(" \\dp [PATTERN] list table access privileges\n"));
fprintf(fout, _(" \\dT [PATTERN] list data types\n")); fprintf(output, _(" \\dT [PATTERN] list data types\n"));
fprintf(fout, _(" \\du [PATTERN] list users\n")); fprintf(output, _(" \\du [PATTERN] list users\n"));
fprintf(fout, _(" \\e [FILE] edit the query buffer (or file) with external editor\n")); fprintf(output, _(" \\e [FILE] edit the query buffer (or file) with external editor\n"));
fprintf(fout, _(" \\echo [STRING] write string to standard output\n")); fprintf(output, _(" \\echo [STRING] write string to standard output\n"));
fprintf(fout, _(" \\encoding [ENCODING] show or set client encoding\n")); fprintf(output, _(" \\encoding [ENCODING] show or set client encoding\n"));
fprintf(fout, _(" \\f [STRING] show or set field separator for unaligned query output\n")); fprintf(output, _(" \\f [STRING] show or set field separator for unaligned query output\n"));
fprintf(fout, _(" \\g [FILE] send query buffer to server (and results to file or |pipe)\n")); fprintf(output, _(" \\g [FILE] send query buffer to server (and results to file or |pipe)\n"));
fprintf(fout, _(" \\h [NAME] help on syntax of SQL commands, * for all commands\n")); fprintf(output, _(" \\h [NAME] help on syntax of SQL commands, * for all commands\n"));
fprintf(fout, _(" \\H toggle HTML output mode (currently %s)\n"), fprintf(output, _(" \\H toggle HTML output mode (currently %s)\n"),
ON(pset.popt.topt.format == PRINT_HTML)); ON(pset.popt.topt.format == PRINT_HTML));
fprintf(fout, _(" \\i FILE execute commands from file\n")); fprintf(output, _(" \\i FILE execute commands from file\n"));
fprintf(fout, _(" \\l list all databases\n")); fprintf(output, _(" \\l list all databases\n"));
fprintf(fout, _(" \\lo_export, \\lo_import, \\lo_list, \\lo_unlink\n" fprintf(output, _(" \\lo_export, \\lo_import, \\lo_list, \\lo_unlink\n"
" large object operations\n")); " large object operations\n"));
fprintf(fout, _(" \\o FILE send all query results to file or |pipe\n")); fprintf(output, _(" \\o FILE send all query results to file or |pipe\n"));
fprintf(fout, _(" \\p show the contents of the query buffer\n")); fprintf(output, _(" \\p show the contents of the query buffer\n"));
fprintf(fout, _(" \\pset NAME [VALUE] set table output option (NAME := {format|border|expanded|\n" fprintf(output, _(" \\pset NAME [VALUE] set table output option (NAME := {format|border|expanded|\n"
" fieldsep|null|recordsep|tuples_only|title|tableattr|pager})\n")); " fieldsep|null|recordsep|tuples_only|title|tableattr|pager})\n"));
fprintf(fout, _(" \\q quit psql\n")); fprintf(output, _(" \\q quit psql\n"));
fprintf(fout, _(" \\qecho [STRING] write string to query output stream (see \\o)\n")); fprintf(output, _(" \\qecho [STRING] write string to query output stream (see \\o)\n"));
fprintf(fout, _(" \\r reset (clear) the query buffer\n")); fprintf(output, _(" \\r reset (clear) the query buffer\n"));
fprintf(fout, _(" \\s [FILE] display history or save it to file\n")); fprintf(output, _(" \\s [FILE] display history or save it to file\n"));
fprintf(fout, _(" \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n")); fprintf(output, _(" \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n"));
fprintf(fout, _(" \\t show only rows (currently %s)\n"), fprintf(output, _(" \\t show only rows (currently %s)\n"),
ON(pset.popt.topt.tuples_only)); ON(pset.popt.topt.tuples_only));
fprintf(fout, _(" \\T [STRING] set HTML <table>-tag attributes, or unset if none\n")); fprintf(output, _(" \\T [STRING] set HTML <table>-tag attributes, or unset if none\n"));
fprintf(fout, _(" \\timing toggle timing of queries (currently %s)\n"), fprintf(output, _(" \\timing toggle timing of queries (currently %s)\n"),
ON(pset.timing)); ON(pset.timing));
fprintf(fout, _(" \\unset NAME unset (delete) internal variable\n")); fprintf(output, _(" \\unset NAME unset (delete) internal variable\n"));
fprintf(fout, _(" \\w [FILE] write query buffer to file\n")); fprintf(output, _(" \\w [FILE] write query buffer to file\n"));
fprintf(fout, _(" \\x toggle expanded output (currently %s)\n"), fprintf(output, _(" \\x toggle expanded output (currently %s)\n"),
ON(pset.popt.topt.expanded)); ON(pset.popt.topt.expanded));
fprintf(fout, _(" \\z [PATTERN] list table access privileges (same as \\dp)\n")); fprintf(output, _(" \\z [PATTERN] list table access privileges (same as \\dp)\n"));
fprintf(fout, _(" \\! [COMMAND] execute command in shell or start interactive shell\n")); fprintf(output, _(" \\! [COMMAND] execute command in shell or start interactive shell\n"));
if (usePipe) if (pagerfd)
{ {
pclose(fout); pclose(pagerfd);
#ifndef WIN32 #ifndef WIN32
pqsignal(SIGPIPE, SIG_DFL); pqsignal(SIGPIPE, SIG_DFL);
#endif #endif

View File

@ -3,14 +3,14 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/bin/psql/help.h,v 1.8 2001/10/28 06:25:58 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/help.h,v 1.9 2002/07/15 01:56:25 momjian Exp $
*/ */
#ifndef HELP_H #ifndef HELP_H
#define HELP_H #define HELP_H
void usage(void); void usage(void);
void slashUsage(void); void slashUsage(bool pager);
void helpSQL(const char *topic); void helpSQL(const char *topic);

View File

@ -3,7 +3,7 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.26 2002/04/24 15:56:38 tgl Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/print.c,v 1.27 2002/07/15 01:56:25 momjian Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "print.h" #include "print.h"
@ -23,12 +23,6 @@
#include "settings.h" #include "settings.h"
#ifndef __CYGWIN__
#define DEFAULT_PAGER "more"
#else
#define DEFAULT_PAGER "less"
#endif
#ifdef HAVE_TERMIOS_H #ifdef HAVE_TERMIOS_H
#include <termios.h> #include <termios.h>
#endif #endif
@ -1033,7 +1027,7 @@ printTable(const char *title,
{ {
const char *default_footer[] = {NULL}; const char *default_footer[] = {NULL};
unsigned short int border = opt->border; unsigned short int border = opt->border;
FILE *pager = NULL, FILE *pagerfd = NULL,
*output; *output;
@ -1090,15 +1084,15 @@ printTable(const char *title,
pagerprog = getenv("PAGER"); pagerprog = getenv("PAGER");
if (!pagerprog) if (!pagerprog)
pagerprog = DEFAULT_PAGER; pagerprog = DEFAULT_PAGER;
pager = popen(pagerprog, "w"); pagerfd = popen(pagerprog, "w");
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
} }
#endif #endif
} }
if (pager) if (pagerfd)
{ {
output = pager; output = pagerfd;
#ifndef WIN32 #ifndef WIN32
pqsignal(SIGPIPE, SIG_IGN); pqsignal(SIGPIPE, SIG_IGN);
#endif #endif
@ -1139,13 +1133,12 @@ printTable(const char *title,
fprintf(stderr, "+ Oops, you shouldn't see this!\n"); fprintf(stderr, "+ Oops, you shouldn't see this!\n");
} }
if (pager) if (pagerfd)
{ {
pclose(pager); pclose(pagerfd);
#ifndef WIN32 #ifndef WIN32
pqsignal(SIGPIPE, SIG_DFL); pqsignal(SIGPIPE, SIG_DFL);
#endif #endif
} }
} }

View File

@ -3,7 +3,7 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * Copyright 2000 by PostgreSQL Global Development Group
* *
* $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.12 2001/11/05 17:46:31 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.13 2002/07/15 01:56:25 momjian Exp $
*/ */
#ifndef PRINT_H #ifndef PRINT_H
#define PRINT_H #define PRINT_H
@ -72,7 +72,12 @@ typedef struct _printQueryOpt
* *
* It calls the printTable above with all the things set straight. * It calls the printTable above with all the things set straight.
*/ */
void void printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout);
printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout);
#ifndef __CYGWIN__
#define DEFAULT_PAGER "more"
#else
#define DEFAULT_PAGER "less"
#endif
#endif /* PRINT_H */ #endif /* PRINT_H */