summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/db-ctl-base.c51
1 files changed, 29 insertions, 22 deletions
diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
index 88d3e2962..2c21cc653 100644
--- a/lib/db-ctl-base.c
+++ b/lib/db-ctl-base.c
@@ -72,7 +72,7 @@ static const struct ovsdb_idl_table_class *idl_classes;
static size_t n_classes;
static struct shash all_commands = SHASH_INITIALIZER(&all_commands);
-static const struct ovsdb_idl_table_class *get_table(const char *table_name);
+static char *get_table(const char *, const struct ovsdb_idl_table_class **);
static void set_column(const struct ovsdb_idl_table_class *,
const struct ovsdb_idl_row *, const char *,
struct ovsdb_symbol_table *);
@@ -455,7 +455,8 @@ pre_get_column(struct ctl_context *ctx,
static const struct ovsdb_idl_table_class *
pre_get_table(struct ctl_context *ctx, const char *table_name)
{
- const struct ovsdb_idl_table_class *table = get_table(table_name);
+ const struct ovsdb_idl_table_class *table;
+ die_if_error(get_table(table_name, &table));
ovsdb_idl_add_table(ctx->idl, table);
const struct ctl_table_class *ctl = &ctl_classes[table - idl_classes];
@@ -842,7 +843,7 @@ cmd_get(struct ctl_context *ctx)
ctl_fatal("--if-exists and --id may not be specified together");
}
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
row = ctl_get_row(ctx, table, record_id, must_exist);
if (!row) {
return;
@@ -1073,7 +1074,7 @@ cmd_list(struct ctl_context *ctx)
size_t n_columns;
int i;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
die_if_error(parse_column_names(column_names, table, &columns, &n_columns));
out = ctx->table = list_make_table(columns, n_columns);
if (ctx->argc > 2) {
@@ -1092,13 +1093,15 @@ cmd_list(struct ctl_context *ctx)
free(columns);
}
-/* Finds and returns the "struct ovsdb_idl_table_class *" with 'table_name' by
- * searching the tables in these schema. */
-static const struct ovsdb_idl_table_class *
-get_table(const char *table_name)
+/* Finds the "struct ovsdb_idl_table_class *" with 'table_name' by searching
+ * the tables in these schema. Returns NULL and sets 'tablep' on success, or a
+ * malloc()'ed error message on failure. */
+static char * OVS_WARN_UNUSED_RESULT
+get_table(const char *table_name, const struct ovsdb_idl_table_class **tablep)
{
const struct ovsdb_idl_table_class *best_match = NULL;
unsigned int best_score = 0;
+ char *error = NULL;
for (const struct ovsdb_idl_table_class *table = idl_classes;
table < &idl_classes[n_classes]; table++) {
@@ -1111,13 +1114,13 @@ get_table(const char *table_name)
}
}
if (best_match) {
- return best_match;
+ *tablep = best_match;
} else if (best_score) {
- ctl_fatal("multiple table names match \"%s\"", table_name);
+ error = xasprintf("multiple table names match \"%s\"", table_name);
} else {
- ctl_fatal("unknown table \"%s\"", table_name);
+ error = xasprintf("unknown table \"%s\"", table_name);
}
- return NULL;
+ return error;
}
static void
@@ -1146,7 +1149,7 @@ cmd_find(struct ctl_context *ctx)
struct table *out;
size_t n_columns;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
die_if_error(parse_column_names(column_names, table, &columns, &n_columns));
out = ctx->table = list_make_table(columns, n_columns);
for (row = ovsdb_idl_first_row(ctx->idl, table); row;
@@ -1243,7 +1246,7 @@ cmd_set(struct ctl_context *ctx)
const struct ovsdb_idl_row *row;
int i;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
row = ctl_get_row(ctx, table, record_id, must_exist);
if (!row) {
return;
@@ -1282,7 +1285,7 @@ cmd_add(struct ctl_context *ctx)
struct ovsdb_datum old;
int i;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
die_if_error(get_column(table, column_name, &column));
row = ctl_get_row(ctx, table, record_id, must_exist);
if (!row) {
@@ -1343,7 +1346,7 @@ cmd_remove(struct ctl_context *ctx)
struct ovsdb_datum old;
int i;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
die_if_error(get_column(table, column_name, &column));
row = ctl_get_row(ctx, table, record_id, must_exist);
if (!row) {
@@ -1415,7 +1418,7 @@ cmd_clear(struct ctl_context *ctx)
const struct ovsdb_idl_row *row;
int i;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
row = ctl_get_row(ctx, table, record_id, must_exist);
if (!row) {
return;
@@ -1450,7 +1453,7 @@ pre_create(struct ctl_context *ctx)
const char *table_name = ctx->argv[1];
const struct ovsdb_idl_table_class *table;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
if (!id && !table->is_root) {
VLOG_WARN("applying \"create\" command to table %s without --id "
"option will have no effect", table->name);
@@ -1462,11 +1465,12 @@ cmd_create(struct ctl_context *ctx)
{
const char *id = shash_find_data(&ctx->options, "--id");
const char *table_name = ctx->argv[1];
- const struct ovsdb_idl_table_class *table = get_table(table_name);
+ const struct ovsdb_idl_table_class *table;
const struct ovsdb_idl_row *row;
const struct uuid *uuid;
int i;
+ die_if_error(get_table(table_name, &table));
if (id) {
struct ovsdb_symbol *symbol = create_symbol(ctx->symtab, id, NULL);
if (table->is_root) {
@@ -1530,7 +1534,7 @@ cmd_destroy(struct ctl_context *ctx)
const struct ovsdb_idl_table_class *table;
int i;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
if (delete_all && ctx->argc > 2) {
ctl_fatal("--all and records argument should not be specified together");
@@ -1586,7 +1590,7 @@ cmd_wait_until(struct ctl_context *ctx)
const struct ovsdb_idl_row *row;
int i;
- table = get_table(table_name);
+ die_if_error(get_table(table_name, &table));
row = ctl_get_row(ctx, table, record_id, false);
if (!row) {
@@ -2293,5 +2297,8 @@ void ctl_set_column(const char *table_name,
const struct ovsdb_idl_row *row, const char *arg,
struct ovsdb_symbol_table *symtab)
{
- set_column(get_table(table_name), row, arg, symtab);
+ const struct ovsdb_idl_table_class *table;
+
+ die_if_error(get_table(table_name, &table));
+ set_column(table, row, arg, symtab);
}