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 3141 of file print.c.

3142{
3143 if (pagerpipe && pagerpipe != stdout)
3144 {
3145 /*
3146 * If printing was canceled midstream, warn about it.
3147 *
3148 * Some pagers like less use Ctrl-C as part of their command set. Even
3149 * so, we abort our processing and warn the user what we did. If the
3150 * pager quit as a result of the SIGINT, this message won't go
3151 * anywhere ...
3152 */
3153 if (cancel_pressed)
3154 fprintf(pagerpipe, _("Interrupted\n"));
3155
3156 pclose(pagerpipe);
3158 }
3159}
#define fprintf(file, fmt, msg)
Definition: cubescan.l:21
#define _(x)
Definition: elog.c:90
void restore_sigpipe_trap(void)
Definition: print.c:3062
volatile sig_atomic_t cancel_pressed
Definition: print.c:43

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 3614 of file print.c.

3615{
3616 char align;
3617
3618 switch (ftype)
3619 {
3620 case INT2OID:
3621 case INT4OID:
3622 case INT8OID:
3623 case FLOAT4OID:
3624 case FLOAT8OID:
3625 case NUMERICOID:
3626 case OIDOID:
3627 case XIDOID:
3628 case XID8OID:
3629 case CIDOID:
3630 case MONEYOID:
3631 align = 'r';
3632 break;
3633 default:
3634 align = 'l';
3635 break;
3636 }
3637 return align;
3638}

Referenced by printCrosstab(), and printQuery().

◆ disable_sigpipe_trap()

void disable_sigpipe_trap ( void  )

Definition at line 3039 of file print.c.

3040{
3041#ifndef WIN32
3042 pqsignal(SIGPIPE, SIG_IGN);
3043#endif
3044}
#define pqsignal
Definition: port.h:521
#define SIGPIPE
Definition: win32_port.h:163

References pqsignal, and SIGPIPE.

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

◆ get_line_style()

const printTextFormat * get_line_style ( const printTableOpt opt)

Definition at line 3677 of file print.c.

3678{
3679 /*
3680 * Note: this function mainly exists to preserve the convention that a
3681 * printTableOpt struct can be initialized to zeroes to get default
3682 * behavior.
3683 */
3684 if (opt->line_style != NULL)
3685 return opt->line_style;
3686 else
3687 return &pg_asciiformat;
3688}
const printTextFormat pg_asciiformat
Definition: print.c:56
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 1952 of file print.c.

1953{
1954 const char *p;
1955 bool leading_space = true;
1956
1957 for (p = in; *p; p++)
1958 {
1959 switch (*p)
1960 {
1961 case '&':
1962 fputs("&amp;", fout);
1963 break;
1964 case '<':
1965 fputs("&lt;", fout);
1966 break;
1967 case '>':
1968 fputs("&gt;", fout);
1969 break;
1970 case '\n':
1971 fputs("<br />\n", fout);
1972 break;
1973 case '"':
1974 fputs("&quot;", fout);
1975 break;
1976 case ' ':
1977 /* protect leading space, for EXPLAIN output */
1978 if (leading_space)
1979 fputs("&nbsp;", fout);
1980 else
1981 fputs(" ", fout);
1982 break;
1983 default:
1984 fputc(*p, fout);
1985 }
1986 if (*p != ' ')
1987 leading_space = false;
1988 }
1989}

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

◆ PageOutput()

FILE * PageOutput ( int  lines,
const printTableOpt topt 
)

Definition at line 3089 of file print.c.

