]> granicus.if.org Git - postgresql/blobdiff - src/bin/psql/print.h
psql: fix \connect with URIs and conninfo strings
[postgresql] / src / bin / psql / print.h
index 59c32830d22705e08641c0053a58371fa0250f80..322db4d6effb78821f851855db7219f5f9439da7 100644 (file)
 /*
  * psql - the PostgreSQL interactive terminal
  *
- * Copyright 2000 by PostgreSQL Global Development Group
+ * Copyright (c) 2000-2015, PostgreSQL Global Development Group
  *
- * $Header: /cvsroot/pgsql/src/bin/psql/print.h,v 1.12 2001/11/05 17:46:31 momjian Exp $
+ * src/bin/psql/print.h
  */
 #ifndef PRINT_H
 #define PRINT_H
 
 #include "libpq-fe.h"
 
+
 enum printFormat
 {
        PRINT_NOTHING = 0,                      /* to make sure someone initializes this */
        PRINT_UNALIGNED,
        PRINT_ALIGNED,
+       PRINT_WRAPPED,
        PRINT_HTML,
-       PRINT_LATEX
+       PRINT_ASCIIDOC,
+       PRINT_LATEX,
+       PRINT_LATEX_LONGTABLE,
+       PRINT_TROFF_MS
        /* add your favourite output format here ... */
 };
 
+typedef struct printTextLineFormat
+{
+       /* Line drawing characters to be used in various contexts */
+       const char *hrule;                      /* horizontal line character */
+       const char *leftvrule;          /* left vertical line (+horizontal) */
+       const char *midvrule;           /* intra-column vertical line (+horizontal) */
+       const char *rightvrule;         /* right vertical line (+horizontal) */
+} printTextLineFormat;
+
+typedef enum printTextRule
+{
+       /* Additional context for selecting line drawing characters */
+       PRINT_RULE_TOP,                         /* top horizontal line */
+       PRINT_RULE_MIDDLE,                      /* intra-data horizontal line */
+       PRINT_RULE_BOTTOM,                      /* bottom horizontal line */
+       PRINT_RULE_DATA                         /* data line (hrule is unused here) */
+} printTextRule;
+
+typedef enum printTextLineWrap
+{
+       /* Line wrapping conditions */
+       PRINT_LINE_WRAP_NONE,           /* No wrapping */
+       PRINT_LINE_WRAP_WRAP,           /* Wraparound due to overlength line */
+       PRINT_LINE_WRAP_NEWLINE         /* Newline in data */
+} printTextLineWrap;
+
+typedef struct printTextFormat
+{
+       /* A complete line style */
+       const char *name;                       /* for display purposes */
+       printTextLineFormat lrule[4];           /* indexed by enum printTextRule */
+       const char *midvrule_nl;        /* vertical line for continue after newline */
+       const char *midvrule_wrap;      /* vertical line for wrapped data */
+       const char *midvrule_blank; /* vertical line for blank data */
+       const char *header_nl_left; /* left mark after newline */
+       const char *header_nl_right;    /* right mark for newline */
+       const char *nl_left;            /* left mark after newline */
+       const char *nl_right;           /* right mark for newline */
+       const char *wrap_left;          /* left mark after wrapped data */
+       const char *wrap_right;         /* right mark for wrapped data */
+       bool            wrap_right_border;              /* use right-hand border for wrap
+                                                                                * marks when border=0? */
+} printTextFormat;
 
-typedef struct _printTableOpt
+typedef enum unicode_linestyle
 {
-       enum printFormat format;        /* one of the above */
-       bool            expanded;               /* expanded/vertical output (if supported
-                                                                * by output format) */
-       bool            pager;                  /* use pager for output (if to stdout and
-                                                                * stdout is a tty) */
+       UNICODE_LINESTYLE_SINGLE = 0,
+       UNICODE_LINESTYLE_DOUBLE
+} unicode_linestyle;
+
+struct separator
+{
+       char       *separator;
+       bool            separator_zero;
+};
+
+typedef struct printTableOpt
+{
+       enum printFormat format;        /* see enum above */
+       unsigned short int expanded;/* expanded/vertical output (if supported by
+                                                                * output format); 0=no, 1=yes, 2=auto */
+       unsigned short int border;      /* Print a border around the table. 0=none,
+                                                                * 1=dividing lines, 2=full */
+       unsigned short int pager;       /* use pager for output (if to stdout and
+                                                                * stdout is a tty) 0=off 1=on 2=always */
+       int         pager_min_lines;/* don't use pager unless there are at least
+                                                                * this many lines */
        bool            tuples_only;    /* don't output headers, row counts, etc. */
-       unsigned short int border;      /* Print a border around the table.
-                                                                * 0=none, 1=dividing lines, 2=full */
-       char       *fieldSep;           /* field separator for unaligned text mode */
-       char       *recordSep;          /* record separator for unaligned text
-                                                                * mode */
+       bool            start_table;    /* print start decoration, eg <table> */
+       bool            stop_table;             /* print stop decoration, eg </table> */
+       bool            default_footer; /* allow "(xx rows)" default footer */
+       unsigned long prior_records;    /* start offset for record counters */
+       const printTextFormat *line_style;      /* line style (NULL for default) */
+       struct separator fieldSep;      /* field separator for unaligned text mode */
+       struct separator recordSep; /* record separator for unaligned text mode */
+       bool            numericLocale;  /* locale-aware numeric units separator and
+                                                                * decimal marker */
        char       *tableAttr;          /* attributes for HTML <table ...> */
+       int                     encoding;               /* character encoding */
+       int                     env_columns;    /* $COLUMNS on psql start, 0 is unset */
+       int                     columns;                /* target width for wrapped format */
+       unicode_linestyle       unicode_border_linestyle;
+       unicode_linestyle       unicode_column_linestyle;
+       unicode_linestyle       unicode_header_linestyle;
 } printTableOpt;
 
