PostgreSQL Source Code git master
print.h File Reference
#include <signal.h>
#include "libpq-fe.h"
Include dependency graph for print.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  printTextLineFormat
 
struct  printTextFormat
 
struct  separator
 
struct  printTableOpt
 
struct  printTableFooter
 
struct  printTableContent
 
struct  printQueryOpt
 

Macros

#define DEFAULT_PAGER   "more"
 

Typedefs

typedef struct printTextLineFormat printTextLineFormat
 
typedef enum printTextRule printTextRule
 
typedef enum printTextLineWrap printTextLineWrap
 
typedef enum printXheaderWidthType printXheaderWidthType
 
typedef struct printTextFormat printTextFormat
 
typedef enum unicode_linestyle unicode_linestyle
 
typedef struct printTableOpt printTableOpt
 
typedef struct printTableFooter printTableFooter
 
typedef struct printTableContent printTableContent
 
typedef struct printQueryOpt printQueryOpt
 

Enumerations

enum  printFormat {
  PRINT_NOTHING = 0 , PRINT_ALIGNED , PRINT_ASCIIDOC , PRINT_CSV ,
  PRINT_HTML , PRINT_LATEX , PRINT_LATEX_LONGTABLE , PRINT_TROFF_MS ,
  PRINT_UNALIGNED , PRINT_WRAPPED
}
 
enum  printTextRule { PRINT_RULE_TOP , PRINT_RULE_MIDDLE , PRINT_RULE_BOTTOM , PRINT_RULE_DATA }
 
enum  printTextLineWrap { PRINT_LINE_WRAP_NONE , PRINT_LINE_WRAP_WRAP , PRINT_LINE_WRAP_NEWLINE }
 
enum  printXheaderWidthType { PRINT_XHEADER_FULL , PRINT_XHEADER_COLUMN , PRINT_XHEADER_PAGE , PRINT_XHEADER_EXACT_WIDTH }
 
enum  unicode_linestyle { UNICODE_LINESTYLE_SINGLE = 0 , UNICODE_LINESTYLE_DOUBLE }
 

Functions

void disable_sigpipe_trap (void)
 
void restore_sigpipe_trap (void)
 
void set_sigpipe_trap_state (bool ignore)
 
FILE * PageOutput (int lines, const printTableOpt *topt)
 
void ClosePager (FILE *pagerpipe)
 
void html_escaped_print (const char *in, FILE *fout)
 
