2
0
mirror of https://github.com/openvswitch/ovs synced 2025-10-25 15:07:05 +00:00

ovsdb-idl: Fix row insertion and deletion behavior.

When the IDL was used to insert a row, but all of the new row's columns
were left at the default values, then the IDL would not insert the row at
all.

When the IDL was used to delete one or more rows, and the transaction did
not include any update or insertion operations, the transaction was dropped
entirely.

This commit fixes these two bugs.  It needs a regression test, but this
commit does not add one.
This commit is contained in:
Ben Pfaff
2009-12-11 10:46:59 -08:00
parent 524555d18b
commit f0f54cb4dd

View File

@@ -977,9 +977,6 @@ ovsdb_idl_txn_commit(struct ovsdb_idl_txn *txn)
any_updates = false;
HMAP_FOR_EACH (row, struct ovsdb_idl_row, txn_node, &txn->txn_rows) {
const struct ovsdb_idl_table_class *class = row->table->class;
size_t n_columns = class->n_columns;
struct json *row_json;
size_t idx;
if (row->old == row->new) {
continue;
@@ -989,39 +986,44 @@ ovsdb_idl_txn_commit(struct ovsdb_idl_txn *txn)
json_object_put_string(op, "table", class->name);
json_object_put(op, "where", where_uuid_equals(&row->uuid));
json_array_add(operations, op);
any_updates = true;
} else {
row_json = NULL;
BITMAP_FOR_EACH_1 (idx, n_columns, row->written) {
struct json *row_json;
struct json *op;
size_t idx;
op = json_object_create();
json_object_put_string(op, "op", row->old ? "update" : "insert");
json_object_put_string(op, "table", class->name);
if (row->old) {
json_object_put(op, "where", where_uuid_equals(&row->uuid));
} else {
json_object_put(op, "uuid-name",
json_string_create_nocopy(
uuid_name_from_uuid(&row->uuid)));
}
row_json = json_object_create();
json_object_put(op, "row", row_json);
BITMAP_FOR_EACH_1 (idx, class->n_columns, row->written) {
const struct ovsdb_idl_column *column = &class->columns[idx];
if (row->old
&& ovsdb_datum_equals(&row->old[idx], &row->new[idx],
&column->type)) {
continue;
if (!row->old || !ovsdb_datum_equals(&row->old[idx],
&row->new[idx],
&column->type)) {
json_object_put(row_json, column->name,
substitute_uuids(
ovsdb_datum_to_json(&row->new[idx],
&column->type),
txn));
}
if (!row_json) {
struct json *op = json_object_create();
json_array_add(operations, op);
json_object_put_string(op, "op",
row->old ? "update" : "insert");
json_object_put_string(op, "table", class->name);
if (row->old) {
json_object_put(op, "where",
where_uuid_equals(&row->uuid));
} else {
json_object_put(op, "uuid-name",
json_string_create_nocopy(
uuid_name_from_uuid(&row->uuid)));
}
row_json = json_object_create();
json_object_put(op, "row", row_json);
any_updates = true;
}
json_object_put(row_json, column->name,
substitute_uuids(
ovsdb_datum_to_json(&row->new[idx],
&column->type),
txn));
}
if (!row->old || !shash_is_empty(json_object(row_json))) {
json_array_add(operations, op);
any_updates = true;
} else {
json_destroy(op);
}
}
}