+/*
+ * Table footers are implemented as a singly-linked list.
+ *
+ * This is so that you don't need to know the number of footers in order to
+ * initialise the printTableContent struct, which is very convenient when
+ * preparing complex footers (as in describeOneTableDetails).
+ */
+typedef struct printTableFooter
+{
+       char       *data;
+       struct printTableFooter *next;
+} printTableFooter;
 
 /*
- * Use this to print just any table in the supported formats.
- * - title is just any string (NULL is fine)
- * - headers is the column headings (NULL ptr terminated). It must be given and
- *      complete since the column count is generated from this.
- * - cells are the data cells to be printed. Now you know why the correct
- *      column count is important
- * - footers are lines to be printed below the table
- * - align is an 'l' or an 'r' for every column, if the output format needs it.
- *      (You must specify this long enough. Otherwise anything could happen.)
-*/
-void printTable(const char *title, const char *const * headers,
-                  const char *const * cells, const char *const * footers,
-                  const char *align,
-                  const printTableOpt *opt, FILE *fout);
-
-
-
-typedef struct _printQueryOpt
+ * The table content struct holds all the information which will be displayed
+ * by printTable().
+ */
+typedef struct printTableContent
+{
+       const printTableOpt *opt;
+       const char *title;                      /* May be NULL */
+       int                     ncolumns;               /* Specified in Init() */
+       int                     nrows;                  /* Specified in Init() */
+       const char **headers;           /* NULL-terminated array of header strings */
+       const char **header;            /* Pointer to the last added header */
+       const char **cells;                     /* NULL-terminated array of cell content
+                                                                * strings */
+       const char **cell;                      /* Pointer to the last added cell */
+       long            cellsadded;             /* Number of cells added this far */
+       bool       *cellmustfree;       /* true for cells that need to be free()d */
+       printTableFooter *footers;      /* Pointer to the first footer */
+       printTableFooter *footer;       /* Pointer to the last added footer */
+       char       *aligns;                     /* Array of alignment specifiers; 'l' or 'r',
+                                                                * one per column */
+       char       *align;                      /* Pointer to the last added alignment */
+} printTableContent;
+
+typedef struct printQueryOpt
 {
        printTableOpt topt;                     /* the options above */
        char       *nullPrint;          /* how to print null entities */
        bool            quote;                  /* quote all values as much as possible */
        char       *title;                      /* override title */
-       char      **footers;            /* override footer (default is "(xx
-                                                                * rows)") */
-       bool            default_footer; /* print default footer if footers==NULL */
+       char      **footers;            /* override footer (default is "(xx rows)") */
+       bool            translate_header;               /* do gettext on column headers */
+       const bool *translate_columns;          /* translate_columns[i-1] => do
+                                                                                * gettext on col i */
+       int                     n_translate_columns;    /* length of translate_columns[] */
 } printQueryOpt;
 
-/*
- * Use this to print query results
- *
- * It calls the printTable above with all the things set straight.
- */
-void
-                       printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout);
+
+extern const printTextFormat pg_asciiformat;
+extern const printTextFormat pg_asciiformat_old;
+extern const printTextFormat pg_utf8format;
+
+
+extern FILE *PageOutput(int lines, const printTableOpt *topt);
+extern void ClosePager(FILE *pagerpipe);
+
+extern void html_escaped_print(const char *in, FILE *fout);
+
+extern void printTableInit(printTableContent *const content,
+                          const printTableOpt *opt, const char *title,
+                          const int ncolumns, const int nrows);
+extern void printTableAddHeader(printTableContent *const content,
+                                       char *header, const bool translate, const char align);
+extern void printTableAddCell(printTableContent *const content,
+                                 char *cell, const bool translate, const bool mustfree);
+extern void printTableAddFooter(printTableContent *const content,
+                                       const char *footer);
+extern void printTableSetFooter(printTableContent *const content,
+                                       const char *footer);
+extern void printTableCleanup(printTableContent *const content);
+extern void printTable(const printTableContent *cont, FILE *fout, FILE *flog);
+extern void printQuery(const PGresult *result, const printQueryOpt *opt,
+                  FILE *fout, FILE *flog);
+
+extern void setDecimalLocale(void);
+extern const printTextFormat *get_line_style(const printTableOpt *opt);
+extern void refresh_utf8format(const printTableOpt *opt);
+
+#ifndef __CYGWIN__
+#define DEFAULT_PAGER "more"
+#else
+#define DEFAULT_PAGER "less"
+#endif
 
 #endif   /* PRINT_H */