void printTableInit (printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
 
void printTableAddHeader (printTableContent *const content, char *header, const bool translate, const char align)
 
void printTableAddCell (printTableContent *const content, char *cell, const bool translate, const bool mustfree)
 
void printTableAddFooter (printTableContent *const content, const char *footer)
 
void printTableSetFooter (printTableContent *const content, const char *footer)
 
void printTableCleanup (printTableContent *const content)
 
void printTable (const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
 
void printQuery (const PGresult *result, const printQueryOpt *opt, FILE *fout, bool is_pager, FILE *flog)
 
char column_type_alignment (Oid)
 
void setDecimalLocale (void)
 
const printTextFormatget_line_style (const printTableOpt *opt)
 
void refresh_utf8format (const printTableOpt *opt)
 

Variables

PGDLLIMPORT volatile sig_atomic_t cancel_pressed
 
PGDLLIMPORT const printTextFormat pg_asciiformat
 
PGDLLIMPORT const printTextFormat pg_asciiformat_old
 
PGDLLIMPORT printTextFormat pg_utf8format
 

Macro Definition Documentation

◆ DEFAULT_PAGER

#define DEFAULT_PAGER   "more"

Definition at line 23 of file print.h.

Typedef Documentation

◆ printQueryOpt

typedef struct printQueryOpt printQueryOpt

◆ printTableContent

◆ printTableFooter

◆ printTableOpt

typedef struct printTableOpt printTableOpt

◆ printTextFormat

◆ printTextLineFormat

◆ printTextLineWrap

◆ printTextRule

◆ printXheaderWidthType

◆ unicode_linestyle

Enumeration Type Documentation

◆ printFormat

Enumerator
PRINT_NOTHING 
PRINT_ALIGNED 
PRINT_ASCIIDOC 
PRINT_CSV 
PRINT_HTML 
PRINT_LATEX 
PRINT_LATEX_LONGTABLE 
PRINT_TROFF_MS 
PRINT_UNALIGNED 
PRINT_WRAPPED 

Definition at line 28 of file print.h.

29{
30 PRINT_NOTHING = 0, /* to make sure someone initializes this */
40 /* add your favourite output format here ... */
41};
@ 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

◆ printTextLineWrap

Enumerator
PRINT_LINE_WRAP_NONE 
PRINT_LINE_WRAP_WRAP 
PRINT_LINE_WRAP_NEWLINE 

Definition at line 61 of file print.h.

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 */
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

◆ printTextRule

Enumerator
PRINT_RULE_TOP 
PRINT_RULE_MIDDLE 
PRINT_RULE_BOTTOM 
PRINT_RULE_DATA 

Definition at line 52 of file print.h.

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) */
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

◆ printXheaderWidthType

Enumerator
PRINT_XHEADER_FULL 
PRINT_XHEADER_COLUMN 
PRINT_XHEADER_PAGE 
PRINT_XHEADER_EXACT_WIDTH 

Definition at line 69 of file print.h.

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 */
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

◆ unicode_linestyle

Enumerator
UNICODE_LINESTYLE_SINGLE 
UNICODE_LINESTYLE_DOUBLE 

Definition at line 99 of file print.h.

100{
unicode_linestyle
Definition: print.h:100
@ UNICODE_LINESTYLE_SINGLE
Definition: print.h:101
@ UNICODE_LINESTYLE_DOUBLE
Definition: print.h:102

Function Documentation

◆ ClosePager()

void ClosePager ( FILE *  pagerpipe)

Definition at line 3160 of file print.c.

3161{
3162 if (pagerpipe && pagerpipe != stdout)
3163 {
3164 /*
3165 * If printing was canceled midstream, warn about it.
3166 *
3167 * Some pagers like less use Ctrl-C as part of their command set. Even
3168 * so, we abort our processing and warn the user what we did. If the
3169 * pager quit as a result of the SIGINT, this message won't go
3170 * anywhere ...
3171 */
3172 if (cancel_pressed)
3173 fprintf(pagerpipe, _("Interrupted\n"));
3174
3175 pclose(pagerpipe);
3177 }
3178}
#define fprintf(file, fmt, msg)
Definition: cubescan.l:21
#define _(x)
Definition: elog.c:91
void restore_sigpipe_trap(void)
Definition: print.c:3047
volatile sig_atomic_t cancel_pressed
Definition: print.c:48

References _, cancel_pressed, fprintf, restore_sigpipe_trap(), and generate_unaccent_rules::stdout.

Referenced by exec_command_sf_sv(), ExecQueryAndProcessResults(), helpSQL(), helpVariables(), print_aligned_text(), print_aligned_vertical(), printHistory(), printTable(), slashUsage(), and usage().

◆ column_type_alignment()

char column_type_alignment ( Oid  ftype)

Definition at line 3811 of file print.c.

3812{
3813 char align;
3814
3815 switch (ftype)
3816 {
3817 case INT2OID:
3818 case INT4OID:
3819 case INT8OID:
3820 case FLOAT4OID:
3821 case FLOAT8OID:
3822 case NUMERICOID:
3823 case OIDOID:
3824 case XIDOID:
3825 case XID8OID:
3826 case CIDOID:
3827 case MONEYOID:
3828 align = 'r';
3829 break;
3830 default:
3831 align = 'l';
3832 break;
3833 }
3834 return align;
3835}

Referenced by printCrosstab(), and printQuery().

◆ disable_sigpipe_trap()

void disable_sigpipe_trap ( void  )

Definition at line 3024 of file print.c.

3025{
3026#ifndef WIN32
3027 pqsignal(SIGPIPE, SIG_IGN);
3028#endif
3029}
#define pqsignal
Definition: port.h:552
#define SIGPIPE
Definition: win32_port.h:163

References pqsignal, and SIGPIPE.

Referenced by do_copy(), do_watch(), exec_command_write(), PageOutputInternal(), and SetupGOutput().

◆ get_line_style()

const printTextFormat * get_line_style ( const printTableOpt opt)

Definition at line 3874 of file print.c.

3875{
3876 /*
3877 * Note: this function mainly exists to preserve the convention that a
3878 * printTableOpt struct can be initialized to zeroes to get default
3879 * behavior.
3880 */
3881 if (opt->line_style != NULL)
3882 return opt->line_style;
3883 else
3884 return &pg_asciiformat;
3885}
const printTextFormat pg_asciiformat
Definition: print.c:61
const printTextFormat * line_style
Definition: print.h:131

References printTableOpt::line_style, and pg_asciiformat.

Referenced by print_aligned_text(), print_aligned_vertical(), print_aligned_vertical_line(), printPsetInfo(), and pset_value_string().

◆ html_escaped_print()

void html_escaped_print ( const char *  in,
FILE *  fout 
)

Definition at line 1937 of file print.c.

1938{
1939 const char *p;
1940 bool leading_space = true;
1941
1942 for (p = in; *p; p++)
1943 {
1944 switch (*p)
1945 {
1946 case '&':
1947 fputs("&amp;", fout);
1948 break;
1949 case '<':
1950 fputs("&lt;", fout);
1951 break;
1952 case '>':
1953 fputs("&gt;", fout);
1954 break;
1955 case '\n':
1956 fputs("<br />\n", fout);
1957 break;
1958 case '"':
1959 fputs("&quot;", fout);
1960 break;
1961 case ' ':
1962 /* protect leading space, for EXPLAIN output */
1963 if (leading_space)
1964 fputs("&nbsp;", fout);
1965 else
1966 fputs(" ", fout);
1967 break;
1968 default:
1969 fputc(*p, fout);
1970 }
1971 if (*p != ' ')
1972 leading_space = false;
1973 }
1974}

Referenced by print_html_text(), print_html_vertical(), and PrintQueryStatus().

◆ PageOutput()

FILE * PageOutput ( int  lines,
const printTableOpt topt 
)

Definition at line 3078 of file print.c.

3079{
3080 return PageOutputInternal(lines, topt, NULL, NULL, false);
3081}
static FILE * PageOutputInternal(int lines, const printTableOpt *topt, const printTableContent *cont, const unsigned int *width_wrap, bool vertical)
Definition: print.c:3090

References PageOutputInternal().

Referenced by exec_command_sf_sv(), ExecQueryAndProcessResults(), helpSQL(), helpVariables(), print_aligned_text(), printHistory(), slashUsage(), and usage().

◆ printQuery()

void printQuery ( const PGresult result,
const printQueryOpt opt,
FILE *  fout,
bool  is_pager,
FILE *  flog 
)

Definition at line 3742 of file print.c.

3744{
3745 printTableContent cont;
3746 int i,
3747 r,
3748 c;
3749
3750 if (cancel_pressed)
3751 return;
3752
3753 printTableInit(&cont, &opt->topt, opt->title,
3754 PQnfields(result), PQntuples(result));
3755
3756 /* Assert caller supplied enough translate_columns[] entries */
3757 Assert(opt->translate_columns == NULL ||
3758 opt->n_translate_columns >= cont.ncolumns);
3759
3760 for (i = 0; i < cont.ncolumns; i++)
3761 {
3762 printTableAddHeader(&cont, PQfname(result, i),
3763 opt->translate_header,
3764 column_type_alignment(PQftype(result, i)));
3765 }
3766
3767 /* set cells */
3768 for (r = 0; r < cont.nrows; r++)
3769 {
3770 for (c = 0; c < cont.ncolumns; c++)
3771 {
3772 char *cell;
3773 bool mustfree = false;
3774 bool translate;
3775
3776 if (PQgetisnull(result, r, c))
3777 cell = opt->nullPrint ? opt->nullPrint : "";
3778 else if (PQftype(result, c) == BOOLOID)
3779 cell = (PQgetvalue(result, r, c)[0] == 't' ?
3780 (opt->truePrint ? opt->truePrint : "t") :
3781 (opt->falsePrint ? opt->falsePrint : "f"));
3782 else
3783 {
3784 cell = PQgetvalue(result, r, c);
3785 if (cont.aligns[c] == 'r' && opt->topt.numericLocale)
3786 {
3787 cell = format_numeric_locale(cell);
3788 mustfree = true;
3789 }
3790 }
3791
3793 printTableAddCell(&cont, cell, translate, mustfree);
3794 }
3795 }
3796
3797 /* set footers */
3798 if (opt->footers)
3799 {
3800 char **footer;
3801
3802 for (footer = opt->footers; *footer; footer++)
3803 printTableAddFooter(&cont, *footer);
3804 }
3805
3806 printTable(&cont, fout, is_pager, flog);
3807 printTableCleanup(&cont);
3808}
Oid PQftype(const PGresult *res, int field_num)
Definition: fe-exec.c:3736
void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
Definition: print.c:3191
void printTableCleanup(printTableContent *const content)
Definition: print.c:3372
char column_type_alignment(Oid ftype)
Definition: print.c:3811
void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree)
Definition: print.c:3279
static char * format_numeric_locale(const char *my_str)
Definition: print.c:330
void printTable(const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
Definition: print.c:3636
void printTableAddFooter(printTableContent *const content, const char *footer)
Definition: print.c:3329
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
Definition: print.c:3239
Assert(PointerIsAligned(start, uint64))
int i
Definition: isn.c:77
#define PQgetvalue
Definition: libpq-be-fe.h:253
#define PQnfields
Definition: libpq-be-fe.h:252
#define PQgetisnull
Definition: libpq-be-fe.h:255
#define PQfname
Definition: libpq-be-fe.h:256
#define PQntuples
Definition: libpq-be-fe.h:251
Datum translate(PG_FUNCTION_ARGS)
char * c
const bool * translate_columns
Definition: print.h:192
printTableOpt topt
Definition: print.h:185
char * nullPrint
Definition: print.h:186
char * falsePrint
Definition: print.h:188
char * title
Definition: print.h:189
char ** footers
Definition: print.h:190
bool translate_header
Definition: print.h:191
int n_translate_columns
Definition: print.h:194
char * truePrint
Definition: print.h:187
char * aligns
Definition: print.h:178
bool numericLocale
Definition: print.h:135

References printTableContent::aligns, Assert(), cancel_pressed, column_type_alignment(), printQueryOpt::falsePrint, printQueryOpt::footers, format_numeric_locale(), i, printQueryOpt::n_translate_columns, printTableContent::ncolumns, printTableContent::nrows, printQueryOpt::nullPrint, printTableOpt::numericLocale, PQfname, PQftype(), PQgetisnull, PQgetvalue, PQnfields, PQntuples, printTable(), printTableAddCell(), printTableAddFooter(), printTableAddHeader(), printTableCleanup(), printTableInit(), printQueryOpt::title, printQueryOpt::topt, translate(), printQueryOpt::translate_columns, printQueryOpt::translate_header, and printQueryOpt::truePrint.

Referenced by describeAccessMethods(), describeAggregates(), describeConfigurationParameters(), describeFunctions(), describeOneTableDetails(), describeOneTSConfig(), describeOneTSParser(), describeOperators(), describeRoleGrants(), describeSubscriptions(), describeTablespaces(), describeTypes(), ExecQueryAndProcessResults(), listAllDbs(), listCasts(), listCollations(), listConversions(), listDbRoleSettings(), listDefaultACLs(), listDomains(), listEventTriggers(), listExtendedStats(), listExtensions(), listForeignDataWrappers(), listForeignServers(), listForeignTables(), listLanguages(), listLargeObjects(), listOneExtensionContents(), listOperatorClasses(), listOperatorFamilies(), listOpFamilyFunctions(), listOpFamilyOperators(), listPartitionedTables(), listPublications(), listSchemas(), listTables(), listTSConfigs(), listTSDictionaries(), listTSParsers(), listTSTemplates(), listUserMappings(), objectDescription(), permissionsList(), and PrintQueryTuples().

◆ printTable()

void printTable ( const printTableContent cont,
FILE *  fout,
bool  is_pager,
FILE *  flog 
)

Definition at line 3636 of file print.c.

3638{
3639 bool is_local_pager = false;
3640
3641 if (cancel_pressed)
3642 return;
3643
3644 if (cont->opt->format == PRINT_NOTHING)
3645 return;
3646
3647 /* print_aligned_*() handle the pager themselves */
3648 if (!is_pager &&
3649 cont->opt->format != PRINT_ALIGNED &&
3650 cont->opt->format != PRINT_WRAPPED)
3651 {
3652 IsPagerNeeded(cont, NULL, (cont->opt->expanded == 1), &fout, &is_pager);
3653 is_local_pager = is_pager;
3654 }
3655
3656 /* clear any pre-existing error indication on the output stream */
3657 clearerr(fout);
3658
3659 /* print the stuff */
3660 switch (cont->opt->format)
3661 {
3662 case PRINT_UNALIGNED:
3663 if (cont->opt->expanded == 1)
3664 print_unaligned_vertical(cont, fout);
3665 else
3666 print_unaligned_text(cont, fout);
3667 break;
3668 case PRINT_ALIGNED:
3669 case PRINT_WRAPPED:
3670
3671 /*
3672 * In expanded-auto mode, force vertical if a pager is passed in;
3673 * else we may make different decisions for different hunks of the
3674 * query result.
3675 */
3676 if (cont->opt->expanded == 1 ||
3677 (cont->opt->expanded == 2 && is_pager))
3678 print_aligned_vertical(cont, fout, is_pager);
3679 else
3680 print_aligned_text(cont, fout, is_pager);
3681 break;
3682 case PRINT_CSV:
3683 if (cont->opt->expanded == 1)
3684 print_csv_vertical(cont, fout);
3685 else
3686 print_csv_text(cont, fout);
3687 break;
3688 case PRINT_HTML:
3689 if (cont->opt->expanded == 1)
3690 print_html_vertical(cont, fout);
3691 else
3692 print_html_text(cont, fout);
3693 break;
3694 case PRINT_ASCIIDOC:
3695 if (cont->opt->expanded == 1)
3696 print_asciidoc_vertical(cont, fout);
3697 else
3698 print_asciidoc_text(cont, fout);
3699 break;
3700 case PRINT_LATEX:
3701 if (cont->opt->expanded == 1)
3702 print_latex_vertical(cont, fout);
3703 else
3704 print_latex_text(cont, fout);
3705 break;
3707 if (cont->opt->expanded == 1)
3708 print_latex_vertical(cont, fout);
3709 else
3710 print_latex_longtable_text(cont, fout);
3711 break;
3712 case PRINT_TROFF_MS:
3713 if (cont->opt->expanded == 1)
3714 print_troff_ms_vertical(cont, fout);
3715 else
3716 print_troff_ms_text(cont, fout);
3717 break;
3718 default:
3719 fprintf(stderr, _("invalid output format (internal error): %d"),
3720 cont->opt->format);
3721 exit(EXIT_FAILURE);
3722 }
3723
3724 if (is_local_pager)
3725 ClosePager(fout);
3726
3727 /* also produce log output if wanted */
3728 if (flog)
3729 print_aligned_text(cont, flog, false);
3730}
static void print_asciidoc_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2171
static void print_unaligned_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:529
static void print_latex_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2439
static void IsPagerNeeded(const printTableContent *cont, const unsigned int *width_wrap, bool vertical, FILE **fout, bool *is_pager)
Definition: print.c:3430
static void print_troff_ms_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2812
static void print_html_text(const printTableContent *cont, FILE *fout)
Definition: print.c:1978
static void print_troff_ms_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2904
void ClosePager(FILE *pagerpipe)
Definition: print.c:3160
static void print_csv_text(const printTableContent *cont, FILE *fout)
Definition: print.c:1865
static void print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
Definition: print.c:651
static void print_csv_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:1905
static void print_html_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2067
static void print_asciidoc_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2281
static void print_unaligned_text(const printTableContent *cont, FILE *fout)
Definition: print.c:438
static void print_latex_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2702
static void print_latex_longtable_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2546
static void print_aligned_vertical(const printTableContent *cont, FILE *fout, bool is_pager)
Definition: print.c:1304
#define EXIT_FAILURE
Definition: settings.h:197
const printTableOpt * opt
Definition: print.h:165
unsigned short int expanded
Definition: print.h:114
enum printFormat format
Definition: print.h:113

References _, cancel_pressed, ClosePager(), EXIT_FAILURE, printTableOpt::expanded, printTableOpt::format, fprintf, IsPagerNeeded(), printTableContent::opt, PRINT_ALIGNED, print_aligned_text(), print_aligned_vertical(), PRINT_ASCIIDOC, print_asciidoc_text(), print_asciidoc_vertical(), PRINT_CSV, print_csv_text(), print_csv_vertical(), PRINT_HTML, print_html_text(), print_html_vertical(), PRINT_LATEX, PRINT_LATEX_LONGTABLE, print_latex_longtable_text(), print_latex_text(), print_latex_vertical(), PRINT_NOTHING, PRINT_TROFF_MS, print_troff_ms_text(), print_troff_ms_vertical(), PRINT_UNALIGNED, print_unaligned_text(), print_unaligned_vertical(), and PRINT_WRAPPED.

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), printCrosstab(), and printQuery().

◆ printTableAddCell()

void printTableAddCell ( printTableContent *const  content,
char *  cell,
const bool  translate,
const bool  mustfree 
)

Definition at line 3279 of file print.c.

3281{
3282 uint64 total_cells;
3283
3284#ifndef ENABLE_NLS
3285 (void) translate; /* unused parameter */
3286#endif
3287
3288 total_cells = (uint64) content->ncolumns * content->nrows;
3289 if (content->cellsadded >= total_cells)
3290 {
3291 fprintf(stderr, _("Cannot add cell to table content: total cell count of %" PRIu64 " exceeded.\n"),
3292 total_cells);
3293 exit(EXIT_FAILURE);
3294 }
3295
3296 *content->cell = (char *) mbvalidate((unsigned char *) cell,
3297 content->opt->encoding);
3298
3299#ifdef ENABLE_NLS
3300 if (translate)
3301 *content->cell = _(*content->cell);
3302#endif
3303
3304 if (mustfree)
3305 {
3306 if (content->cellmustfree == NULL)
3307 content->cellmustfree =
3308 pg_malloc0((total_cells + 1) * sizeof(bool));
3309
3310 content->cellmustfree[content->cellsadded] = true;
3311 }
3312 content->cell++;
3313 content->cellsadded++;
3314}
uint64_t uint64
Definition: c.h:542
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:81
unsigned char * mbvalidate(unsigned char *pwcs, int encoding)
Definition: mbprint.c:392
uint64 cellsadded
Definition: print.h:174
bool * cellmustfree
Definition: print.h:175
const char ** cell
Definition: print.h:173
int encoding
Definition: print.h:138

References _, printTableContent::cell, printTableContent::cellmustfree, printTableContent::cellsadded, printTableOpt::encoding, EXIT_FAILURE, fprintf, if(), mbvalidate(), printTableContent::ncolumns, printTableContent::nrows, printTableContent::opt, pg_malloc0(), and translate().

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), and printQuery().

◆ printTableAddFooter()

void printTableAddFooter ( printTableContent *const  content,
const char *  footer 
)

Definition at line 3329 of file print.c.

3330{
3332
3333 f = pg_malloc0(sizeof(*f));
3334 f->data = pg_strdup(footer);
3335
3336 if (content->footers == NULL)
3337 content->footers = f;
3338 else
3339 content->footer->next = f;
3340
3341 content->footer = f;
3342}
char * pg_strdup(const char *in)
Definition: fe_memutils.c:85
printTableFooter * footers
Definition: print.h:176
printTableFooter * footer
Definition: print.h:177
char * data
Definition: print.h:155
struct printTableFooter * next
Definition: print.h:156

References printTableFooter::data, printTableContent::footer, printTableContent::footers, printTableFooter::next, pg_malloc0(), and pg_strdup().

Referenced by add_tablespace_footer(), addFooterToPublicationDesc(), describeOneTableDetails(), printQuery(), and printTableSetFooter().

◆ printTableAddHeader()

void printTableAddHeader ( printTableContent *const  content,
char *  header,
const bool  translate,
const char  align 
)

Definition at line 3239 of file print.c.

3241{
3242#ifndef ENABLE_NLS
3243 (void) translate; /* unused parameter */
3244#endif
3245
3246 if (content->header >= content->headers + content->ncolumns)
3247 {
3248 fprintf(stderr, _("Cannot add header to table content: "
3249 "column count of %d exceeded.\n"),
3250 content->ncolumns);
3251 exit(EXIT_FAILURE);
3252 }
3253
3254 *content->header = (char *) mbvalidate((unsigned char *) header,
3255 content->opt->encoding);
3256#ifdef ENABLE_NLS
3257 if (translate)
3258 *content->header = _(*content->header);
3259#endif
3260 content->header++;
3261
3262 *content->align = align;
3263 content->align++;
3264}
char * align
Definition: print.h:180
const char ** header
Definition: print.h:170
const char ** headers
Definition: print.h:169

References _, printTableContent::align, printTableOpt::encoding, EXIT_FAILURE, fprintf, printTableContent::header, printTableContent::headers, mbvalidate(), printTableContent::ncolumns, printTableContent::opt, and translate().

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), printCrosstab(), and printQuery().

◆ printTableCleanup()

void printTableCleanup ( printTableContent *const  content)

Definition at line 3372 of file print.c.

3373{
3374 if (content->cellmustfree)
3375 {
3376 uint64 total_cells;
3377
3378 total_cells = (uint64) content->ncolumns * content->nrows;
3379 for (uint64 i = 0; i < total_cells; i++)
3380 {
3381 if (content->cellmustfree[i])
3382 free(unconstify(char *, content->cells[i]));
3383 }
3384 free(content->cellmustfree);
3385 content->cellmustfree = NULL;
3386 }
3387 free(content->headers);
3388 free(content->cells);
3389 free(content->aligns);
3390
3391 content->opt = NULL;
3392 content->title = NULL;
3393 content->headers = NULL;
3394 content->cells = NULL;
3395 content->aligns = NULL;
3396 content->header = NULL;
3397 content->cell = NULL;
3398 content->align = NULL;
3399
3400 if (content->footers)
3401 {
3402 for (content->footer = content->footers; content->footer;)
3403 {
3405
3406 f = content->footer;
3407 content->footer = f->next;
3408 free(f->data);
3409 free(f);
3410 }
3411 }
3412 content->footers = NULL;
3413 content->footer = NULL;
3414}
#define unconstify(underlying_type, expr)
Definition: c.h:1233
for(;;)
#define free(a)
Definition: header.h:65
const char * title
Definition: print.h:166
const char ** cells
Definition: print.h:171

