Le 07/09/2013 21:22, Pavel Stehule a écrit : > > > > 2013/9/7 Gilles Darold <gilles.dar...@dalibo.com > <mailto:gilles.dar...@dalibo.com>> > > Le 07/09/2013 10:02, Pavel Stehule a écrit : > > Hello > > > > * patch is cleanly patchable and compilation is without warnings > > * all regression tests passed > > * no impact on dump, performance or any current features > > * no comments to programming style > > * we would this feature - it is consistent with \set and it gives a > > fast resume about psql printer settings > > > > Issues: > > 1) it doesn't show linestyle when is default > > > > I looked there and it is probably a small different issue - this > value > > is initialized as NULL as default. But I dislike a empty output in > > this case: > > > > else if (strcmp(param, "linestyle") == 0) > > { > > if (!popt->topt.line_style) > > ; > > else > > printf(_("Line style is %s.\n"), > > get_line_style(&popt->topt)->name); > > } > > > > I propose a verbose result instead nothing: > > > > else if (strcmp(param, "linestyle") == 0) > > { > > if (!popt->topt.line_style) > > printf(_("Line style is unset.\n")) ; > > else > > printf(_("Line style is %s.\n"), > > get_line_style(&popt->topt)->name); > > } > > +1 to show the information even if linestyle is not set but by default > get_line_style() return "ascii" if linestyle is not set. So maybe > it is > better to rewrite it as follow: > > else if (strcmp(param, "linestyle") == 0) > { > printf(_("Line style is %s.\n"), > get_line_style(&popt->topt)->name); > } > > This will output: > > Line style is ascii. > > when linestyle is not set or of course it is set to ascii. > > > 2) there is only one open question > > > > http://www.postgresql.org/message-id/b6f6fd62f2624c4c9916ac0175d56d880ce00...@jenmbs01.ad.intershop.net > > - there is no clean relation between output and some pset option. > > > > I don't think so Marc' proposal is ideal (these values are not a > > variables) - but maybe some enhanced output (only for this > resume) can > > be better: > > > > postgres=# \pset > > Output format (format) is aligned. > > Border style (border) is 1. > > Expanded display (expanded) is off. > > Null display (null) is "". > > Field separator (fieldsep) is "|". > > Tuples only (tuples_only) is off. > > Title (title) is unset. > > Table attributes (tableattr) unset. > > Pager (pager) is used for long output. > > Record separator (recordsep) is <newline>. > > > > This expanded output should be used only for this resume (not when a > > option was changed or individual ask on option value) > > Yes this could be a good accommodation but I really prefer to not > duplicate code and translation between this resume and the output when > these options are set. If we can print the same output messages using: > > postgres=# \pset fieldsep '|' > Field separator (fieldsep) is "|". > > it could be a good compromise. > > > ok > > Pavel
Hello, Sorry for the delay, here is the new patch. The \pset output will look like follow: postgres=# \pset Border style (border) is 1. Target width (columns) unset. Expanded display (expanded) is off. Field separator (fieldsep) is "|". Default footer (footer) is on. Output format (format) s aligned. Line style (linestyle) is ascii. Null display (null) is "". Locale-adjusted numeric output (numericlocale) is off. Pager (pager) is used for long output. Record separator (recordsep) is <newline>. Table attributes (tableattr) unset. Title (title) unset. Tuples only (tuples_only) is off. postgres=# \pset null # Null display (null) is "#". postgres=# This also mean that all translation strings of those messages should be updated. If we don't want to modify those messages, I can provide an other patch which print output as follow: postgres=# \pset border: Border style is 1. columns: Target width unset. expanded: Expanded display is off. fieldsep: Field separator is "|". footer: Default footer is on. format: Output format is aligned. linestyle: Line style is ascii. null: Null display is "". numericlocale: Locale-adjusted numeric output is off. pager: Pager is used for long output. recordsep: Record separator is <newline>. tableattr: Table attributes unset. title: Title unset. tuples_only: Tuples only is off. postgres=# \pset null # Null display is "#". postgres=# I think the first output is better but it need translation work. Let me know. Regards, -- Gilles Darold Administrateur de bases de données http://dalibo.com - http://dalibo.org
diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 574db5c..ddf7bba 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -2272,13 +2272,10 @@ lo_import 152801 </para> </tip> - <note> <para> - It is an error to call <command>\pset</command> without any - arguments. In the future this case might show the current status - of all printing options. + <command>\pset</command> without any arguments displays current status + of all printing options. </para> - </note> </listitem> </varlistentry> diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 10e9f64..e044b73 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -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); - if (!quiet) - printf(_("Target width is %d.\n"), popt->topt.columns); + /* show border style/width */ + if (strcmp(param, "border") == 0) + { + if (!popt->topt.border) + puts(_("Border style (border) unset.")); + else + printf(_("Border style (border) is %d.\n"), + popt->topt.border); + } + + /* show the target width for the wrapped format */ + else if (strcmp(param, "columns") == 0) + { + if (!popt->topt.columns) + puts(_("Target width (columns) unset.")); + else + printf(_("Target width (columns) is %d.\n"), + 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 (expanded) is on.\n")); + else if (popt->topt.expanded == 2) + printf(_("Expanded display (expanded) is used automatically.\n")); + else + printf(_("Expanded display (expanded) is off.\n")); + } + + /* show field separator for unaligned text */ + else if (strcmp(param, "fieldsep") == 0) + { + if (popt->topt.fieldSep.separator_zero) + printf(_("Field separator (fieldsep) is zero byte.\n")); + else + printf(_("Field separator (fieldsep) is \"%s\".\n"), + popt->topt.fieldSep.separator); + } + + else if (strcmp(param, "fieldsep_zero") == 0) + { + printf(_("Field separator (fieldsep_zero) is zero byte.\n")); + } + + /* show disable "(x rows)" footer */ + else if (strcmp(param, "footer") == 0) + { + if (popt->topt.default_footer) + puts(_("Default footer (footer) is on.")); + else + puts(_("Default footer (footer) is off.")); + } + + /* show format */ + else if (strcmp(param, "format") == 0) + { + if (!popt->topt.format) + puts(_("Output format (format) is aligned.")); + else + printf(_("Output format (format) s %s.\n"), + _align2string(popt->topt.format)); + } + + /* show table line style */ + else if (strcmp(param, "linestyle") == 0) + { + printf(_("Line style (linestyle) is %s.\n"), + get_line_style(&popt->topt)->name); + } + + /* show null display */ + else if (strcmp(param, "null") == 0) + { + printf(_("Null display (null) is \"%s\".\n"), + popt->nullPrint ? popt->nullPrint : ""); + } + + /* show locale-aware numeric output */ + else if (strcmp(param, "numericlocale") == 0) + { + if (popt->topt.numericLocale) + puts(_("Locale-adjusted numeric output (numericlocale) is on.")); + else + puts(_("Locale-adjusted numeric output (numericlocale) is off.")); + } + + /* show toggle use of pager */ + else if (strcmp(param, "pager") == 0) + { + if (popt->topt.pager == 1) + puts(_("Pager (pager) is used for long output.")); + else if (popt->topt.pager == 2) + puts(_("Pager (pager) is always used.")); + else + puts(_("Pager (pager) usage is off.")); + } + + /* show record separator for unaligned text */ + else if (strcmp(param, "recordsep") == 0) + { + if (popt->topt.recordSep.separator_zero) + printf(_("Record separator (recordsep) is zero byte.\n")); + else if (strcmp(popt->topt.recordSep.separator, "\n") == 0) + printf(_("Record separator (recordsep) is <newline>.\n")); + else + printf(_("Record separator (recordsep) is \"%s\".\n"), + popt->topt.recordSep.separator); + } + + else if (strcmp(param, "recordsep_zero") == 0) + { + printf(_("Record separator (recordsep_zero) is zero byte.\n")); + } + + /* show HTML table tag options */ + else if (strcmp(param, "T") == 0 || strcmp(param, "tableattr") == 0) + { + if (popt->topt.tableAttr) + printf(_("Table attribute (tableattr) is \"%s\".\n"), + popt->topt.tableAttr); + else + printf(_("Table attributes (tableattr) unset.\n")); + } + + /* show title override */ + else if (strcmp(param, "title") == 0) + { + if (popt->title) + printf(_("Title (title) is \"%s\".\n"), popt->title); + else + printf(_("Title (title) unset.\n")); + } + + /* show toggle between full and tuples-only format */ + else if (strcmp(param, "t") == 0 || strcmp(param, "tuples_only") == 0) + { + if (popt->topt.tuples_only) + puts(_("Tuples only (tuples_only) is on.")); + else + puts(_("Tuples only (tuples_only) is off.")); } else @@ -2528,7 +2615,6 @@ do_pset(const char *param, const char *value, printQueryOpt *popt, bool quiet) } - #ifndef WIN32 #define DEFAULT_SHELL "/bin/sh" #else
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers