Le 07/09/2013 21:22, Pavel Stehule a écrit :
>
>
>
> 2013/9/7 Gilles Darold <[email protected]
> <mailto:[email protected]>>
>
> 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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers