X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Fexecution.c;h=932bee2380bfe3b4853bb775bf583399f25186f3;hb=1264cb08bfcc5cd9372decb53d3e3a7d07cc3a2b;hp=6bad67c2b8b4767e28123a6bf7e5a78c79dffb5a;hpb=41709cccb8099972f9c6c3faf583b1286cb92e8a;p=openvswitch diff --git a/ovsdb/execution.c b/ovsdb/execution.c index 6bad67c2..932bee23 100644 --- a/ovsdb/execution.c +++ b/ovsdb/execution.c @@ -20,8 +20,8 @@ #include "column.h" #include "condition.h" +#include "file.h" #include "json.h" -#include "log.h" #include "ovsdb-data.h" #include "ovsdb-error.h" #include "ovsdb-parser.h" @@ -47,7 +47,6 @@ typedef struct ovsdb_error *ovsdb_operation_executor(struct ovsdb_execution *, struct ovsdb_parser *, struct json *result); -static struct ovsdb_error *do_commit(struct ovsdb_execution *); static ovsdb_operation_executor ovsdb_execute_insert; static ovsdb_operation_executor ovsdb_execute_select; static ovsdb_operation_executor ovsdb_execute_update; @@ -55,6 +54,7 @@ static ovsdb_operation_executor ovsdb_execute_delete; static ovsdb_operation_executor ovsdb_execute_wait; static ovsdb_operation_executor ovsdb_execute_commit; static ovsdb_operation_executor ovsdb_execute_abort; +static ovsdb_operation_executor ovsdb_execute_declare; static ovsdb_operation_executor * lookup_executor(const char *name) @@ -72,6 +72,7 @@ lookup_executor(const char *name) { "wait", ovsdb_execute_wait }, { "commit", ovsdb_execute_commit }, { "abort", ovsdb_execute_abort }, + { "declare", ovsdb_execute_declare }, }; size_t i; @@ -168,8 +169,7 @@ ovsdb_execute(struct ovsdb *db, const struct json *params, } if (!error) { - /* Commit transaction. Bail if commit encounters error. */ - error = do_commit(&x); + error = ovsdb_txn_commit(x.txn, x.durable); if (error) { json_array_add(results, ovsdb_error_to_json(error)); } @@ -208,38 +208,6 @@ ovsdb_execute_abort(struct ovsdb_execution *x UNUSED, return ovsdb_error("aborted", "aborted by request"); } -static struct ovsdb_error * -do_commit(struct ovsdb_execution *x) -{ - if (x->db->log) { - struct ovsdb_error *error; - struct json *json; - - json = ovsdb_txn_to_json(x->txn); - if (!json) { - /* Nothing to commit. */ - return NULL; - } - - error = ovsdb_log_write(x->db->log, json); - json_destroy(json); - if (error) { - return ovsdb_wrap_error(error, "writing transaction failed"); - } - - if (x->durable) { - error = ovsdb_log_commit(x->db->log); - if (error) { - return ovsdb_wrap_error(error, - "committing transaction failed"); - } - } - } - - ovsdb_txn_commit(x->txn); - return NULL; -} - static struct ovsdb_table * parse_table(struct ovsdb_execution *x, struct ovsdb_parser *parser, const char *member) @@ -300,19 +268,38 @@ 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); + + if (uuid_name) { + struct ovsdb_symbol *symbol; + + symbol = ovsdb_symbol_table_get(x->symtab, json_string(uuid_name)); + if (symbol) { + if (symbol->used) { + return ovsdb_syntax_error(uuid_name, "duplicate uuid-name", + "This \"uuid-name\" appeared on an " + "earlier \"insert\" operation."); + } + row_uuid = symbol->uuid; + symbol->used = true; + } else { + uuid_generate(&row_uuid); + ovsdb_symbol_table_put(x->symtab, json_string(uuid_name), + &row_uuid, true); + } + } else { + uuid_generate(&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], @@ -611,3 +598,29 @@ ovsdb_execute_wait(struct ovsdb_execution *x, struct ovsdb_parser *parser, return error; } + +static struct ovsdb_error * +ovsdb_execute_declare(struct ovsdb_execution *x, struct ovsdb_parser *parser, + struct json *result) +{ + const struct json *uuid_name; + struct uuid uuid; + + uuid_name = ovsdb_parser_member(parser, "uuid-name", OP_ID); + if (!uuid_name) { + return NULL; + } + + if (ovsdb_symbol_table_get(x->symtab, json_string(uuid_name))) { + return ovsdb_syntax_error(uuid_name, "duplicate uuid-name", + "This \"uuid-name\" appeared on an " + "earlier \"declare\" or \"insert\" " + "operation."); + } + + uuid_generate(&uuid); + ovsdb_symbol_table_put(x->symtab, json_string(uuid_name), &uuid, false); + json_object_put(result, "uuid", json_string_create_nocopy( + xasprintf(UUID_FMT, UUID_ARGS(&uuid)))); + return NULL; +}