References printTableContent::align, printTableContent::aligns, printTableContent::cell, printTableContent::cellmustfree, printTableContent::cells, printTableFooter::data, printTableContent::footer, printTableContent::footers, for(), free, printTableContent::header, printTableContent::headers, i, printTableContent::ncolumns, printTableFooter::next, printTableContent::nrows, printTableContent::opt, printTableContent::title, and unconstify.

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), printCrosstab(), and printQuery().

◆ printTableInit()

void printTableInit ( printTableContent *const  content,
const printTableOpt opt,
const char *  title,
const int  ncolumns,
const int  nrows 
)

Definition at line 3191 of file print.c.

3193{
3194 uint64 total_cells;
3195
3196 content->opt = opt;
3197 content->title = title;
3198 content->ncolumns = ncolumns;
3199 content->nrows = nrows;
3200
3201 content->headers = pg_malloc0((ncolumns + 1) * sizeof(*content->headers));
3202
3203 total_cells = (uint64) ncolumns * nrows;
3204 /* Catch possible overflow. Using >= here allows adding 1 below */
3205 if (total_cells >= SIZE_MAX / sizeof(*content->cells))
3206 {
3207 fprintf(stderr, _("Cannot print table contents: number of cells %" PRIu64 " is equal to or exceeds maximum %zu.\n"),
3208 total_cells,
3209 SIZE_MAX / sizeof(*content->cells));
3210 exit(EXIT_FAILURE);
3211 }
3212 content->cells = pg_malloc0((total_cells + 1) * sizeof(*content->cells));
3213
3214 content->cellmustfree = NULL;
3215 content->footers = NULL;
3216
3217 content->aligns = pg_malloc0((ncolumns + 1) * sizeof(*content->align));
3218
3219 content->header = content->headers;
3220 content->cell = content->cells;
3221 content->footer = content->footers;
3222 content->align = content->aligns;
3223 content->cellsadded = 0;
3224}

