I'm not sure why you went with a different approach on this compared to the other functions. I would have expected you would change get_row_by_id() to return a string (NULL if no error, otherwise an error string). Then return the row as an output parameter.

On 07/02/2018 06:50 AM, Jakub Sitnicki wrote:
Signal that multiple rows match the record identifier via a new output
parameter instead of reporting the problem and dying, so that the caller
can handle the error without terminating the process if needed.

Signed-off-by: Jakub Sitnicki <[email protected]>
---
  lib/db-ctl-base.c | 23 ++++++++++++++++++-----
  1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/lib/db-ctl-base.c b/lib/db-ctl-base.c
index e8f66811a..34daaef68 100644
--- a/lib/db-ctl-base.c
+++ b/lib/db-ctl-base.c
@@ -277,8 +277,11 @@ record_id_equals(const union ovsdb_atom *name, enum 
ovsdb_atomic_type type,
  static const struct ovsdb_idl_row *
  get_row_by_id(struct ctl_context *ctx,
                const struct ovsdb_idl_table_class *table,
-              const struct ctl_row_id *id, const char *record_id)
+              const struct ctl_row_id *id, const char *record_id,
+              bool *multiple_matches)
  {
+    ovs_assert(multiple_matches);
+    *multiple_matches = false;
if (!id->name_column) {
          return NULL;
@@ -336,8 +339,8 @@ get_row_by_id(struct ctl_context *ctx,
          /* If the name equals 'record_id', take it. */
          if (record_id_equals(name, name_type, record_id)) {
              if (referrer) {
-                ctl_fatal("multiple rows in %s match \"%s\"",
-                          id_table->name, record_id);
+                *multiple_matches = true;
+                return NULL;
              }
              referrer = row;
          }
@@ -386,8 +389,18 @@ ctl_get_row(struct ctl_context *ctx,
          const struct ctl_table_class *ctl_class
              = &ctl_classes[table - idl_classes];
          for (int i = 0; i < ARRAY_SIZE(ctl_class->row_ids); i++) {
-            row = get_row_by_id(ctx, table, &ctl_class->row_ids[i],
-                                record_id);
+            const struct ctl_row_id *id = &ctl_class->row_ids[i];
+            bool multiple_matches;
+
+            row = get_row_by_id(ctx, table, id, record_id, &multiple_matches);
+            if (multiple_matches) {
+                const struct ovsdb_idl_class *class =
+                    ovsdb_idl_get_class(ctx->idl);
+                const struct ovsdb_idl_table_class *table_class =
+                    ovsdb_idl_table_class_from_column(class, id->name_column);
+                ctl_fatal("multiple rows in %s match \"%s\"",
+                          table_class->name, record_id);
+            }
              if (row) {
                  break;
              }


_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to