From 4ba9c6bf4775d49732990f649e027733c832bb6a Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Fri, 10 Jun 2016 15:19:03 -0700 Subject: ovs-vsctl: Support identifying Flow_Sample_Collector_Set records by id. This allows commands like ovs-vsctl list Flow_Sample_Collector_Set 123 if there's a record with id 123. It's not perfect, since there can be more than one record with the same id, but it's helpful. Signed-off-by: Ben Pfaff Acked-by: Andy Zhou --- lib/db-ctl-base.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c index ffef0414a..9f50c6c45 100644 --- a/lib/db-ctl-base.c +++ b/lib/db-ctl-base.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Nicira, Inc. + * Copyright (c) 2015, 2016 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -254,18 +254,30 @@ get_row_by_id(struct ctl_context *ctx, const struct ctl_table_class *table, return NULL; } } else { - const struct ovsdb_idl_row *row; - referrer = NULL; - for (row = ovsdb_idl_first_row(ctx->idl, id->table); - row != NULL; - row = ovsdb_idl_next_row(row)) - { - const struct ovsdb_datum *name; - name = ovsdb_idl_get(row, id->name_column, - OVSDB_TYPE_STRING, OVSDB_TYPE_VOID); - if (name->n == 1 && !strcmp(name->keys[0].string, record_id)) { + ovs_assert(id->name_column->type.value.type == OVSDB_TYPE_VOID); + + enum ovsdb_atomic_type key = id->name_column->type.key.type; + if (key == OVSDB_TYPE_INTEGER) { + if (!record_id[0] || record_id[strspn(record_id, "0123456789")]) { + return NULL; + } + } else { + ovs_assert(key == OVSDB_TYPE_STRING); + } + + for (const struct ovsdb_idl_row *row = ovsdb_idl_first_row(ctx->idl, + id->table); + row != NULL; + row = ovsdb_idl_next_row(row)) { + const struct ovsdb_datum *name = ovsdb_idl_get( + row, id->name_column, key, OVSDB_TYPE_VOID); + if (name->n == 1) { + const union ovsdb_atom *atom = &name->keys[0]; + if (key == OVSDB_TYPE_STRING + ? !strcmp(atom->string, record_id) + : atom->integer == strtoll(record_id, NULL, 10)) { if (referrer) { ctl_fatal("multiple rows in %s match \"%s\"", table->class->name, record_id); @@ -273,6 +285,7 @@ get_row_by_id(struct ctl_context *ctx, const struct ctl_table_class *table, referrer = row; } } + } } if (!referrer) { return NULL; -- cgit v1.2.1