References _, printTableContent::align, printTableContent::aligns, printTableContent::cell, printTableContent::cellmustfree, printTableContent::cells, printTableContent::cellsadded, EXIT_FAILURE, printTableContent::footer, printTableContent::footers, fprintf, printTableContent::header, printTableContent::headers, printTableContent::ncolumns, printTableContent::nrows, printTableContent::opt, pg_malloc0(), and printTableContent::title.

Referenced by describeOneTableDetails(), describePublications(), describeRoles(), exec_command_conninfo(), printCrosstab(), and printQuery().

◆ printTableSetFooter()

void printTableSetFooter ( printTableContent *const  content,
const char *  footer 
)

Definition at line 3354 of file print.c.

3355{
3356 if (content->footers != NULL)
3357 {
3358 free(content->footer->data);
3359 content->footer->data = pg_strdup(footer);
3360 }
3361 else
3362 printTableAddFooter(content, footer);
3363}

References printTableFooter::data, printTableContent::footer, printTableContent::footers, free, pg_strdup(), and printTableAddFooter().

Referenced by add_tablespace_footer().

◆ refresh_utf8format()

void refresh_utf8format ( const printTableOpt opt)

Definition at line 3888 of file print.c.

3889{
3891
3892 const unicodeStyleBorderFormat *border;
3893 const unicodeStyleRowFormat *header;
3894 const unicodeStyleColumnFormat *column;
3895
3896 popt->name = "unicode";
3897
3901
3902 popt->lrule[PRINT_RULE_TOP].hrule = border->horizontal;
3906
3907 popt->lrule[PRINT_RULE_MIDDLE].hrule = header->horizontal;
3911
3912 popt->lrule[PRINT_RULE_BOTTOM].hrule = border->horizontal;
3916
3917 /* N/A */
3918 popt->lrule[PRINT_RULE_DATA].hrule = "";
3919 popt->lrule[PRINT_RULE_DATA].leftvrule = border->vertical;
3920 popt->lrule[PRINT_RULE_DATA].midvrule = column->vertical;
3921 popt->lrule[PRINT_RULE_DATA].rightvrule = border->vertical;
3922
3923 popt->midvrule_nl = column->vertical;
3924 popt->midvrule_wrap = column->vertical;
3925 popt->midvrule_blank = column->vertical;
3926
3927 /* Same for all unicode today */
3935}
static const unicodeStyleFormat unicode_style
Definition: print.c:145
printTextFormat pg_utf8format
Definition: print.c:104
unicode_linestyle unicode_border_linestyle
Definition: print.h:141
unicode_linestyle unicode_header_linestyle
Definition: print.h:143
unicode_linestyle unicode_column_linestyle
Definition: print.h:142
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
const char * up_and_right
Definition: print.c:123
const char * left_and_right
Definition: print.c:128
const char * vertical
Definition: print.c:124
const char * down_and_left
Definition: print.c:127
const char * horizontal
Definition: print.c:126
const char * down_and_right
Definition: print.c:125
const char * vertical_and_horizontal[2]
Definition: print.c:116
const char * up_and_horizontal[2]
Definition: print.c:117
const char * vertical
Definition: print.c:115
const char * down_and_horizontal[2]
Definition: print.c:118
unicodeStyleRowFormat row_style[2]
Definition: print.c:133
unicodeStyleColumnFormat column_style[2]
Definition: print.c:134
const char * nl_right
Definition: print.c:139
const char * wrap_right
Definition: print.c:141
const char * header_nl_left
Definition: print.c:136
const char * header_nl_right
Definition: print.c:137
unicodeStyleBorderFormat border_style[2]
Definition: print.c:135
const char * nl_left
Definition: print.c:138
const char * wrap_left
Definition: print.c:140
bool wrap_right_border
Definition: print.c:142
const char * vertical_and_right[2]
Definition: print.c:109
const char * vertical_and_left[2]
Definition: print.c:110
const char * horizontal
Definition: print.c:108

