[ovs-dev] [kernel-reload 6/8] table: Add new "bare" output formatting options.
Ethan Jackson
ethan at nicira.com
Tue Feb 8 22:24:56 UTC 2011
Looks Good.
On Wed, Feb 2, 2011 at 2:31 PM, Ben Pfaff <blp at nicira.com> wrote:
> --format=list corresponds to the output format that "ovs-vsctl list" has
> always used.
>
> --bare is easier for scripts to parse.
> ---
> lib/automake.mk | 1 +
> lib/ovsdb-data.c | 39 ++++++++++++++++++++++++++++++++++++++-
> lib/ovsdb-data.h | 6 +++++-
> lib/table.c | 46 ++++++++++++++++++++++++++++++++++++++++++----
> lib/table.h | 14 ++++++++++++--
> lib/table.man | 13 +++++++++++--
> ovsdb/ovsdb-client.1.in | 1 +
> ovsdb/ovsdb-client.c | 2 +-
> 8 files changed, 111 insertions(+), 11 deletions(-)
>
> diff --git a/lib/automake.mk b/lib/automake.mk
> index 36b6005..2758d36 100644
> --- a/lib/automake.mk
> +++ b/lib/automake.mk
> @@ -231,6 +231,7 @@ EXTRA_DIST += \
> lib/ssl.man \
> lib/ssl-syn.man \
> lib/stress-unixctl.man \
> + lib/table.man \
> lib/unixctl.man \
> lib/unixctl-syn.man \
> lib/vconn-active.man \
> diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c
> index 20d333e..5b91ea0 100644
> --- a/lib/ovsdb-data.c
> +++ b/lib/ovsdb-data.c
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2009, 2010 Nicira Networks
> +/* Copyright (c) 2009, 2010, 2011 Nicira Networks
> *
> * Licensed under the Apache License, Version 2.0 (the "License");
> * you may not use this file except in compliance with the License.
> @@ -625,6 +625,20 @@ ovsdb_atom_to_string(const union ovsdb_atom *atom, enum ovsdb_atomic_type type,
> }
> }
>
> +/* Appends 'atom' (which has the given 'type') to 'out', in a bare string
> + * format that cannot be parsed uniformly back into a datum but is easier for
> + * shell scripts, etc., to deal with. */
> +void
> +ovsdb_atom_to_bare(const union ovsdb_atom *atom, enum ovsdb_atomic_type type,
> + struct ds *out)
> +{
> + if (type == OVSDB_TYPE_STRING) {
> + ds_put_cstr(out, atom->string);
> + } else {
> + ovsdb_atom_to_string(atom, type, out);
> + }
> +}
> +
> static struct ovsdb_error *
> check_string_constraints(const char *s,
> const struct ovsdb_string_constraints *c)
> @@ -1445,6 +1459,29 @@ ovsdb_datum_to_string(const struct ovsdb_datum *datum,
> }
> }
>
> +/* Appends to 'out' the 'datum' (with the given 'type') in a bare string format
> + * that cannot be parsed uniformly back into a datum but is easier for shell
> + * scripts, etc., to deal with. */
> +void
> +ovsdb_datum_to_bare(const struct ovsdb_datum *datum,
> + const struct ovsdb_type *type, struct ds *out)
> +{
> + bool is_map = ovsdb_type_is_map(type);
> + size_t i;
> +
> + for (i = 0; i < datum->n; i++) {
> + if (i > 0) {
> + ds_put_cstr(out, " ");
> + }
> +
> + ovsdb_atom_to_bare(&datum->keys[i], type->key.type, out);
> + if (is_map) {
> + ds_put_char(out, '=');
> + ovsdb_atom_to_bare(&datum->values[i], type->value.type, out);
> + }
> + }
> +}
> +
> /* Initializes 'datum' as a string-to-string map whose contents are taken from
> * 'sh'. Destroys 'sh'. */
> void
> diff --git a/lib/ovsdb-data.h b/lib/ovsdb-data.h
> index f7e98a8..ced3033 100644
> --- a/lib/ovsdb-data.h
> +++ b/lib/ovsdb-data.h
> @@ -1,4 +1,4 @@
> -/* Copyright (c) 2009, 2010 Nicira Networks
> +/* Copyright (c) 2009, 2010, 2011 Nicira Networks
> *
> * Licensed under the Apache License, Version 2.0 (the "License");
> * you may not use this file except in compliance with the License.
> @@ -94,6 +94,8 @@ char *ovsdb_atom_from_string(union ovsdb_atom *,
> WARN_UNUSED_RESULT;
> void ovsdb_atom_to_string(const union ovsdb_atom *, enum ovsdb_atomic_type,
> struct ds *);
> +void ovsdb_atom_to_bare(const union ovsdb_atom *, enum ovsdb_atomic_type,
> + struct ds *);
>
> struct ovsdb_error *ovsdb_atom_check_constraints(
> const union ovsdb_atom *, const struct ovsdb_base_type *)
> @@ -167,6 +169,8 @@ char *ovsdb_datum_from_string(struct ovsdb_datum *,
> WARN_UNUSED_RESULT;
> void ovsdb_datum_to_string(const struct ovsdb_datum *,
> const struct ovsdb_type *, struct ds *);
> +void ovsdb_datum_to_bare(const struct ovsdb_datum *,
> + const struct ovsdb_type *, struct ds *);
>
> void ovsdb_datum_from_shash(struct ovsdb_datum *, struct shash *);
>
> diff --git a/lib/table.c b/lib/table.c
> index 8116c7e..7c23a16 100644
> --- a/lib/table.c
> +++ b/lib/table.c
> @@ -37,7 +37,7 @@ cell_to_text(const struct cell *cell_, const struct table_style *style)
> if (cell->json) {
> if (style->cell_format == CF_JSON || !cell->type) {
> cell->text = json_to_string(cell->json, JSSF_SORT);
> - } else if (style->cell_format == CF_STRING) {
> + } else {
> struct ovsdb_datum datum;
> struct ovsdb_error *error;
> struct ds s;
> @@ -46,14 +46,16 @@ cell_to_text(const struct cell *cell_, const struct table_style *style)
> NULL);
> if (!error) {
> ds_init(&s);
> - ovsdb_datum_to_string(&datum, cell->type, &s);
> + if (style->cell_format == CF_STRING) {
> + ovsdb_datum_to_string(&datum, cell->type, &s);
> + } else {
> + ovsdb_datum_to_bare(&datum, cell->type, &s);
> + }
> ovsdb_datum_destroy(&datum, cell->type);
> cell->text = ds_steal_cstr(&s);
> } else {
> cell->text = json_to_string(cell->json, JSSF_SORT);
> }
> - } else {
> - NOT_REACHED();
> }
> } else {
> cell->text = xstrdup("");
> @@ -273,6 +275,34 @@ table_print_table__(const struct table *table, const struct table_style *style)
> }
>
> static void
> +table_print_list__(const struct table *table, const struct table_style *style)
> +{
> + static int n = 0;
> + size_t x, y;
> +
> + if (n++ > 0) {
> + putchar('\n');
> + }
> +
> + if (table->caption) {
> + puts(table->caption);
> + }
> +
> + for (y = 0; y < table->n_rows; y++) {
> + if (y > 0) {
> + putchar('\n');
> + }
> + for (x = 0; x < table->n_columns; x++) {
> + const char *text = cell_to_text(table_cell__(table, y, x), style);
> + if (style->headings) {
> + printf("%-20s: ", table->columns[x].heading);
> + }
> + puts(text);
> + }
> + }
> +}
> +
> +static void
> table_escape_html_text__(const char *s, size_t n)
> {
> size_t i;
> @@ -469,6 +499,8 @@ table_parse_format(struct table_style *style, const char *format)
> {
> if (!strcmp(format, "table")) {
> style->format = TF_TABLE;
> + } else if (!strcmp(format, "list")) {
> + style->format = TF_LIST;
> } else if (!strcmp(format, "html")) {
> style->format = TF_HTML;
> } else if (!strcmp(format, "csv")) {
> @@ -487,6 +519,8 @@ table_parse_cell_format(struct table_style *style, const char *format)
> {
> if (!strcmp(format, "string")) {
> style->cell_format = CF_STRING;
> + } else if (!strcmp(format, "bare")) {
> + style->cell_format = CF_BARE;
> } else if (!strcmp(format, "json")) {
> style->cell_format = CF_JSON;
> } else {
> @@ -503,6 +537,10 @@ table_print(const struct table *table, const struct table_style *style)
> table_print_table__(table, style);
> break;
>
> + case TF_LIST:
> + table_print_list__(table, style);
> + break;
> +
> case TF_HTML:
> table_print_html__(table, style);
> break;
> diff --git a/lib/table.h b/lib/table.h
> index c826bfb..cfe5e63 100644
> --- a/lib/table.h
> +++ b/lib/table.h
> @@ -59,6 +59,7 @@ struct cell *table_add_cell(struct table *table);
>
> enum table_format {
> TF_TABLE, /* 2-d table. */
> + TF_LIST, /* One cell per line, one row per paragraph. */
> TF_HTML, /* HTML table. */
> TF_CSV, /* Comma-separated lines. */
> TF_JSON /* JSON. */
> @@ -66,6 +67,7 @@ enum table_format {
>
> enum cell_format {
> CF_STRING, /* String format. */
> + CF_BARE, /* String format without most punctuation. */
> CF_JSON /* JSON. */
> };
>
> @@ -80,13 +82,15 @@ struct table_style {
>
> #define TABLE_OPTION_ENUMS \
> OPT_NO_HEADINGS, \
> - OPT_PRETTY
> + OPT_PRETTY, \
> + OPT_BARE
>
> #define TABLE_LONG_OPTIONS \
> {"format", required_argument, 0, 'f'}, \
> {"data", required_argument, 0, 'd'}, \
> {"no-headings", no_argument, 0, OPT_NO_HEADINGS}, \
> - {"pretty", no_argument, 0, OPT_PRETTY},
> + {"pretty", no_argument, 0, OPT_PRETTY}, \
> + {"bare", no_argument, 0, OPT_BARE}
>
> #define TABLE_OPTION_HANDLERS(STYLE) \
> case 'f': \
> @@ -103,6 +107,12 @@ struct table_style {
> \
> case OPT_PRETTY: \
> (STYLE)->json_flags |= JSSF_PRETTY; \
> + break; \
> + \
> + case OPT_BARE: \
> + (STYLE)->format = TF_LIST; \
> + (STYLE)->cell_format = CF_BARE; \
> + (STYLE)->headings = false; \
> break;
>
> void table_parse_format(struct table_style *, const char *format);
> diff --git a/lib/table.man b/lib/table.man
> index 8be272a..41e039c 100644
> --- a/lib/table.man
> +++ b/lib/table.man
> @@ -3,8 +3,10 @@
> Sets the type of table formatting. The following types of
> \fIformat\fR are available:
> .RS
> -.IP "\fBtable\fR (default)"
> -Text-based tables with aligned columns.
> +.IP "\fBtable\fR"
> +2-D text tables with aligned columns.
> +.IP "\fBlist\fR"
> +A list with one column per line and rows separated by a blank line.
> .IP "\fBhtml\fR"
> HTML tables.
> .IP "\fBcvs\fR"
> @@ -37,6 +39,11 @@ types of \fIformat\fR are available:
> .RS
> .IP "\fBstring\fR (default)"
> The simple format described in \fBovs\-vsctl\fR(8).
> +.IP "\fBbare\fR"
> +The simple format with punctuation stripped off: \fB[]\fR and \fB{}\fR
> +are omitted around sets, maps, and empty columns, items within sets
> +and maps are space-separated, and strings are never quoted. This
> +format may be easier for scripts to parse.
> .IP "\fBjson\fR"
> JSON.
> .RE
> @@ -56,3 +63,5 @@ per line, with indentation.
> .IP
> This option does not affect JSON in tables, which is always printed
> compactly.
> +.IP "\fB\-\-bare\fR"
> +Equivalent to \fB\-\-format=list \-\-data=bare \-\-no\-headings\fR.
> diff --git a/ovsdb/ovsdb-client.1.in b/ovsdb/ovsdb-client.1.in
> index 2b1281d..fe7b7fa 100644
> --- a/ovsdb/ovsdb-client.1.in
> +++ b/ovsdb/ovsdb-client.1.in
> @@ -127,6 +127,7 @@ contents of \fItable\fR.
> Much of the output from \fBovsdb\-client\fR is in the form of tables.
> The following options controlling output formatting:
> .
> +.ds TD (default)
> .so lib/table.man
> .
> .SS "Daemon Options"
> diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c
> index 6402e90..a66b013 100644
> --- a/ovsdb/ovsdb-client.c
> +++ b/ovsdb/ovsdb-client.c
> @@ -80,7 +80,7 @@ parse_options(int argc, char *argv[])
> DAEMON_LONG_OPTIONS,
> #ifdef HAVE_OPENSSL
> {"bootstrap-ca-cert", required_argument, 0, OPT_BOOTSTRAP_CA_CERT},
> - TABLE_LONG_OPTIONS
> + TABLE_LONG_OPTIONS,
> STREAM_SSL_LONG_OPTIONS
> #endif
> {0, 0, 0, 0},
> --
> 1.7.1
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
>
More information about the dev
mailing list