ovsdb_idl_add_column(ctx->idl, column);
}
}
+ if (show->wref_table.table) {
+ ovsdb_idl_add_table(ctx->idl, show->wref_table.table);
+ }
+ if (show->wref_table.name_column) {
+ ovsdb_idl_add_column(ctx->idl, show->wref_table.name_column);
+ }
+ if (show->wref_table.wref_column) {
+ ovsdb_idl_add_column(ctx->idl, show->wref_table.wref_column);
+ }
}
}
return NULL;
}
+/* Prints table entries that weak reference the 'cur_row'. */
+static void
+cmd_show_weak_ref(struct ctl_context *ctx, const struct cmd_show_table *show,
+ const struct ovsdb_idl_row *cur_row, int level)
+{
+ const struct ovsdb_idl_row *row_wref;
+ const struct ovsdb_idl_table_class *table = show->wref_table.table;
+ const struct ovsdb_idl_column *name_column
+ = show->wref_table.name_column;
+ const struct ovsdb_idl_column *wref_column
+ = show->wref_table.wref_column;
+
+ if (!table || !name_column || !wref_column) {
+ return;
+ }
+
+ for (row_wref = ovsdb_idl_first_row(ctx->idl, table); row_wref;
+ row_wref = ovsdb_idl_next_row(row_wref)) {
+ const struct ovsdb_datum *wref_datum
+ = ovsdb_idl_read(row_wref, wref_column);
+ /* If weak reference refers to the 'cur_row', prints it. */
+ if (wref_datum->n
+ && uuid_equals(&cur_row->uuid, &wref_datum->keys[0].uuid)) {
+ const struct ovsdb_datum *name_datum
+ = ovsdb_idl_read(row_wref, name_column);
+ ds_put_char_multiple(&ctx->output, ' ', (level + 1) * 4);
+ ds_put_format(&ctx->output, "%s ", table->name);
+ ovsdb_datum_to_string(name_datum, &name_column->type, &ctx->output);
+ ds_put_char(&ctx->output, '\n');
+ }
+ }
+}
+
/* 'shown' records the tables that has been displayed by the current
* command to avoid duplicated prints.
*/
ds_put_char(&ctx->output, '\n');
}
}
+ cmd_show_weak_ref(ctx, show, row, level);
sset_find_and_delete_assert(shown, show->table->name);
}
NULL, "--if-exists,--all", RW},
{"wait-until", 2, INT_MAX, "TABLE RECORD [COLUMN[:KEY]=VALUE]...",
pre_cmd_wait_until, cmd_wait_until, NULL, "", RO},
- {"show", 0, 0, "", pre_cmd_show, cmd_show, NULL, "", RO},
{NULL, 0, 0, NULL, NULL, NULL, NULL, NULL, RO},
};
+static void
+ctl_register_command(const struct ctl_command_syntax *command)
+{
+ shash_add_assert(&all_commands, command->name, command);
+}
+
/* Registers commands represented by 'struct ctl_command_syntax's to
* 'all_commands'. The last element of 'commands' must be an all-NULL
* element. */
const struct ctl_command_syntax *p;
for (p = commands; p->name; p++) {
- shash_add_assert(&all_commands, p->name, p);
+ ctl_register_command(p);
}
}
void (*ctl_exit_func_)(int status))
{
tables = tables_;
- cmd_show_tables = cmd_show_tables_;
ctl_exit_func = ctl_exit_func_;
ctl_register_commands(db_ctl_commands);
+
+ cmd_show_tables = cmd_show_tables_;
+ if (cmd_show_tables) {
+ static const struct ctl_command_syntax show =
+ {"show", 0, 0, "", pre_cmd_show, cmd_show, NULL, "", RO};
+ ctl_register_command(&show);
+ }
}
/* Returns the text for the database commands usage. */