diff options
author | Ben Pfaff <blp@ovn.org> | 2016-06-10 15:19:03 -0700 |
---|---|---|
committer | Ben Pfaff <blp@ovn.org> | 2016-06-13 14:47:25 -0700 |
commit | 4ba9c6bf4775d49732990f649e027733c832bb6a (patch) | |
tree | 0caf16129c018230c211a5e3ddbc752fa141f4b3 /lib | |
parent | 77ee67e42dd730be7a1e3502d4f54a3f1ad17e73 (diff) | |
download | openvswitch-4ba9c6bf4775d49732990f649e027733c832bb6a.tar.gz |
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 <blp@ovn.org>
Acked-by: Andy Zhou <azhou@ovn.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/db-ctl-base.c | 35 |
1 files changed, 24 insertions, 11 deletions
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; |