3090{
3091 /* check whether we need / can / are supposed to use pager */
3092 if (topt && topt->pager && isatty(fileno(stdin)) && isatty(fileno(stdout)))
3093 {
3094#ifdef TIOCGWINSZ
3095 unsigned short int pager = topt->pager;
3096 int min_lines = topt->pager_min_lines;
3097 int result;
3098 struct winsize screen_size;
3099
3100 result = ioctl(fileno(stdout), TIOCGWINSZ, &screen_size);
3101
3102 /* >= accounts for a one-line prompt */
3103 if (result == -1
3104 || (lines >= screen_size.ws_row && lines >= min_lines)
3105 || pager > 1)
3106#endif
3107 {
3108 const char *pagerprog;
3109 FILE *pagerpipe;
3110
3111 pagerprog = getenv("PSQL_PAGER");
3112 if (!pagerprog)
3113 pagerprog = getenv("PAGER");
3114 if (!pagerprog)
3115 pagerprog = DEFAULT_PAGER;
3116 else
3117 {
3118 /* if PAGER is empty or all-white-space, don't use pager */
3119 if (strspn(pagerprog, " \t\r\n") == strlen(pagerprog))
3120 return stdout;
3121 }
3122 fflush(NULL);
3124 pagerpipe = popen(pagerprog, "w");
3125 if (pagerpipe)
3126 return pagerpipe;
3127 /* if popen fails, silently proceed without pager */
3129 }
3130 }
3131
3132 return stdout;
3133}
void disable_sigpipe_trap(void)
Definition: print.c:3039
#define DEFAULT_PAGER
Definition: print.h:23
int pager_min_lines
Definition: print.h:124
unsigned short int pager
Definition: print.h:122

References DEFAULT_PAGER, disable_sigpipe_trap(), printTableOpt::pager, printTableOpt::pager_min_lines, restore_sigpipe_trap(), and generate_unaccent_rules::stdout.

Referenced by exec_command_sf_sv(), ExecQueryAndProcessResults(), helpSQL(), helpVariables(), IsPagerNeeded(), 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 3549 of file print.c.

