db-ctl-base: remove the recurse member from struct cmd_show_table
authorAndy Zhou <azhou@nicira.com>
Fri, 17 Jul 2015 23:39:07 +0000 (16:39 -0700)
committerAndy Zhou <azhou@nicira.com>
Thu, 23 Jul 2015 20:18:01 +0000 (13:18 -0700)
The 'recurse' is used during run time to suppress duplicated prints.
It is not essential to describe how show command should work.

This patch remove the 'recurse' member. Duplicated prints is now
suppressed by maintaining an 'sset' of tables that have been printed
at run time.

Signed-off-by: Andy Zhou <azhou@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
lib/db-ctl-base.c
lib/db-ctl-base.h
utilities/ovs-vsctl.c
vtep/vtep-ctl.c

index 09efd8d..a1d6e4e 100644 (file)
@@ -34,6 +34,7 @@
 #include "ovsdb-idl.h"
 #include "ovsdb-idl-provider.h"
 #include "shash.h"
+#include "sset.h"
 #include "string.h"
 #include "table.h"
 #include "util.h"
@@ -1648,9 +1649,12 @@ cmd_show_find_table_by_name(const char *name)
     return NULL;
 }
 
+/* 'shown' records the tables that has been displayed by the current
+ * command to avoid duplicated prints.
+ */
 static void
 cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row,
-             int level)
+             int level, struct sset *shown)
 {
     struct cmd_show_table *show = cmd_show_find_table_by_row(row);
     size_t i;
@@ -1667,11 +1671,11 @@ cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row,
     }
     ds_put_char(&ctx->output, '\n');
 
-    if (!show || show->recurse) {
+    if (!show || sset_find(shown, show->table->name)) {
         return;
     }
 
-    show->recurse = true;
+    sset_add(shown, show->table->name);
     for (i = 0; i < ARRAY_SIZE(show->columns); i++) {
         const struct ovsdb_idl_column *column = show->columns[i];
         const struct ovsdb_datum *datum;
@@ -1696,7 +1700,7 @@ cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row,
                                                          ref_show->table,
                                                          &datum->keys[j].uuid);
                     if (ref_row) {
-                        cmd_show_row(ctx, ref_row, level + 1);
+                        cmd_show_row(ctx, ref_row, level + 1, shown);
                     }
                 }
                 continue;
@@ -1749,18 +1753,22 @@ cmd_show_row(struct ctl_context *ctx, const struct ovsdb_idl_row *row,
             ds_put_char(&ctx->output, '\n');
         }
     }
-    show->recurse = false;
+    sset_find_and_delete_assert(shown, show->table->name);
 }
 
 static void
 cmd_show(struct ctl_context *ctx)
 {
     const struct ovsdb_idl_row *row;
+    struct sset shown = SSET_INITIALIZER(&shown);
 
     for (row = ovsdb_idl_first_row(ctx->idl, cmd_show_tables[0].table);
          row; row = ovsdb_idl_next_row(row)) {
-        cmd_show_row(ctx, row, 0);
+        cmd_show_row(ctx, row, 0, &shown);
     }
+
+    ovs_assert(sset_is_empty(&shown));
+    sset_destroy(&shown);
 }
 
 \f
index 9220ece..aff242b 100644 (file)
@@ -157,15 +157,11 @@ struct ctl_command *ctl_parse_commands(int argc, char *argv[],
  *
  * - 'columns[]' allows user to specify the print of additional columns
  *   in 'table'.
- *
- * - 'recurse' is used to avoid duplicate print.
- *
  * */
 struct cmd_show_table {
     const struct ovsdb_idl_table_class *table;
     const struct ovsdb_idl_column *name_column;
     const struct ovsdb_idl_column *columns[3]; /* Seems like a good number. */
-    bool recurse;
 };
 
 /* This array defines the 'show' command output format.  User can check the
index 4fb88b1..ce05c47 100644 (file)
@@ -980,45 +980,45 @@ struct cmd_show_table cmd_show_tables[] = {
      NULL,
      {&ovsrec_open_vswitch_col_manager_options,
       &ovsrec_open_vswitch_col_bridges,
-      &ovsrec_open_vswitch_col_ovs_version},
-     false},
+      &ovsrec_open_vswitch_col_ovs_version}
+    },
 
     {&ovsrec_table_bridge,
      &ovsrec_bridge_col_name,
      {&ovsrec_bridge_col_controller,
       &ovsrec_bridge_col_fail_mode,
-      &ovsrec_bridge_col_ports},
-     false},
+      &ovsrec_bridge_col_ports}
+    },
 
     {&ovsrec_table_port,
      &ovsrec_port_col_name,
      {&ovsrec_port_col_tag,
       &ovsrec_port_col_trunks,
-      &ovsrec_port_col_interfaces},
-     false},
+      &ovsrec_port_col_interfaces}
+    },
 
     {&ovsrec_table_interface,
      &ovsrec_interface_col_name,
      {&ovsrec_interface_col_type,
       &ovsrec_interface_col_options,
-      &ovsrec_interface_col_error},
-     false},
+      &ovsrec_interface_col_error}
+    },
 
     {&ovsrec_table_controller,
      &ovsrec_controller_col_target,
      {&ovsrec_controller_col_is_connected,
       NULL,
-      NULL},
-     false},
+      NULL}
+    },
 
     {&ovsrec_table_manager,
      &ovsrec_manager_col_target,
      {&ovsrec_manager_col_is_connected,
       NULL,
-      NULL},
-     false},
+      NULL}
+    },
 
-    {NULL, NULL, {NULL, NULL, NULL}, false}
+    {NULL, NULL, {NULL, NULL, NULL}}
 };
 
 static void
index be8fd56..98afbda 100644 (file)
@@ -369,38 +369,38 @@ struct cmd_show_table cmd_show_tables[] = {
      NULL,
      {&vteprec_global_col_managers,
       &vteprec_global_col_switches,
-      NULL},
-     false},
+      NULL}
+    },
 
     {&vteprec_table_manager,
      &vteprec_manager_col_target,
      {&vteprec_manager_col_is_connected,
       NULL,
-      NULL},
-     false},
+      NULL}
+    },
 
     {&vteprec_table_physical_switch,
      &vteprec_physical_switch_col_name,
      {&vteprec_physical_switch_col_management_ips,
       &vteprec_physical_switch_col_tunnel_ips,
-      &vteprec_physical_switch_col_ports},
-     false},
+      &vteprec_physical_switch_col_ports}
+    },
 
     {&vteprec_table_physical_port,
      &vteprec_physical_port_col_name,
      {&vteprec_physical_port_col_vlan_bindings,
       NULL,
-      NULL},
-     false},
+      NULL}
+    },
 
     {&vteprec_table_logical_switch,
      &vteprec_logical_switch_col_name,
      {NULL,
       NULL,
-      NULL},
-     false},
+      NULL}
+    },
 
-    {NULL, NULL, {NULL, NULL, NULL}, false}
+    {NULL, NULL, {NULL, NULL, NULL}}
 };
 
 /* vtep-ctl specific context.  Inherits the 'struct ctl_context' as base. */