Re: [BUGS] psql does not invoke pager on \h *

Поиск
Список
Период
Сортировка
От Bruce Momjian
Тема Re: [BUGS] psql does not invoke pager on \h *
Дата
Msg-id 200210231922.g9NJMs012432@candle.pha.pa.us
обсуждение исходный текст
Список pgsql-patches
I have applied the following patch which will page psql \h.  This will
appear in 7.3beta3 and in tomorrow's snapshot.

---------------------------------------------------------------------------

Jean-Luc Lachance wrote:
> Subject says it all
>
> JLL
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/bin/psql/command.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/command.c,v
retrieving revision 1.83
diff -c -c -r1.83 command.c
*** src/bin/psql/command.c    15 Oct 2002 02:24:15 -0000    1.83
--- src/bin/psql/command.c    23 Oct 2002 19:15:10 -0000
***************
*** 493,499 ****
      /* help */
      else if (strcmp(cmd, "h") == 0 || strcmp(cmd, "help") == 0)
      {
!         helpSQL(options_string ? &options_string[strspn(options_string, " \t\n\r")] : NULL);
          /* set pointer to end of line */
          if (string)
              string += strlen(string);
--- 493,500 ----
      /* help */
      else if (strcmp(cmd, "h") == 0 || strcmp(cmd, "help") == 0)
      {
!         helpSQL(options_string ? &options_string[strspn(options_string, " \t\n\r")] : NULL,
!                 pset.popt.topt.pager);
          /* set pointer to end of line */
          if (string)
              string += strlen(string);
Index: src/bin/psql/common.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/common.c,v
retrieving revision 1.48
diff -c -c -r1.48 common.c
*** src/bin/psql/common.c    15 Oct 2002 16:44:21 -0000    1.48
--- src/bin/psql/common.c    23 Oct 2002 19:15:11 -0000
***************
*** 515,517 ****
--- 515,560 ----

      return success;
  }
+
+
+ /*
+  * PageOutput
+  *
+  * Tests if pager is needed and returns appropriate FILE pointer.
+  */
+ FILE *
+ PageOutput(int lines, bool pager)
+ {
+     /* 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
+         int            result;
+         struct winsize screen_size;
+
+         result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
+         if (result == -1 || lines > screen_size.ws_row)
+         {
+ #endif
+             pagerprog = getenv("PAGER");
+             if (!pagerprog)
+                 pagerprog = DEFAULT_PAGER;
+ #ifndef WIN32
+             pqsignal(SIGPIPE, SIG_IGN);
+ #endif
+             return popen(pagerprog, "w");
+ #ifdef TIOCGWINSZ
+         }
+ #endif
+     }
+
+     return stdout;
+ }
Index: src/bin/psql/common.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/common.h,v
retrieving revision 1.19
diff -c -c -r1.19 common.h
*** src/bin/psql/common.h    15 Oct 2002 02:24:16 -0000    1.19
--- src/bin/psql/common.h    23 Oct 2002 19:15:11 -0000
***************
*** 37,42 ****
--- 37,44 ----

  extern bool SendQuery(const char *query);

+ extern FILE *PageOutput(int lines, bool pager);
+
  /* sprompt.h */
  extern char *simple_prompt(const char *prompt, int maxlen, bool echo);

Index: src/bin/psql/help.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/help.c,v
retrieving revision 1.58
diff -c -c -r1.58 help.c
*** src/bin/psql/help.c    18 Oct 2002 22:05:36 -0000    1.58
--- src/bin/psql/help.c    23 Oct 2002 19:15:13 -0000
***************
*** 6,11 ****
--- 6,12 ----
   * $Header: /cvsroot/pgsql-server/src/bin/psql/help.c,v 1.58 2002/10/18 22:05:36 petere Exp $
   */
  #include "postgres_fe.h"
+ #include "common.h"
  #include "print.h"
  #include "help.h"

***************
*** 161,208 ****
  void
  slashUsage(bool pager)
  {
!     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
!         int            result;
!         struct winsize screen_size;
!
!         result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
!         if (result == -1 || 50 > screen_size.ws_row)
!         {
! #endif
!             pagerprog = getenv("PAGER");
!             if (!pagerprog)
!                 pagerprog = DEFAULT_PAGER;
!             pagerfd = popen(pagerprog, "w");
! #ifdef TIOCGWINSZ
!         }
! #endif
!     }

!     if (pagerfd)
!     {
!         output = pagerfd;
! #ifndef WIN32
!         pqsignal(SIGPIPE, SIG_IGN);
! #endif
!     }
!     else
!         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
--- 162,172 ----
  void
  slashUsage(bool pager)
  {
!     FILE       *output;

!     output = PageOutput(50, pager);

!     /* if you add/remove a line here, change the row count above */

      /*
       * if this " is the start of the string then it ought to end there to
***************
*** 262,270 ****
      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 (pagerfd)
      {
!         pclose(pagerfd);
  #ifndef WIN32
          pqsignal(SIGPIPE, SIG_DFL);
  #endif
--- 226,234 ----
      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 (output != stdout)
      {
!         pclose(output);
  #ifndef WIN32
          pqsignal(SIGPIPE, SIG_DFL);
  #endif
***************
*** 278,284 ****
   *
   */
  void
! helpSQL(const char *topic)
  {
  #define VALUE_OR_NULL(a) ((a) ? (a) : "")

--- 242,248 ----
   *
   */
  void
! helpSQL(const char *topic, bool pager)
  {
  #define VALUE_OR_NULL(a) ((a) ? (a) : "")

***************
*** 286,306 ****
      {
          int            i;
          int            items_per_column = (QL_HELP_COUNT + 2) / 3;

!         puts(_("Available help:"));

          for (i = 0; i < items_per_column; i++)
          {
!             printf("  %-26s%-26s",
                     VALUE_OR_NULL(QL_HELP[i].cmd),
                     VALUE_OR_NULL(QL_HELP[i + items_per_column].cmd));
              if (i + 2 * items_per_column < QL_HELP_COUNT)
!                 printf("%-26s",
                     VALUE_OR_NULL(QL_HELP[i + 2 * items_per_column].cmd));
!             fputc('\n', stdout);
          }
      }
-
      else
      {
          int            i;
--- 250,280 ----
      {
          int            i;
          int            items_per_column = (QL_HELP_COUNT + 2) / 3;
+         FILE        *output;
+
+         output = PageOutput(items_per_column, pager);

!         fputs(_("Available help:\n"), output);

          for (i = 0; i < items_per_column; i++)
          {
!             fprintf(output, "  %-26s%-26s",
                     VALUE_OR_NULL(QL_HELP[i].cmd),
                     VALUE_OR_NULL(QL_HELP[i + items_per_column].cmd));
              if (i + 2 * items_per_column < QL_HELP_COUNT)
!                 fprintf(output, "%-26s",
                     VALUE_OR_NULL(QL_HELP[i + 2 * items_per_column].cmd));
!             fputc('\n', output);
!         }
!         /* Only close if we used the pager */
!         if (output != stdout)
!         {
!             pclose(output);
! #ifndef WIN32
!             pqsignal(SIGPIPE, SIG_DFL);
! #endif
          }
      }
      else
      {
          int            i;
Index: src/bin/psql/help.h
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/help.h,v
retrieving revision 1.9
diff -c -c -r1.9 help.h
*** src/bin/psql/help.h    15 Jul 2002 01:56:25 -0000    1.9
--- src/bin/psql/help.h    23 Oct 2002 19:15:13 -0000
***************
*** 12,18 ****

  void        slashUsage(bool pager);

! void        helpSQL(const char *topic);

  void        print_copyright(void);

--- 12,18 ----

  void        slashUsage(bool pager);

! void        helpSQL(const char *topic, bool pager);

  void        print_copyright(void);

Index: src/bin/psql/print.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/bin/psql/print.c,v
retrieving revision 1.32
diff -c -c -r1.32 print.c
*** src/bin/psql/print.c    3 Oct 2002 17:09:42 -0000    1.32
--- src/bin/psql/print.c    23 Oct 2002 19:15:15 -0000
***************
*** 6,11 ****
--- 6,12 ----
   * $Header: /cvsroot/pgsql-server/src/bin/psql/print.c,v 1.32 2002/10/03 17:09:42 momjian Exp $
   */
  #include "postgres_fe.h"
+ #include "common.h"
  #include "print.h"

  #include <math.h>
***************
*** 970,978 ****
  {
      const char *default_footer[] = {NULL};
      unsigned short int border = opt->border;
!     FILE       *pagerfd = NULL,
!                *output;
!

      if (opt->format == PRINT_NOTHING)
          return;
--- 971,977 ----
  {
      const char *default_footer[] = {NULL};
      unsigned short int border = opt->border;
!     FILE        *output;

      if (opt->format == PRINT_NOTHING)
          return;
***************
*** 983,1007 ****
      if (opt->format != PRINT_HTML && border > 2)
          border = 2;

!
!     /* check whether we need / can / are supposed to use pager */
!     if (fout == stdout && opt->pager
! #ifndef WIN32
!         &&
!         isatty(fileno(stdin)) &&
!         isatty(fileno(stdout))
! #endif
!         )
      {
!         const char *pagerprog;
!
! #ifdef TIOCGWINSZ
!         unsigned int col_count = 0,
!                     row_count = 0,
!                     lines;
          const char *const * ptr;
-         int            result;
-         struct winsize screen_size;

          /* rough estimate of columns and rows */
          if (headers)
--- 982,993 ----
      if (opt->format != PRINT_HTML && border > 2)
          border = 2;

!     if (fout == stdout)
      {
!         int col_count = 0,
!             row_count = 0,
!             lines;
          const char *const * ptr;

          /* rough estimate of columns and rows */
          if (headers)
***************
*** 1020,1050 ****
          if (footers && !opt->tuples_only)
              for (ptr = footers; *ptr; ptr++)
                  lines++;
!
!         result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
!         if (result == -1 || lines > screen_size.ws_row)
!         {
! #endif
!             pagerprog = getenv("PAGER");
!             if (!pagerprog)
!                 pagerprog = DEFAULT_PAGER;
!             pagerfd = popen(pagerprog, "w");
! #ifdef TIOCGWINSZ
!         }
! #endif
!     }
!
!     if (pagerfd)
!     {
!         output = pagerfd;
! #ifndef WIN32
!         pqsignal(SIGPIPE, SIG_IGN);
! #endif
      }
      else
          output = fout;

-
      /* print the stuff */

      switch (opt->format)
--- 1006,1016 ----
          if (footers && !opt->tuples_only)
              for (ptr = footers; *ptr; ptr++)
                  lines++;
!         output = PageOutput(lines, opt->pager);
      }
      else
          output = fout;

      /* print the stuff */

      switch (opt->format)
***************
*** 1077,1085 ****
              fprintf(stderr, "+ Oops, you shouldn't see this!\n");
      }

!     if (pagerfd)
      {
!         pclose(pagerfd);
  #ifndef WIN32
          pqsignal(SIGPIPE, SIG_DFL);
  #endif
--- 1043,1052 ----
              fprintf(stderr, "+ Oops, you shouldn't see this!\n");
      }

!     /* Only close if we used the pager */
!     if (fout == stdout && output != stdout)
      {
!         pclose(output);
  #ifndef WIN32
          pqsignal(SIGPIPE, SIG_DFL);
  #endif

В списке pgsql-patches по дате отправления:

Предыдущее
От: Kris Jurka
Дата:
Сообщение: Re: [JDBC] Anoter JDBC Error
Следующее
От: Joseph Shraibman
Дата:
Сообщение: patch for pgsql/doc/src/sgml/ref/postgres-ref.sgml