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