|
|
|
@ -68,6 +68,7 @@ static int strip_lineno_from_funcdesc(char *func); |
|
|
|
|
static void minimal_error_message(PGresult *res); |
|
|
|
|
|
|
|
|
|
static void printSSLInfo(void); |
|
|
|
|
static bool printPsetInfo(const char *param, struct printQueryOpt *popt); |
|
|
|
|
|
|
|
|
|
#ifdef WIN32 |
|
|
|
|
static void checkWin32Codepage(void); |
|
|
|
@ -1045,8 +1046,20 @@ exec_command(const char *cmd, |
|
|
|
|
|
|
|
|
|
if (!opt0) |
|
|
|
|
{ |
|
|
|
|
psql_error("\\%s: missing required argument\n", cmd); |
|
|
|
|
success = false; |
|
|
|
|
size_t i; |
|
|
|
|
/* list all variables */ |
|
|
|
|
static const char *const my_list[] = { |
|
|
|
|
"border", "columns", "expanded", "fieldsep", |
|
|
|
|
"footer", "format", "linestyle", "null", |
|
|
|
|
"numericlocale", "pager", "recordsep", |
|
|
|
|
"tableattr", "title", "tuples_only", |
|
|
|
|
NULL }; |
|
|
|
|
for (i = 0; my_list[i] != NULL; i++) { |
|
|
|
|
printPsetInfo(my_list[i], &pset.popt); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
success = true; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
success = do_pset(opt0, opt1, &pset.popt, pset.quiet); |
|
|
|
@ -2275,8 +2288,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!quiet) |
|
|
|
|
printf(_("Output format is %s.\n"), _align2string(popt->topt.format)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* set table line style */ |
|
|
|
@ -2296,9 +2307,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!quiet) |
|
|
|
|
printf(_("Line style is %s.\n"), |
|
|
|
|
get_line_style(&popt->topt)->name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* set border style/width */ |
|
|
|
@ -2307,8 +2315,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
if (value) |
|
|
|
|
popt->topt.border = atoi(value); |
|
|
|
|
|
|
|
|
|
if (!quiet) |
|
|
|
|
printf(_("Border style is %d.\n"), popt->topt.border); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* set expanded/vertical mode */ |
|
|
|
@ -2320,15 +2326,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->topt.expanded = ParseVariableBool(value); |
|
|
|
|
else |
|
|
|
|
popt->topt.expanded = !popt->topt.expanded; |
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.expanded == 1) |
|
|
|
|
printf(_("Expanded display is on.\n")); |
|
|
|
|
else if (popt->topt.expanded == 2) |
|
|
|
|
printf(_("Expanded display is used automatically.\n")); |
|
|
|
|
else |
|
|
|
|
printf(_("Expanded display is off.\n")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* locale-aware numeric output */ |
|
|
|
@ -2338,13 +2335,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->topt.numericLocale = ParseVariableBool(value); |
|
|
|
|
else |
|
|
|
|
popt->topt.numericLocale = !popt->topt.numericLocale; |
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.numericLocale) |
|
|
|
|
puts(_("Showing locale-adjusted numeric output.")); |
|
|
|
|
else |
|
|
|
|
puts(_("Locale-adjusted numeric output is off.")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* null display */ |
|
|
|
@ -2355,8 +2345,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
free(popt->nullPrint); |
|
|
|
|
popt->nullPrint = pg_strdup(value); |
|
|
|
|
} |
|
|
|
|
if (!quiet) |
|
|
|
|
printf(_("Null display is \"%s\".\n"), popt->nullPrint ? popt->nullPrint : ""); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* field separator for unaligned text */ |
|
|
|
@ -2368,13 +2356,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->topt.fieldSep.separator = pg_strdup(value); |
|
|
|
|
popt->topt.fieldSep.separator_zero = false; |
|
|
|
|
} |
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.fieldSep.separator_zero) |
|
|
|
|
printf(_("Field separator is zero byte.\n")); |
|
|
|
|
else |
|
|
|
|
printf(_("Field separator is \"%s\".\n"), popt->topt.fieldSep.separator); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if (strcmp(param, "fieldsep_zero") == 0) |
|
|
|
@ -2382,8 +2363,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
free(popt->topt.fieldSep.separator); |
|
|
|
|
popt->topt.fieldSep.separator = NULL; |
|
|
|
|
popt->topt.fieldSep.separator_zero = true; |
|
|
|
|
if (!quiet) |
|
|
|
|
printf(_("Field separator is zero byte.\n")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* record separator for unaligned text */ |
|
|
|
@ -2395,15 +2374,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->topt.recordSep.separator = pg_strdup(value); |
|
|
|
|
popt->topt.recordSep.separator_zero = false; |
|
|
|
|
} |
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.recordSep.separator_zero) |
|
|
|
|
printf(_("Record separator is zero byte.\n")); |
|
|
|
|
else if (strcmp(popt->topt.recordSep.separator, "\n") == 0) |
|
|
|
|
printf(_("Record separator is <newline>.")); |
|
|
|
|
else |
|
|
|
|
printf(_("Record separator is \"%s\".\n"), popt->topt.recordSep.separator); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if (strcmp(param, "recordsep_zero") == 0) |
|
|
|
@ -2411,8 +2381,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
free(popt->topt.recordSep.separator); |
|
|
|
|
popt->topt.recordSep.separator = NULL; |
|
|
|
|
popt->topt.recordSep.separator_zero = true; |
|
|
|
|
if (!quiet) |
|
|
|
|
printf(_("Record separator is zero byte.\n")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* toggle between full and tuples-only format */ |
|
|
|
@ -2422,13 +2390,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->topt.tuples_only = ParseVariableBool(value); |
|
|
|
|
else |
|
|
|
|
popt->topt.tuples_only = !popt->topt.tuples_only; |
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.tuples_only) |
|
|
|
|
puts(_("Showing only tuples.")); |
|
|
|
|
else |
|
|
|
|
puts(_("Tuples only is off.")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* set title override */ |
|
|
|
@ -2439,14 +2400,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->title = NULL; |
|
|
|
|
else |
|
|
|
|
popt->title = pg_strdup(value); |
|
|
|
|
|
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->title) |
|
|
|
|
printf(_("Title is \"%s\".\n"), popt->title); |
|
|
|
|
else |
|
|
|
|
printf(_("Title is unset.\n")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* set HTML table tag options */ |
|
|
|
@ -2457,14 +2410,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->topt.tableAttr = NULL; |
|
|
|
|
else |
|
|
|
|
popt->topt.tableAttr = pg_strdup(value); |
|
|
|
|
|
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.tableAttr) |
|
|
|
|
printf(_("Table attribute is \"%s\".\n"), popt->topt.tableAttr); |
|
|
|
|
else |
|
|
|
|
printf(_("Table attributes unset.\n")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* toggle use of pager */ |
|
|
|
@ -2481,15 +2426,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->topt.pager = 0; |
|
|
|
|
else |
|
|
|
|
popt->topt.pager = 1; |
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.pager == 1) |
|
|
|
|
puts(_("Pager is used for long output.")); |
|
|
|
|
else if (popt->topt.pager == 2) |
|
|
|
|
puts(_("Pager is always used.")); |
|
|
|
|
else |
|
|
|
|
puts(_("Pager usage is off.")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* disable "(x rows)" footer */ |
|
|
|
@ -2499,13 +2435,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
popt->topt.default_footer = ParseVariableBool(value); |
|
|
|
|
else |
|
|
|
|
popt->topt.default_footer = !popt->topt.default_footer; |
|
|
|
|
if (!quiet) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.default_footer) |
|
|
|
|
puts(_("Default footer is on.")); |
|
|
|
|
else |
|
|
|
|
puts(_("Default footer is off.")); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* set border style/width */ |
|
|
|
@ -2513,9 +2442,167 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) |
|
|
|
|
{ |
|
|
|
|
if (value) |
|
|
|
|
popt->topt.columns = atoi(value); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
psql_error("\\pset: unknown option: %s\n", param); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!quiet) |
|
|
|
|
printPsetInfo(param, &pset.popt); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool |
|
|
|
|
printPsetInfo(const char *param, struct printQueryOpt *popt) |
|
|
|
|
{ |
|
|
|
|
Assert(param != NULL); |
|
|
|
|
|
|
|
|
|
/* show border style/width */ |
|
|
|
|
if (strcmp(param, "border") == 0) |
|
|
|
|
{ |
|
|
|
|
if (!popt->topt.border) |
|
|
|
|
printf(_("Border style (%s) unset.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Border style (%s) is %d.\n"), param, |
|
|
|
|
popt->topt.border); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show the target width for the wrapped format */ |
|
|
|
|
else if (strcmp(param, "columns") == 0) |
|
|
|
|
{ |
|
|
|
|
if (!popt->topt.columns) |
|
|
|
|
printf(_("Target width (%s) unset.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Target width (%s) is %d.\n"), param, |
|
|
|
|
popt->topt.columns); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show expanded/vertical mode */ |
|
|
|
|
else if (strcmp(param, "x") == 0 || strcmp(param, "expanded") == 0 || strcmp(param, "vertical") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.expanded == 1) |
|
|
|
|
printf(_("Expanded display (%s) is on.\n"), param); |
|
|
|
|
else if (popt->topt.expanded == 2) |
|
|
|
|
printf(_("Expanded display (%s) is used automatically.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Expanded display (%s) is off.\n"), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show field separator for unaligned text */ |
|
|
|
|
else if (strcmp(param, "fieldsep") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.fieldSep.separator_zero) |
|
|
|
|
printf(_("Field separator (%s) is zero byte.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Field separator (%s) is \"%s\".\n"), param, |
|
|
|
|
popt->topt.fieldSep.separator); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if (strcmp(param, "fieldsep_zero") == 0) |
|
|
|
|
{ |
|
|
|
|
printf(_("Field separator (%s) is zero byte.\n"), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show disable "(x rows)" footer */ |
|
|
|
|
else if (strcmp(param, "footer") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.default_footer) |
|
|
|
|
printf(_("Default footer (%s) is on.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Default footer (%s) is off."), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show format */ |
|
|
|
|
else if (strcmp(param, "format") == 0) |
|
|
|
|
{ |
|
|
|
|
if (!popt->topt.format) |
|
|
|
|
printf(_("Output format (%s) is aligned.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Output format (%s) is %s.\n"), param, |
|
|
|
|
_align2string(popt->topt.format)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show table line style */ |
|
|
|
|
else if (strcmp(param, "linestyle") == 0) |
|
|
|
|
{ |
|
|
|
|
printf(_("Line style (%s) is %s.\n"), param, |
|
|
|
|
get_line_style(&popt->topt)->name); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show null display */ |
|
|
|
|
else if (strcmp(param, "null") == 0) |
|
|
|
|
{ |
|
|
|
|
printf(_("Null display (%s) is \"%s\".\n"), param, |
|
|
|
|
popt->nullPrint ? popt->nullPrint : ""); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show locale-aware numeric output */ |
|
|
|
|
else if (strcmp(param, "numericlocale") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.numericLocale) |
|
|
|
|
printf(_("Locale-adjusted numeric output (%s) is on.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Locale-adjusted numeric output (%s) is off.\n"), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show toggle use of pager */ |
|
|
|
|
else if (strcmp(param, "pager") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.pager == 1) |
|
|
|
|
printf(_("Pager (%s) is used for long output.\n"), param); |
|
|
|
|
else if (popt->topt.pager == 2) |
|
|
|
|
printf(_("Pager (%s) is always used.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Pager (%s) usage is off.\n"), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show record separator for unaligned text */ |
|
|
|
|
else if (strcmp(param, "recordsep") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.recordSep.separator_zero) |
|
|
|
|
printf(_("Record separator (%s) is zero byte.\n"), param); |
|
|
|
|
else if (strcmp(popt->topt.recordSep.separator, "\n") == 0) |
|
|
|
|
printf(_("Record separator (%s) is <newline>.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Record separator (%s) is \"%s\".\n"), param, |
|
|
|
|
popt->topt.recordSep.separator); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if (strcmp(param, "recordsep_zero") == 0) |
|
|
|
|
{ |
|
|
|
|
printf(_("Record separator (%s) is zero byte.\n"), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show HTML table tag options */ |
|
|
|
|
else if (strcmp(param, "T") == 0 || strcmp(param, "tableattr") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.tableAttr) |
|
|
|
|
printf(_("Table attribute (%s) is \"%s\".\n"), param, |
|
|
|
|
popt->topt.tableAttr); |
|
|
|
|
else |
|
|
|
|
printf(_("Table attributes (%s) unset.\n"), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!quiet) |
|
|
|
|
printf(_("Target width is %d.\n"), popt->topt.columns); |
|
|
|
|
/* show title override */ |
|
|
|
|
else if (strcmp(param, "title") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->title) |
|
|
|
|
printf(_("Title (%s) is \"%s\".\n"), param, popt->title); |
|
|
|
|
else |
|
|
|
|
printf(_("Title (%s) unset.\n"), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* show toggle between full and tuples-only format */ |
|
|
|
|
else if (strcmp(param, "t") == 0 || strcmp(param, "tuples_only") == 0) |
|
|
|
|
{ |
|
|
|
|
if (popt->topt.tuples_only) |
|
|
|
|
printf(_("Tuples only (%s) is on.\n"), param); |
|
|
|
|
else |
|
|
|
|
printf(_("Tuples only (%s) is off.\n"), param); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else |
|
|
|
|