2 * psql - the PostgreSQL interactive terminal
4 * Copyright (c) 2000-2015, PostgreSQL Global Development Group
16 PRINT_NOTHING = 0, /* to make sure someone initializes this */
22 PRINT_LATEX_LONGTABLE,
24 /* add your favourite output format here ... */
27 typedef struct printTextLineFormat
29 /* Line drawing characters to be used in various contexts */
30 const char *hrule; /* horizontal line character */
31 const char *leftvrule; /* left vertical line (+horizontal) */
32 const char *midvrule; /* intra-column vertical line (+horizontal) */
33 const char *rightvrule; /* right vertical line (+horizontal) */
34 } printTextLineFormat;
36 typedef enum printTextRule
38 /* Additional context for selecting line drawing characters */
39 PRINT_RULE_TOP, /* top horizontal line */
40 PRINT_RULE_MIDDLE, /* intra-data horizontal line */
41 PRINT_RULE_BOTTOM, /* bottom horizontal line */
42 PRINT_RULE_DATA /* data line (hrule is unused here) */
45 typedef enum printTextLineWrap
47 /* Line wrapping conditions */
48 PRINT_LINE_WRAP_NONE, /* No wrapping */
49 PRINT_LINE_WRAP_WRAP, /* Wraparound due to overlength line */
50 PRINT_LINE_WRAP_NEWLINE /* Newline in data */
53 typedef struct printTextFormat
55 /* A complete line style */
56 const char *name; /* for display purposes */
57 printTextLineFormat lrule[4]; /* indexed by enum printTextRule */
58 const char *midvrule_nl; /* vertical line for continue after newline */
59 const char *midvrule_wrap; /* vertical line for wrapped data */
60 const char *midvrule_blank; /* vertical line for blank data */
61 const char *header_nl_left; /* left mark after newline */
62 const char *header_nl_right; /* right mark for newline */
63 const char *nl_left; /* left mark after newline */
64 const char *nl_right; /* right mark for newline */
65 const char *wrap_left; /* left mark after wrapped data */
66 const char *wrap_right; /* right mark for wrapped data */
67 bool wrap_right_border; /* use right-hand border for wrap
68 * marks when border=0? */
71 typedef enum unicode_linestyle
73 UNICODE_LINESTYLE_SINGLE = 0,
74 UNICODE_LINESTYLE_DOUBLE
83 typedef struct printTableOpt
85 enum printFormat format; /* see enum above */
86 unsigned short int expanded;/* expanded/vertical output (if supported by
87 * output format); 0=no, 1=yes, 2=auto */
88 unsigned short int border; /* Print a border around the table. 0=none,
89 * 1=dividing lines, 2=full */
90 unsigned short int pager; /* use pager for output (if to stdout and
91 * stdout is a tty) 0=off 1=on 2=always */
92 bool tuples_only; /* don't output headers, row counts, etc. */
93 bool start_table; /* print start decoration, eg <table> */
94 bool stop_table; /* print stop decoration, eg </table> */
95 bool default_footer; /* allow "(xx rows)" default footer */
96 unsigned long prior_records; /* start offset for record counters */
97 const printTextFormat *line_style; /* line style (NULL for default) */
98 struct separator fieldSep; /* field separator for unaligned text mode */
99 struct separator recordSep; /* record separator for unaligned text mode */
100 bool numericLocale; /* locale-aware numeric units separator and
102 char *tableAttr; /* attributes for HTML <table ...> */
103 int encoding; /* character encoding */
104 int env_columns; /* $COLUMNS on psql start, 0 is unset */
105 int columns; /* target width for wrapped format */
106 unicode_linestyle unicode_border_linestyle;
107 unicode_linestyle unicode_column_linestyle;
108 unicode_linestyle unicode_header_linestyle;
112 * Table footers are implemented as a singly-linked list.
114 * This is so that you don't need to know the number of footers in order to
115 * initialise the printTableContent struct, which is very convenient when
116 * preparing complex footers (as in describeOneTableDetails).
118 typedef struct printTableFooter
121 struct printTableFooter *next;
125 * The table content struct holds all the information which will be displayed
128 typedef struct printTableContent
130 const printTableOpt *opt;
131 const char *title; /* May be NULL */
132 int ncolumns; /* Specified in Init() */
133 int nrows; /* Specified in Init() */
134 const char **headers; /* NULL-terminated array of header strings */
135 const char **header; /* Pointer to the last added header */
136 const char **cells; /* NULL-terminated array of cell content
138 const char **cell; /* Pointer to the last added cell */
139 long cellsadded; /* Number of cells added this far */
140 bool *cellmustfree; /* true for cells that need to be free()d */
141 printTableFooter *footers; /* Pointer to the first footer */
142 printTableFooter *footer; /* Pointer to the last added footer */
143 char *aligns; /* Array of alignment specifiers; 'l' or 'r',
145 char *align; /* Pointer to the last added alignment */
148 typedef struct printQueryOpt
150 printTableOpt topt; /* the options above */
151 char *nullPrint; /* how to print null entities */
152 bool quote; /* quote all values as much as possible */
153 char *title; /* override title */
154 char **footers; /* override footer (default is "(xx rows)") */
155 bool translate_header; /* do gettext on column headers */
156 const bool *translate_columns; /* translate_columns[i-1] => do
157 * gettext on col i */
158 int n_translate_columns; /* length of translate_columns[] */
162 extern const printTextFormat pg_asciiformat;
163 extern const printTextFormat pg_asciiformat_old;
164 extern const printTextFormat pg_utf8format;
167 extern FILE *PageOutput(int lines, unsigned short int pager);
168 extern void ClosePager(FILE *pagerpipe);
170 extern void html_escaped_print(const char *in, FILE *fout);
172 extern void printTableInit(printTableContent *const content,
173 const printTableOpt *opt, const char *title,
174 const int ncolumns, const int nrows);
175 extern void printTableAddHeader(printTableContent *const content,
176 char *header, const bool translate, const char align);
177 extern void printTableAddCell(printTableContent *const content,
178 char *cell, const bool translate, const bool mustfree);
179 extern void printTableAddFooter(printTableContent *const content,
181 extern void printTableSetFooter(printTableContent *const content,
183 extern void printTableCleanup(printTableContent *const content);
184 extern void printTable(const printTableContent *cont, FILE *fout, FILE *flog);
185 extern void printQuery(const PGresult *result, const printQueryOpt *opt,
186 FILE *fout, FILE *flog);
188 extern void setDecimalLocale(void);
189 extern const printTextFormat *get_line_style(const printTableOpt *opt);
190 extern void refresh_utf8format(const printTableOpt *opt);
193 #define DEFAULT_PAGER "more"
195 #define DEFAULT_PAGER "less"