References unicodeStyleFormat::border_style, unicodeStyleFormat::column_style, unicodeStyleColumnFormat::down_and_horizontal, unicodeStyleBorderFormat::down_and_left, unicodeStyleBorderFormat::down_and_right, unicodeStyleFormat::header_nl_left, printTextFormat::header_nl_left, unicodeStyleFormat::header_nl_right, printTextFormat::header_nl_right, unicodeStyleRowFormat::horizontal, unicodeStyleBorderFormat::horizontal, printTextLineFormat::hrule, unicodeStyleBorderFormat::left_and_right, printTextLineFormat::leftvrule, printTextFormat::lrule, printTextLineFormat::midvrule, printTextFormat::midvrule_blank, printTextFormat::midvrule_nl, printTextFormat::midvrule_wrap, printTextFormat::name, unicodeStyleFormat::nl_left, printTextFormat::nl_left, unicodeStyleFormat::nl_right, printTextFormat::nl_right, pg_utf8format, PRINT_RULE_BOTTOM, PRINT_RULE_DATA, PRINT_RULE_MIDDLE, PRINT_RULE_TOP, printTextLineFormat::rightvrule, unicodeStyleFormat::row_style, printTableOpt::unicode_border_linestyle, printTableOpt::unicode_column_linestyle, printTableOpt::unicode_header_linestyle, unicode_style, unicodeStyleColumnFormat::up_and_horizontal, unicodeStyleBorderFormat::up_and_right, unicodeStyleColumnFormat::vertical, unicodeStyleBorderFormat::vertical, unicodeStyleColumnFormat::vertical_and_horizontal, unicodeStyleRowFormat::vertical_and_left, unicodeStyleRowFormat::vertical_and_right, unicodeStyleFormat::wrap_left, printTextFormat::wrap_left, unicodeStyleFormat::wrap_right, printTextFormat::wrap_right, unicodeStyleFormat::wrap_right_border, and printTextFormat::wrap_right_border.

