diff options
author | Ben Pfaff <blp@nicira.com> | 2009-12-01 16:35:33 -0800 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2009-12-02 11:18:59 -0800 |
commit | 6e30ca6372f83f6b4ba9ee7bf7ac464c79708ce1 (patch) | |
tree | 12f1866d99d808028b2f343f8474614a3bfb2f4e | |
parent | b36682d8dcf5290fc70d99c5bc1aa1e0be6d878e (diff) | |
download | openvswitch-6e30ca6372f83f6b4ba9ee7bf7ac464c79708ce1.tar.gz |
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.
-rw-r--r-- | ovsdb/SPECS | 13 | ||||
-rw-r--r-- | 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 <named-uuid> represents the UUID created by that operation: ["named-uuid", "myrow"] + A <named-uuid> may be used anywhere a <uuid> is valid. + <condition> A 3-element JSON array of the form [<column>, <function>, @@ -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], |