PostgreSQL Source Code git master
print.h
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * Query-result printing support for frontend code
4 *
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * src/include/fe_utils/print.h
10 *
11 *-------------------------------------------------------------------------
12 */
13#ifndef PRINT_H
14#define PRINT_H
15
16#include <signal.h>
17
18#include "libpq-fe.h"
19
20
21/* This is not a particularly great place for this ... */
22#ifndef __CYGWIN__
23#define DEFAULT_PAGER "more"
24#else
25#define DEFAULT_PAGER "less"
26#endif
27
29{
30 PRINT_NOTHING = 0, /* to make sure someone initializes this */
40 /* add your favourite output format here ... */
41};
42
43typedef struct printTextLineFormat
44{
45 /* Line drawing characters to be used in various contexts */
46 const char *hrule; /* horizontal line character */
47 const char *leftvrule; /* left vertical line (+horizontal) */
48 const char *midvrule; /* intra-column vertical line (+horizontal) */
49 const char *rightvrule; /* right vertical line (+horizontal) */
51
52typedef enum printTextRule
53{
54 /* Additional context for selecting line drawing characters */
55 PRINT_RULE_TOP, /* top horizontal line */
56 PRINT_RULE_MIDDLE, /* intra-data horizontal line */
57 PRINT_RULE_BOTTOM, /* bottom horizontal line */
58 PRINT_RULE_DATA, /* data line (hrule is unused here) */
60
62{
63 /* Line wrapping conditions */
64 PRINT_LINE_WRAP_NONE, /* No wrapping */
65 PRINT_LINE_WRAP_WRAP, /* Wraparound due to overlength line */
66 PRINT_LINE_WRAP_NEWLINE, /* Newline in data */
68
70{
71 /* Expanded header line width variants */
72 PRINT_XHEADER_FULL, /* do not truncate header line (this is the
73 * default) */
74 PRINT_XHEADER_COLUMN, /* only print header line above the first
75 * column */
76 PRINT_XHEADER_PAGE, /* header line must not be longer than
77 * terminal width */
78 PRINT_XHEADER_EXACT_WIDTH, /* explicitly specified width */
80
81typedef struct printTextFormat
82{
83 /* A complete line style */
84 const char *name; /* for display purposes */
85 printTextLineFormat lrule[4]; /* indexed by enum printTextRule */
86 const char *midvrule_nl; /* vertical line for continue after newline */
87 const char *midvrule_wrap; /* vertical line for wrapped data */
88 const char *midvrule_blank; /* vertical line for blank data */
89 const char *header_nl_left; /* left mark after newline */
90 const char *header_nl_right; /* right mark for newline */
91 const char *nl_left; /* left mark after newline */
92 const char *nl_right; /* right mark for newline */
93 const char *wrap_left; /* left mark after wrapped data */
94 const char *wrap_right; /* right mark for wrapped data */
95 bool wrap_right_border; /* use right-hand border for wrap marks
96 * when border=0? */
98
100{
104
106{
109};
110
111typedef struct printTableOpt
112{
113 enum printFormat format; /* see enum above */
114 unsigned short int expanded; /* expanded/vertical output (if supported
115 * by output format); 0=no, 1=yes, 2=auto */
117 * line in expanded mode */
118 int expanded_header_exact_width; /* explicit width for header
119 * line in expanded mode */
120 unsigned short int border; /* Print a border around the table. 0=none,
121 * 1=dividing lines, 2=full */
122 unsigned short int pager; /* use pager for output (if to stdout and
123 * stdout is a tty) 0=off 1=on 2=always */
124 int pager_min_lines; /* don't use pager unless there are at
125 * least this many lines */
126 bool tuples_only; /* don't output headers, row counts, etc. */
127 bool start_table; /* print start decoration, eg <table> */
128 bool stop_table; /* print stop decoration, eg </table> */
129 bool default_footer; /* allow "(xx rows)" default footer */
130 unsigned long prior_records; /* start offset for record counters */
131 const printTextFormat *line_style; /* line style (NULL for default) */
132 struct separator fieldSep; /* field separator for unaligned text mode */
133 struct separator recordSep; /* record separator for unaligned text mode */
134 char csvFieldSep[2]; /* field separator for csv format */
135 bool numericLocale; /* locale-aware numeric units separator and
136 * decimal marker */
137 char *tableAttr; /* attributes for HTML <table ...> */
138 int encoding; /* character encoding */
139 int env_columns; /* $COLUMNS on psql start, 0 is unset */
140 int columns; /* target width for wrapped format */
145
146/*
147 * Table footers are implemented as a singly-linked list.
148 *
149 * This is so that you don't need to know the number of footers in order to
150 * initialise the printTableContent struct, which is very convenient when
151 * preparing complex footers (as in describeOneTableDetails).
152 */
153typedef struct printTableFooter
154{
155 char *data;
158
159/*
160 * The table content struct holds all the information which will be displayed
161 * by printTable().
162 */
163typedef struct printTableContent
164{
166 const char *title; /* May be NULL */
167 int ncolumns; /* Specified in Init() */
168 int nrows; /* Specified in Init() */
169 const char **headers; /* NULL-terminated array of header strings */
170 const char **header; /* Pointer to the last added header */
171 const char **cells; /* NULL-terminated array of cell content
172 * strings */
173 const char **cell; /* Pointer to the last added cell */
174 uint64 cellsadded; /* Number of cells added this far */
175 bool *cellmustfree; /* true for cells that need to be free()d */
176 printTableFooter *footers; /* Pointer to the first footer */
177 printTableFooter *footer; /* Pointer to the last added footer */
178 char *aligns; /* Array of alignment specifiers; 'l' or 'r',
179 * one per column */
180 char *align; /* Pointer to the last added alignment */
182
183typedef struct printQueryOpt
184{
185 printTableOpt topt; /* the options above */
186 char *nullPrint; /* how to print null entities */
187 char *title; /* override title */
188 char **footers; /* override footer (default is "(xx rows)") */
189 bool translate_header; /* do gettext on column headers */
190 const bool *translate_columns; /* translate_columns[i-1] => do gettext on
191 * col i */
192 int n_translate_columns; /* length of translate_columns[] */
194
195
196extern PGDLLIMPORT volatile sig_atomic_t cancel_pressed;
197
200extern PGDLLIMPORT printTextFormat pg_utf8format; /* ideally would be const,
201 * but... */
202
203
204extern void disable_sigpipe_trap(void);
205extern void restore_sigpipe_trap(void);
206extern void set_sigpipe_trap_state(bool ignore);
207
208extern FILE *PageOutput(int lines, const printTableOpt *topt);
209extern void ClosePager(FILE *pagerpipe);
210
211extern void html_escaped_print(const char *in, FILE *fout);
212
213extern void printTableInit(printTableContent *const content,
214 const printTableOpt *opt, const char *title,
215 const int ncolumns, const int nrows);
216extern void printTableAddHeader(printTableContent *const content,
217 char *header, const bool translate, const char align);
218extern void printTableAddCell(printTableContent *const content,
219 char *cell, const bool translate, const bool mustfree);
220extern void printTableAddFooter(printTableContent *const content,
221 const char *footer);
222extern void printTableSetFooter(printTableContent *const content,
223 const char *footer);
224extern void printTableCleanup(printTableContent *const content);
225extern void printTable(const printTableContent *cont,
226 FILE *fout, bool is_pager, FILE *flog);
227extern void printQuery(const PGresult *result, const printQueryOpt *opt,
228 FILE *fout, bool is_pager, FILE *flog);
229
230extern char column_type_alignment(Oid);
231
232extern void setDecimalLocale(void);
233extern const printTextFormat *get_line_style(const printTableOpt *opt);
234extern void refresh_utf8format(const printTableOpt *opt);
235
236#endif /* PRINT_H */
#define PGDLLIMPORT
Definition: c.h:1291
uint64_t uint64
Definition: c.h:503
struct printTableContent printTableContent
void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
Definition: print.c:3172
PGDLLIMPORT volatile sig_atomic_t cancel_pressed
Definition: print.c:43
void printTableCleanup(printTableContent *const content)
Definition: print.c:3353
void restore_sigpipe_trap(void)
Definition: print.c:3062
printXheaderWidthType
Definition: print.h:70
@ PRINT_XHEADER_EXACT_WIDTH
Definition: print.h:78
@ PRINT_XHEADER_PAGE
Definition: print.h:76
@ PRINT_XHEADER_COLUMN
Definition: print.h:74
@ PRINT_XHEADER_FULL
Definition: print.h:72
void printQuery(const PGresult *result, const printQueryOpt *opt, FILE *fout, bool is_pager, FILE *flog)
Definition: print.c:3549
PGDLLIMPORT printTextFormat pg_utf8format
Definition: print.c:99
struct printTableOpt printTableOpt
struct printTextLineFormat printTextLineFormat
const printTextFormat * get_line_style(const printTableOpt *opt)
Definition: print.c:3677
struct printTextFormat printTextFormat
printTextRule
Definition: print.h:53
@ PRINT_RULE_MIDDLE
Definition: print.h:56
@ PRINT_RULE_BOTTOM
Definition: print.h:57
@ PRINT_RULE_DATA
Definition: print.h:58
@ PRINT_RULE_TOP
Definition: print.h:55
FILE * PageOutput(int lines, const printTableOpt *topt)
Definition: print.c:3089
void refresh_utf8format(const printTableOpt *opt)
Definition: print.c:3691
PGDLLIMPORT const printTextFormat pg_asciiformat
Definition: print.c:56
void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree)
Definition: print.c:3260
PGDLLIMPORT const printTextFormat pg_asciiformat_old
Definition: print.c:77
void printTableSetFooter(printTableContent *const content, const char *footer)
Definition: print.c:3335
struct printTableFooter printTableFooter
void ClosePager(FILE *pagerpipe)
Definition: print.c:3141
unicode_linestyle
Definition: print.h:100
@ UNICODE_LINESTYLE_SINGLE
Definition: print.h:101
@ UNICODE_LINESTYLE_DOUBLE
Definition: print.h:102
void disable_sigpipe_trap(void)
Definition: print.c:3039
printTextLineWrap
Definition: print.h:62
@ PRINT_LINE_WRAP_WRAP
Definition: print.h:65
@ PRINT_LINE_WRAP_NEWLINE
Definition: print.h:66
@ PRINT_LINE_WRAP_NONE
Definition: print.h:64
void printTable(const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
Definition: print.c:3443
void html_escaped_print(const char *in, FILE *fout)
Definition: print.c:1952
printFormat
Definition: print.h:29
@ PRINT_LATEX_LONGTABLE
Definition: print.h:36
@ PRINT_CSV
Definition: print.h:33
@ PRINT_UNALIGNED
Definition: print.h:38
@ PRINT_ALIGNED
Definition: print.h:31
@ PRINT_TROFF_MS
Definition: print.h:37
@ PRINT_ASCIIDOC
Definition: print.h:32
@ PRINT_NOTHING
Definition: print.h:30
@ PRINT_LATEX
Definition: print.h:35
@ PRINT_HTML
Definition: print.h:34
@ PRINT_WRAPPED
Definition: print.h:39
struct printQueryOpt printQueryOpt
void printTableAddFooter(printTableContent *const content, const char *footer)
Definition: print.c:3310
void set_sigpipe_trap_state(bool ignore)
Definition: print.c:3075
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
Definition: print.c:3220
char column_type_alignment(Oid)
Definition: print.c:3614
void setDecimalLocale(void)
Definition: print.c:3641
Datum translate(PG_FUNCTION_ARGS)
unsigned int Oid
Definition: postgres_ext.h:30
const bool * translate_columns
Definition: print.h:190
printTableOpt topt
Definition: print.h:185
char * nullPrint
Definition: print.h:186
char * title
Definition: print.h:187
char ** footers
Definition: print.h:188
bool translate_header
Definition: print.h:189
int n_translate_columns
Definition: print.h:192
const printTableOpt * opt
Definition: print.h:165
uint64 cellsadded
Definition: print.h:174
char * align
Definition: print.h:180
const char ** header
Definition: print.h:170
char * aligns
Definition: print.h:178
printTableFooter * footers
Definition: print.h:176
bool * cellmustfree
Definition: print.h:175
const char ** headers
Definition: print.h:169
const char ** cell
Definition: print.h:173
const char * title
Definition: print.h:166
printTableFooter * footer
Definition: print.h:177
const char ** cells
Definition: print.h:171
char * data
Definition: print.h:155
struct printTableFooter * next
Definition: print.h:156
bool start_table
Definition: print.h:127
unsigned short int expanded
Definition: print.h:114
unsigned long prior_records
Definition: print.h:130
unicode_linestyle unicode_border_linestyle
Definition: print.h:141
bool tuples_only
Definition: print.h:126
int columns
Definition: print.h:140
enum printFormat format
Definition: print.h:113
struct separator fieldSep
Definition: print.h:132
int expanded_header_exact_width
Definition: print.h:118
struct separator recordSep
Definition: print.h:133
printXheaderWidthType expanded_header_width_type
Definition: print.h:116
char csvFieldSep[2]
Definition: print.h:134
const printTextFormat * line_style
Definition: print.h:131
bool default_footer
Definition: print.h:129
int pager_min_lines
Definition: print.h:124
unsigned short int pager
Definition: print.h:122
char * tableAttr
Definition: print.h:137
bool numericLocale
Definition: print.h:135
int encoding
Definition: print.h:138
unsigned short int border
Definition: print.h:120
unicode_linestyle unicode_header_linestyle
Definition: print.h:143
int env_columns
Definition: print.h:139
unicode_linestyle unicode_column_linestyle
Definition: print.h:142
bool stop_table
Definition: print.h:128
bool wrap_right_border
Definition: print.h:95
const char * nl_right
Definition: print.h:92
const char * wrap_left
Definition: print.h:93
const char * midvrule_blank
Definition: print.h:88
const char * header_nl_left
Definition: print.h:89
const char * nl_left
Definition: print.h:91
const char * midvrule_nl
Definition: print.h:86
printTextLineFormat lrule[4]
Definition: print.h:85
const char * wrap_right
Definition: print.h:94
const char * midvrule_wrap
Definition: print.h:87
const char * name
Definition: print.h:84
const char * header_nl_right
Definition: print.h:90
const char * hrule
Definition: print.h:46
const char * rightvrule
Definition: print.h:49
const char * midvrule
Definition: print.h:48
const char * leftvrule
Definition: print.h:47
bool separator_zero
Definition: print.h:108
char * separator
Definition: print.h:107