Referenced by do_pset(), and main().

◆ restore_sigpipe_trap()

void restore_sigpipe_trap ( void  )

Definition at line 3047 of file print.c.

3048{
3049#ifndef WIN32
3050 pqsignal(SIGPIPE, always_ignore_sigpipe ? SIG_IGN : SIG_DFL);
3051#endif
3052}
static bool always_ignore_sigpipe
Definition: print.c:50

References always_ignore_sigpipe, pqsignal, and SIGPIPE.

Referenced by CloseGOutput(), ClosePager(), do_copy(), do_watch(), exec_command_write(), PageOutputInternal(), and setQFout().

◆ set_sigpipe_trap_state()

void set_sigpipe_trap_state ( bool  ignore)

Definition at line 3060 of file print.c.

3061{
3062 always_ignore_sigpipe = ignore;
3063}

References always_ignore_sigpipe.

Referenced by setQFout().

◆ setDecimalLocale()

void setDecimalLocale ( void  )

Definition at line 3838 of file print.c.

3839{
3840 struct lconv *extlconv;
3841
3842 extlconv = localeconv();
3843
3844 /* Don't accept an empty decimal_point string */
3845 if (*extlconv->decimal_point)
3846 decimal_point = pg_strdup(extlconv->decimal_point);
3847 else
3848 decimal_point = "."; /* SQL output standard */
3849
3850 /*
3851 * Although the Open Group standard allows locales to supply more than one
3852 * group width, we consider only the first one, and we ignore any attempt
3853 * to suppress grouping by specifying CHAR_MAX. As in the backend's
3854 * cash.c, we must apply a range check to avoid being fooled by variant
3855 * CHAR_MAX values.
3856 */
3857 groupdigits = *extlconv->grouping;
3858 if (groupdigits <= 0 || groupdigits > 6)
3859 groupdigits = 3; /* most common */
3860
3861 /* Don't accept an empty thousands_sep string, either */
3862 /* similar code exists in formatting.c */
3863 if (*extlconv->thousands_sep)
3864 thousands_sep = pg_strdup(extlconv->thousands_sep);
3865 /* Make sure thousands separator doesn't match decimal point symbol. */
3866 else if (strcmp(decimal_point, ",") != 0)
3867 thousands_sep = ",";
3868 else
3869 thousands_sep = ".";
3870}
static char * thousands_sep
Definition: print.c:55
static char * decimal_point
Definition: print.c:53
static int groupdigits
Definition: print.c:54

References decimal_point, groupdigits, pg_strdup(), and thousands_sep.

Referenced by main().

Variable Documentation

◆ cancel_pressed

◆ pg_asciiformat

PGDLLIMPORT const printTextFormat pg_asciiformat
extern

Definition at line 61 of file print.c.

Referenced by do_pset(), and get_line_style().

◆ pg_asciiformat_old

PGDLLIMPORT const printTextFormat pg_asciiformat_old
extern

Definition at line 82 of file print.c.

Referenced by do_pset(), and print_aligned_vertical().

◆ pg_utf8format

PGDLLIMPORT printTextFormat pg_utf8format
extern

Definition at line 104 of file print.c.

Referenced by do_pset(), and refresh_utf8format().