3551{
3552 printTableContent cont;
3553 int i,
3554 r,
3555 c;
3556
3557 if (cancel_pressed)
3558 return;
3559
3560 printTableInit(&cont, &opt->topt, opt->title,
3561 PQnfields(result), PQntuples(result));
3562
3563 /* Assert caller supplied enough translate_columns[] entries */
3564 Assert(opt->translate_columns == NULL ||
3565 opt->n_translate_columns >= cont.ncolumns);
3566
3567 for (i = 0; i < cont.ncolumns; i++)
3568 {
3569 printTableAddHeader(&cont, PQfname(result, i),
3570 opt->translate_header,
3571 column_type_alignment(PQftype(result, i)));
3572 }
3573
3574 /* set cells */
3575 for (r = 0; r < cont.nrows; r++)
3576 {
3577 for (c = 0; c < cont.ncolumns; c++)
3578 {
3579 char *cell;
3580 bool mustfree = false;
3581 bool translate;
3582
3583 if (PQgetisnull(result, r, c))
3584 cell = opt->nullPrint ? opt->nullPrint : "";
3585 else
3586 {
3587 cell = PQgetvalue(result, r, c);
3588 if (cont.aligns[c] == 'r' && opt->topt.numericLocale)
3589 {
3590 cell = format_numeric_locale(cell);
3591 mustfree = true;
3592 }
3593 }
3594
3596 printTableAddCell(&cont, cell, translate, mustfree);
3597 }
3598 }
3599
3600 /* set footers */
3601 if (opt->footers)
3602 {
3603 char **footer;
3604
3605 for (footer = opt->footers; *footer; footer++)
3606 printTableAddFooter(&cont, *footer);
3607 }
3608
3609 printTable(&cont, fout, is_pager, flog);
3610 printTableCleanup(&cont);
3611}
Oid PQftype(const PGresult *res, int field_num)
Definition: fe-exec.c:3719
char * PQgetvalue(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3876
int PQntuples(const PGresult *res)
Definition: fe-exec.c:3481
char * PQfname(const PGresult *res, int field_num)
Definition: fe-exec.c:3567
int PQgetisnull(const PGresult *res, int tup_num, int field_num)
Definition: fe-exec.c:3901
int PQnfields(const PGresult *res)
Definition: fe-exec.c:3489
void printTableInit(printTableContent *const content, const printTableOpt *opt, const char *title, const int ncolumns, const int nrows)
Definition: print.c:3172
void printTableCleanup(printTableContent *const content)
Definition: print.c:3353
char column_type_alignment(Oid ftype)
Definition: print.c:3614
void printTableAddCell(printTableContent *const content, char *cell, const bool translate, const bool mustfree)
Definition: print.c:3260
static char * format_numeric_locale(const char *my_str)
Definition: print.c:314
void printTable(const printTableContent *cont, FILE *fout, bool is_pager, FILE *flog)
Definition: print.c:3443
void printTableAddFooter(printTableContent *const content, const char *footer)
Definition: print.c:3310
void printTableAddHeader(printTableContent *const content, char *header, const bool translate, const char align)
Definition: print.c:3220
Assert(PointerIsAligned(start, uint64))
int i
Definition: isn.c:74
Datum translate(PG_FUNCTION_ARGS)
char * c
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
char * aligns
Definition: print.h:178
bool numericLocale
Definition: print.h:135

References printTableContent::aligns, Assert(), cancel_pressed, column_type_alignment(), 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, and printQueryOpt::translate_header.

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 3443 of file print.c.

3445{
3446 bool is_local_pager = false;
3447
3448 if (cancel_pressed)
3449 return;
3450
3451 if (cont->opt->format == PRINT_NOTHING)
3452 return;
3453
3454 /* print_aligned_*() handle the pager themselves */
3455 if (!is_pager &&
3456 cont->opt->format != PRINT_ALIGNED &&
3457 cont->opt->format != PRINT_WRAPPED)
3458 {
3459 IsPagerNeeded(cont, 0, (cont->opt->expanded == 1), &fout, &is_pager);
3460 is_local_pager = is_pager;
3461 }
3462
3463 /* clear any pre-existing error indication on the output stream */
3464 clearerr(fout);
3465
3466 /* print the stuff */
3467
3468 if (flog)
3469 print_aligned_text(cont, flog, false);
3470
3471 switch (cont->opt->format)
3472 {
3473 case PRINT_UNALIGNED:
3474 if (cont->opt->expanded == 1)
3475 print_unaligned_vertical(cont, fout);
3476 else
3477 print_unaligned_text(cont, fout);
3478 break;
3479 case PRINT_ALIGNED:
3480 case PRINT_WRAPPED:
3481
3482 /*
3483 * In expanded-auto mode, force vertical if a pager is passed in;
3484 * else we may make different decisions for different hunks of the
3485 * query result.
3486 */
3487 if (cont->opt->expanded == 1 ||
3488 (cont->opt->expanded == 2 && is_pager))
3489 print_aligned_vertical(cont, fout, is_pager);
3490 else
3491 print_aligned_text(cont, fout, is_pager);
3492 break;
3493 case PRINT_CSV:
3494 if (cont->opt->expanded == 1)
3495 print_csv_vertical(cont, fout);
3496 else
3497 print_csv_text(cont, fout);
3498 break;
3499 case PRINT_HTML:
3500 if (cont->opt->expanded == 1)
3501 print_html_vertical(cont, fout);
3502 else
3503 print_html_text(cont, fout);
3504 break;
3505 case PRINT_ASCIIDOC:
3506 if (cont->opt->expanded == 1)
3507 print_asciidoc_vertical(cont, fout);
3508 else
3509 print_asciidoc_text(cont, fout);
3510 break;
3511 case PRINT_LATEX:
3512 if (cont->opt->expanded == 1)
3513 print_latex_vertical(cont, fout);
3514 else
3515 print_latex_text(cont, fout);
3516 break;
3518 if (cont->opt->expanded == 1)
3519 print_latex_vertical(cont, fout);
3520 else
3521 print_latex_longtable_text(cont, fout);
3522 break;
3523 case PRINT_TROFF_MS:
3524 if (cont->opt->expanded == 1)
3525 print_troff_ms_vertical(cont, fout);
3526 else
3527 print_troff_ms_text(cont, fout);
3528 break;
3529 default:
3530 fprintf(stderr, _("invalid output format (internal error): %d"),
3531 cont->opt->format);
3532 exit(EXIT_FAILURE);
3533 }
3534
3535 if (is_local_pager)
3536 ClosePager(fout);
3537}
static void print_asciidoc_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2186
static void print_unaligned_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:513
static void print_latex_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2454
static void print_troff_ms_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2827
static void print_html_text(const printTableContent *cont, FILE *fout)
Definition: print.c:1993
static void print_troff_ms_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2919
void ClosePager(FILE *pagerpipe)
Definition: print.c:3141
static void print_csv_text(const printTableContent *cont, FILE *fout)
Definition: print.c:1880
static void print_aligned_text(const printTableContent *cont, FILE *fout, bool is_pager)
Definition: print.c:635
static void print_csv_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:1920
static void print_html_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2082
static void print_asciidoc_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2296
static void print_unaligned_text(const printTableContent *cont, FILE *fout)
Definition: print.c:422
static void print_latex_vertical(const printTableContent *cont, FILE *fout)
Definition: print.c:2717
static void IsPagerNeeded(const printTableContent *cont, int extra_lines, bool expanded, FILE **fout, bool *is_pager)
Definition: print.c:3403
static void print_latex_longtable_text(const printTableContent *cont, FILE *fout)
Definition: print.c:2561
static void print_aligned_vertical(const printTableContent *cont, FILE *fout, bool is_pager)
Definition: print.c:1324
#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 3260 of file print.c.

3262{
3263 uint64 total_cells;
3264
3265#ifndef ENABLE_NLS
3266 (void) translate; /* unused parameter */
3267#endif
3268
3269 total_cells = (uint64) content->ncolumns * content->nrows;
3270 if (content->cellsadded >= total_cells)
3271 {
3272 fprintf(stderr, _("Cannot add cell to table content: total cell count of %lld exceeded.\n"),
3273 (long long int) total_cells);
3274 exit(EXIT_FAILURE);
3275 }
3276
3277 *content->cell = (char *) mbvalidate((unsigned char *) cell,
3278 content->opt->encoding);
3279
3280#ifdef ENABLE_NLS
3281 if (translate)
3282 *content->cell = _(*content->cell);
3283#endif
3284
3285 if (mustfree)
3286 {
3287 if (content->cellmustfree == NULL)
3288 content->cellmustfree =
3289 pg_malloc0((total_cells + 1) * sizeof(bool));
3290
3291 content->cellmustfree[content->cellsadded] = true;
3292 }
3293 content->cell++;
3294 content->cellsadded++;
3295}
uint64_t uint64
Definition: c.h:503
void * pg_malloc0(size_t size)
Definition: fe_memutils.c:53
if(TABLE==NULL||TABLE_index==NULL)
Definition: isn.c:78
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 3310 of file print.c.

3311{
3313
3314 f = pg_malloc0(sizeof(*f));
3315 f->data = pg_strdup(footer);
3316
3317 if (content->footers == NULL)
3318 content->footers = f;
3319 else
3320 content->footer->next = f;
3321
3322 content->footer = f;
3323}
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 3220 of file print.c.

3222{
3223#ifndef ENABLE_NLS
3224 (void) translate; /* unused parameter */
3225#endif
3226
3227 if (content->header >= content->headers + content->ncolumns)
3228 {
3229 fprintf(stderr, _("Cannot add header to table content: "
3230 "column count of %d exceeded.\n"),
3231 content->ncolumns);
3232 exit(EXIT_FAILURE);
3233 }
3234
3235 *content->header = (char *) mbvalidate((unsigned char *) header,
3236 content->opt->encoding);
3237#ifdef ENABLE_NLS
3238 if (translate)
3239 *content->header = _(*content->header);
3240#endif
3241 content->header++;
3242
3243 *content->align = align;
3244 content->align++;
3245}
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 3353 of file print.c.

3354{
3355 if (content->cellmustfree)
3356 {
3357 uint64 total_cells;
3358
3359 total_cells = (uint64) content->ncolumns * content->nrows;
3360 for (uint64 i = 0; i < total_cells; i++)
3361 {
3362 if (content->cellmustfree[i])
3363 free(unconstify(char *, content->cells[i]));
3364 }
3365 free(content->cellmustfree);
3366 content->cellmustfree = NULL;
3367 }
3368 free(content->headers);
3369 free(content->cells);
3370 free(content->aligns);
3371
3372 content->opt = NULL;
3373 content->title = NULL;
3374 content->headers = NULL;
3375 content->cells = NULL;
3376 content->aligns = NULL;
3377 content->header = NULL;
3378 content->cell = NULL;
3379 content->align = NULL;
3380
3381 if (content->footers)
3382 {
3383 for (content->footer = content->footers; content->footer;)
3384 {
3386
3387 f = content->footer;
3388 content->footer = f->next;
3389 free(f->data);
3390 free(f);
3391 }
3392 }
3393 content->footers = NULL;
3394 content->footer = NULL;
3395}
#define unconstify(underlying_type, expr)
Definition: c.h:1216
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 3172 of file print.c.

3174{
3175 uint64 total_cells;
3176
3177 content->opt = opt;
3178 content->title = title;
3179 content->ncolumns = ncolumns;
3180 content->nrows = nrows;
3181
3182 content->headers = pg_malloc0((ncolumns + 1) * sizeof(*content->headers));
3183
3184 total_cells = (uint64) ncolumns * nrows;
3185 /* Catch possible overflow. Using >= here allows adding 1 below */
3186 if (total_cells >= SIZE_MAX / sizeof(*content->cells))
3187 {
3188 fprintf(stderr, _("Cannot print table contents: number of cells %lld is equal to or exceeds maximum %lld.\n"),
3189 (long long int) total_cells,
3190 (long long int) (SIZE_MAX / sizeof(*content->cells)));
3191 exit(EXIT_FAILURE);
3192 }
3193 content->cells = pg_malloc0((total_cells + 1) * sizeof(*content->cells));
3194
3195 content->cellmustfree = NULL;
3196 content->footers = NULL;
3197
3198 content->aligns = pg_malloc0((ncolumns + 1) * sizeof(*content->align));
3199
3200 content->header = content->headers;
3201 content->cell = content->cells;
3202 content->footer = content->footers;
3203 content->align = content->aligns;
3204 content->cellsadded = 0;
3205}

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 3335 of file print.c.

3336{
3337 if (content->footers != NULL)
3338 {
3339 free(content->footer->data);
3340 content->footer->data = pg_strdup(footer);
3341 }
3342 else
3343 printTableAddFooter(content, footer);
3344}

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 3691 of file print.c.

3692{
3694
3695 const unicodeStyleBorderFormat *border;
3696 const unicodeStyleRowFormat *header;
3697 const unicodeStyleColumnFormat *column;
3698
3699 popt->name = "unicode";
3700
3704
3705 popt->lrule[PRINT_RULE_TOP].hrule = border->horizontal;
3709
3710 popt->lrule[PRINT_RULE_MIDDLE].hrule = header->horizontal;
3714
3715 popt->lrule[PRINT_RULE_BOTTOM].hrule = border->horizontal;
3719
3720 /* N/A */
3721 popt->lrule[PRINT_RULE_DATA].hrule = "";
3722 popt->lrule[PRINT_RULE_DATA].leftvrule = border->vertical;
3723 popt->lrule[PRINT_RULE_DATA].midvrule = column->vertical;
3724 popt->lrule[PRINT_RULE_DATA].rightvrule = border->vertical;
3725
3726 popt->midvrule_nl = column->vertical;
3727 popt->midvrule_wrap = column->vertical;
3728 popt->midvrule_blank = column->vertical;
3729
3730 /* Same for all unicode today */
3738}
static const unicodeStyleFormat unicode_style
Definition: print.c:140
printTextFormat pg_utf8format
Definition: print.c:99
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:118
const char * left_and_right
Definition: print.c:123
const char * vertical
Definition: print.c:119
const char * down_and_left
Definition: print.c:122
const char * horizontal
Definition: print.c:121
const char * down_and_right
Definition: print.c:120
const char * vertical_and_horizontal[2]
Definition: print.c:111
const char * up_and_horizontal[2]
Definition: print.c:112
const char * vertical
Definition: print.c:110
const char * down_and_horizontal[2]
Definition: print.c:113
unicodeStyleRowFormat row_style[2]
Definition: print.c:128
unicodeStyleColumnFormat column_style[2]
Definition: print.c:129
const char * nl_right
Definition: print.c:134
const char * wrap_right
Definition: print.c:136
const char * header_nl_left
Definition: print.c:131
const char * header_nl_right
Definition: print.c:132
unicodeStyleBorderFormat border_style[2]
Definition: print.c:130
const char * nl_left
Definition: print.c:133
const char * wrap_left
Definition: print.c:135
bool wrap_right_border
Definition: print.c:137
const char * vertical_and_right[2]
Definition: print.c:104
const char * vertical_and_left[2]
Definition: print.c:105
const char * horizontal
Definition: print.c:103

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 3062 of file print.c.

3063{
3064#ifndef WIN32
3065 pqsignal(SIGPIPE, always_ignore_sigpipe ? SIG_IGN : SIG_DFL);
3066#endif
3067}
static bool always_ignore_sigpipe
Definition: print.c:45

References always_ignore_sigpipe, pqsignal, and SIGPIPE.

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

◆ set_sigpipe_trap_state()

void set_sigpipe_trap_state ( bool  ignore)

Definition at line 3075 of file print.c.

3076{
3077 always_ignore_sigpipe = ignore;
3078}

References always_ignore_sigpipe.

Referenced by setQFout().

◆ setDecimalLocale()

void setDecimalLocale ( void  )

Definition at line 3641 of file print.c.

3642{
3643 struct lconv *extlconv;
3644
3645 extlconv = localeconv();
3646
3647 /* Don't accept an empty decimal_point string */
3648 if (*extlconv->decimal_point)
3649 decimal_point = pg_strdup(extlconv->decimal_point);
3650 else
3651 decimal_point = "."; /* SQL output standard */
3652
3653 /*
3654 * Although the Open Group standard allows locales to supply more than one
3655 * group width, we consider only the first one, and we ignore any attempt
3656 * to suppress grouping by specifying CHAR_MAX. As in the backend's
3657 * cash.c, we must apply a range check to avoid being fooled by variant
3658 * CHAR_MAX values.
3659 */
3660 groupdigits = *extlconv->grouping;
3661 if (groupdigits <= 0 || groupdigits > 6)
3662 groupdigits = 3; /* most common */
3663
3664 /* Don't accept an empty thousands_sep string, either */
3665 /* similar code exists in formatting.c */
3666 if (*extlconv->thousands_sep)
3667 thousands_sep = pg_strdup(extlconv->thousands_sep);
3668 /* Make sure thousands separator doesn't match decimal point symbol. */
3669 else if (strcmp(decimal_point, ",") != 0)
3670 thousands_sep = ",";
3671 else
3672 thousands_sep = ".";
3673}
static char * thousands_sep
Definition: print.c:50
static char * decimal_point
Definition: print.c:48
static int groupdigits
Definition: print.c:49

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 56 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 77 of file print.c.

Referenced by do_pset(), and print_aligned_vertical().

◆ pg_utf8format

PGDLLIMPORT printTextFormat pg_utf8format
extern

Definition at line 99 of file print.c.

Referenced by do_pset(), and refresh_utf8format().