diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 85bc6852be..923a874111 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1,5 +1,5 @@ @@ -1036,7 +1036,7 @@ lo_import 152801 pager - 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 PAGER is set, the output is piped to the specified program. Otherwise more is used. @@ -1050,7 +1050,7 @@ lo_import 152801 of the printing routines it is not always possible to predict the number of lines that will actually be printed. For that reason psql might not appear very - discriminating about when to use the pager and when not to. + discriminating about when to use the pager. diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index eceecd7d26..f28af37d93 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.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 "command.h" @@ -846,7 +846,7 @@ exec_command(const char *cmd, /* \? -- slash command help */ else if (strcmp(cmd, "?") == 0) - slashUsage(); + slashUsage(pset.popt.topt.pager); #if 0 diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index becade93fb..592a8af3fb 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -3,9 +3,10 @@ * * 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 "print.h" #include "help.h" #include @@ -138,7 +139,6 @@ usage(void) } - /* * slashUsage * @@ -154,98 +154,106 @@ struct winsize #endif void -slashUsage(void) +slashUsage(bool pager) { - bool usePipe = false; - const char *pagerenv; - FILE *fout; - struct winsize screen_size; + FILE *output, *pagerfd = NULL; + + /* check whether we need / can / are supposed to use pager */ + if (pager +#ifndef WIN32 + && + isatty(fileno(stdin)) && + isatty(fileno(stdout)) +#endif + ) + { + const char *pagerprog; #ifdef TIOCGWINSZ - if (pset.notty == 0 && - (ioctl(fileno(stdout), TIOCGWINSZ, &screen_size) == -1 || - screen_size.ws_col == 0 || - screen_size.ws_row == 0)) - { + int result; + struct winsize screen_size; + + result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size); + if (result == -1 || 50 > screen_size.ws_row) + { #endif - screen_size.ws_row = 24; - screen_size.ws_col = 80; + pagerprog = getenv("PAGER"); + if (!pagerprog) + pagerprog = DEFAULT_PAGER; + pagerfd = popen(pagerprog, "w"); #ifdef TIOCGWINSZ + } +#endif } -#endif - if (pset.notty == 0 && - (pagerenv = getenv("PAGER")) && - (pagerenv[0] != '\0') && - screen_size.ws_row <= 46 && - (fout = popen(pagerenv, "w"))) + if (pagerfd) { - usePipe = true; + output = pagerfd; #ifndef WIN32 pqsignal(SIGPIPE, SIG_IGN); #endif } else - fout = stdout; + output = stdout; /* 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 >> " */ - fprintf(fout, _(" \\a toggle between unaligned and aligned output mode\n")); - fprintf(fout, _(" \\c[onnect] [DBNAME|- [USER]]\n" + fprintf(output, _(" \\a toggle between unaligned and aligned output mode\n")); + fprintf(output, _(" \\c[onnect] [DBNAME|- [USER]]\n" " connect to new database (currently \"%s\")\n"), PQdb(pset.db)); - fprintf(fout, _(" \\C [STRING] set table title, or unset if none\n")); - fprintf(fout, _(" \\cd [DIR] change the current working directory\n")); - fprintf(fout, _(" \\copy ... perform SQL COPY with data stream to the client host\n")); - fprintf(fout, _(" \\copyright show PostgreSQL usage and distribution terms\n")); - fprintf(fout, _(" \\d [NAME] describe table (or view, index, sequence)\n")); - fprintf(fout, _(" \\d{t|i|s|v|S} [PATTERN]\n")); - fprintf(fout, _(" list tables/indexes/sequences/views/system tables\n")); - fprintf(fout, _(" \\da [PATTERN] list aggregate functions\n")); - fprintf(fout, _(" \\dd [PATTERN] show comment for object\n")); - fprintf(fout, _(" \\dD [PATTERN] list domains\n")); - fprintf(fout, _(" \\df [PATTERN] list functions\n")); - fprintf(fout, _(" \\do [NAME] list operators\n")); - fprintf(fout, _(" \\dl list large objects, same as lo_list\n")); - fprintf(fout, _(" \\dp [PATTERN] list table access privileges\n")); - fprintf(fout, _(" \\dT [PATTERN] list data types\n")); - fprintf(fout, _(" \\du [PATTERN] list users\n")); - fprintf(fout, _(" \\e [FILE] edit the query buffer (or file) with external editor\n")); - fprintf(fout, _(" \\echo [STRING] write string to standard output\n")); - fprintf(fout, _(" \\encoding [ENCODING] show or set client encoding\n")); - fprintf(fout, _(" \\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(fout, _(" \\h [NAME] help on syntax of SQL commands, * for all commands\n")); - fprintf(fout, _(" \\H toggle HTML output mode (currently %s)\n"), + fprintf(output, _(" \\C [STRING] set table title, or unset if none\n")); + fprintf(output, _(" \\cd [DIR] change the current working directory\n")); + fprintf(output, _(" \\copy ... perform SQL COPY with data stream to the client host\n")); + fprintf(output, _(" \\copyright show PostgreSQL usage and distribution terms\n")); + fprintf(output, _(" \\d [NAME] describe table (or view, index, sequence)\n")); + fprintf(output, _(" \\d{t|i|s|v|S} [PATTERN]\n")); + fprintf(output, _(" list tables/indexes/sequences/views/system tables\n")); + fprintf(output, _(" \\da [PATTERN] list aggregate functions\n")); + fprintf(output, _(" \\dd [PATTERN] show comment for object\n")); + fprintf(output, _(" \\dD [PATTERN] list domains\n")); + fprintf(output, _(" \\df [PATTERN] list functions\n")); + fprintf(output, _(" \\do [NAME] list operators\n")); + fprintf(output, _(" \\dl list large objects, same as lo_list\n")); + fprintf(output, _(" \\dp [PATTERN] list table access privileges\n")); + fprintf(output, _(" \\dT [PATTERN] list data types\n")); + fprintf(output, _(" \\du [PATTERN] list users\n")); + fprintf(output, _(" \\e [FILE] edit the query buffer (or file) with external editor\n")); + fprintf(output, _(" \\echo [STRING] write string to standard output\n")); + fprintf(output, _(" \\encoding [ENCODING] show or set client encoding\n")); + fprintf(output, _(" \\f [STRING] show or set field separator for unaligned query output\n")); + fprintf(output, _(" \\g [FILE] send query buffer to server (and results to file or |pipe)\n")); + fprintf(output, _(" \\h [NAME] help on syntax of SQL commands, * for all commands\n")); + fprintf(output, _(" \\H toggle HTML output mode (currently %s)\n"), ON(pset.popt.topt.format == PRINT_HTML)); - fprintf(fout, _(" \\i FILE execute commands from file\n")); - fprintf(fout, _(" \\l list all databases\n")); - fprintf(fout, _(" \\lo_export, \\lo_import, \\lo_list, \\lo_unlink\n" + fprintf(output, _(" \\i FILE execute commands from file\n")); + fprintf(output, _(" \\l list all databases\n")); + fprintf(output, _(" \\lo_export, \\lo_import, \\lo_list, \\lo_unlink\n" " large object operations\n")); - fprintf(fout, _(" \\o FILE send all query results to file or |pipe\n")); - fprintf(fout, _(" \\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, _(" \\o FILE send all query results to file or |pipe\n")); + fprintf(output, _(" \\p show the contents of the query buffer\n")); + fprintf(output, _(" \\pset NAME [VALUE] set table output option (NAME := {format|border|expanded|\n" " fieldsep|null|recordsep|tuples_only|title|tableattr|pager})\n")); - fprintf(fout, _(" \\q quit psql\n")); - fprintf(fout, _(" \\qecho [STRING] write string to query output stream (see \\o)\n")); - fprintf(fout, _(" \\r reset (clear) the query buffer\n")); - fprintf(fout, _(" \\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(fout, _(" \\t show only rows (currently %s)\n"), + fprintf(output, _(" \\q quit psql\n")); + fprintf(output, _(" \\qecho [STRING] write string to query output stream (see \\o)\n")); + fprintf(output, _(" \\r reset (clear) the query buffer\n")); + fprintf(output, _(" \\s [FILE] display history or save it to file\n")); + fprintf(output, _(" \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n")); + fprintf(output, _(" \\t show only rows (currently %s)\n"), ON(pset.popt.topt.tuples_only)); - fprintf(fout, _(" \\T [STRING] set HTML -tag attributes, or unset if none\n")); - fprintf(fout, _(" \\timing toggle timing of queries (currently %s)\n"), + fprintf(output, _(" \\T [STRING] set HTML
-tag attributes, or unset if none\n")); + fprintf(output, _(" \\timing toggle timing of queries (currently %s)\n"), ON(pset.timing)); - fprintf(fout, _(" \\unset NAME unset (delete) internal variable\n")); - fprintf(fout, _(" \\w [FILE] write query buffer to file\n")); - fprintf(fout, _(" \\x toggle expanded output (currently %s)\n"), + fprintf(output, _(" \\unset NAME unset (delete) internal variable\n")); + fprintf(output, _(" \\w [FILE] write query buffer to file\n")); + fprintf(output, _(" \\x toggle expanded output (currently %s)\n"), ON(pset.popt.topt.expanded)); - fprintf(fout, _(" \\z [PATTERN] list table access privileges (same as \\dp)\n")); - fprintf(fout, _(" \\! [COMMAND] execute command in shell or start interactive shell\n")); + fprintf(output, _(" \\z [PATTERN] list table access privileges (same as \\dp)\n")); + fprintf(output, _(" \\! [COMMAND] execute command in shell or start interactive shell\n")); - if (usePipe) + if (pagerfd) { - pclose(fout); + pclose(pagerfd); #ifndef WIN32 pqsignal(SIGPIPE, SIG_DFL); #endif diff --git a/src/bin/psql/help.h b/src/bin/psql/help.h index 16d09480bf..6c655f306b 100644 --- a/src/bin/psql/help.h +++ b/src/bin/psql/help.h @@ -3,14 +3,14 @@ * * 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 #define HELP_H void usage(void); -void slashUsage(void); +void slashUsage(bool pager); void helpSQL(const char *topic); diff --git a/src/bin/psql/print.c b/src/bin/psql/print.c index 892d88fdf0..92368f9c2d 100644 --- a/src/bin/psql/print.c +++ b/src/bin/psql/print.c @@ -3,7 +3,7 @@ * * 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 "print.h" @@ -23,12 +23,6 @@ #include "settings.h" -#ifndef __CYGWIN__ -#define DEFAULT_PAGER "more" -#else -#define DEFAULT_PAGER "less" -#endif - #ifdef HAVE_TERMIOS_H #include #endif @@ -1033,7 +1027,7 @@ printTable(const char *title, { const char *default_footer[] = {NULL}; unsigned short int border = opt->border; - FILE *pager = NULL, + FILE *pagerfd = NULL, *output; @@ -1090,15 +1084,15 @@ printTable(const char *title, pagerprog = getenv("PAGER"); if (!pagerprog) pagerprog = DEFAULT_PAGER; - pager = popen(pagerprog, "w"); + pagerfd = popen(pagerprog, "w"); #ifdef TIOCGWINSZ } #endif } - if (pager) + if (pagerfd) { - output = pager; + output = pagerfd; #ifndef WIN32 pqsignal(SIGPIPE, SIG_IGN); #endif @@ -1139,13 +1133,12 @@ printTable(const char *title, fprintf(stderr, "+ Oops, you shouldn't see this!\n"); } - if (pager) + if (pagerfd) { - pclose(pager); + pclose(pagerfd); #ifndef WIN32 pqsignal(SIGPIPE, SIG_DFL); #endif - } } diff --git a/src/bin/psql/print.h b/src/bin/psql/print.h index 59c32830d2..bcb3495bc6 100644 --- a/src/bin/psql/print.h +++ b/src/bin/psql/print.h @@ -3,7 +3,7 @@ * * 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 #define PRINT_H @@ -72,7 +72,12 @@ typedef struct _printQueryOpt * * It calls the printTable above with all the things set straight. */ -void - printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout); +void printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout); + +#ifndef __CYGWIN__ +#define DEFAULT_PAGER "more" +#else +#define DEFAULT_PAGER "less" +#endif #endif /* PRINT_H */