From 6e30ca6372f83f6b4ba9ee7bf7ac464c79708ce1 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 1 Dec 2009 16:35:33 -0800 Subject: [PATCH] ovsdb: Allow a named-uuid to be used within the operation that creates it. This allows a transaction like this: [{"op": "insert", "table": "mytable", "row": {"i": 0, "k": ["named-uuid", "self"]}, "uuid-name": "self"}] It was already possible to do this by following up on the "insert" with an "update", but since this was easy to implement I did it. --- ovsdb/SPECS | 13 ++++++++----- ovsdb/execution.c | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/ovsdb/SPECS b/ovsdb/SPECS index a4e9ab483..3acf32d27 100644 --- a/ovsdb/SPECS +++ b/ovsdb/SPECS @@ -497,13 +497,16 @@ Notation for the Wire Protocol A 2-element JSON array that represents the UUID of a row inserted in a previous "insert" operation within the same transaction. The first element of the array must be the string "named-uuid" and the - second element must be the string specified on a previous "insert" - operation's "uuid-name". For example, if a previous "insert" + second element must be the string specified on this "insert" + operation's "uuid-name" or on a preceding "insert" within the same + transaction. For example, if this or a previous "insert" operation specified a "uuid-name" of "myrow", the following represents the UUID created by that operation: ["named-uuid", "myrow"] + A may be used anywhere a is valid. + A 3-element JSON array of the form [, , @@ -595,9 +598,9 @@ Semantics: values. The new row receives a new, randomly generated UUID, which is - returned as the "uuid" member of the result. If "uuid-name" - is supplied, then the UUID is made available under that name - to later operations within the same transaction. + returned as the "uuid" member of the result. If "uuid-name" is + supplied, then the UUID is made available under that name to this + operation and later operations within the same transaction. select ...... diff --git a/ovsdb/execution.c b/ovsdb/execution.c index 9edc1a971..0bfe86fb3 100644 --- a/ovsdb/execution.c +++ b/ovsdb/execution.c @@ -266,19 +266,22 @@ ovsdb_execute_insert(struct ovsdb_execution *x, struct ovsdb_parser *parser, struct ovsdb_row *row = NULL; const struct json *uuid_name; struct ovsdb_error *error; + struct uuid row_uuid; table = parse_table(x, parser, "table"); uuid_name = ovsdb_parser_member(parser, "uuid-name", OP_ID | OP_OPTIONAL); error = ovsdb_parser_get_error(parser); + + uuid_generate(&row_uuid); + if (uuid_name) { + ovsdb_symbol_table_put(x->symtab, json_string(uuid_name), &row_uuid); + } + if (!error) { error = parse_row(parser, "row", table, x->symtab, &row, NULL); } if (!error) { - uuid_generate(ovsdb_row_get_uuid_rw(row)); - if (uuid_name) { - ovsdb_symbol_table_put(x->symtab, json_string(uuid_name), - ovsdb_row_get_uuid(row)); - } + *ovsdb_row_get_uuid_rw(row) = row_uuid; ovsdb_txn_row_insert(x->txn, row); json_object_put(result, "uuid", ovsdb_datum_to_json(&row->fields[OVSDB_COL_UUID], -- 2.43.0