#include <stdlib.h>
#include "bitmap.h"
+#include "dynamic-string.h"
#include "json.h"
#include "jsonrpc.h"
#include "ovsdb-data.h"
struct ovsdb_idl *idl;
struct hmap txn_rows;
enum ovsdb_idl_txn_status status;
+ bool dry_run;
+ struct ds comment;
};
static struct vlog_rate_limit syntax_rl = VLOG_RATE_LIMIT_INIT(1, 5);
txn->idl = idl;
txn->status = TXN_INCOMPLETE;
hmap_init(&txn->txn_rows);
+ txn->dry_run = false;
+ ds_init(&txn->comment);
return txn;
}
+void
+ovsdb_idl_txn_add_comment(struct ovsdb_idl_txn *txn, const char *s)
+{
+ if (txn->comment.length) {
+ ds_put_char(&txn->comment, '\n');
+ }
+ ds_put_cstr(&txn->comment, s);
+}
+
+void
+ovsdb_idl_txn_set_dry_run(struct ovsdb_idl_txn *txn)
+{
+ txn->dry_run = true;
+}
+
void
ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn)
{
+ if (txn->status == TXN_INCOMPLETE) {
+ hmap_remove(&txn->idl->outstanding_txns, &txn->hmap_node);
+ }
ovsdb_idl_txn_abort(txn);
+ ds_destroy(&txn->comment);
free(txn);
}
}
}
+ if (txn->comment.length) {
+ struct json *op = json_object_create();
+ json_object_put_string(op, "op", "comment");
+ json_object_put_string(op, "comment", ds_cstr(&txn->comment));
+ json_array_add(operations, op);
+ }
+
+ if (txn->dry_run) {
+ struct json *op = json_object_create();
+ json_object_put_string(op, "op", "abort");
+ json_array_add(operations, op);
+ }
+
if (!any_updates) {
txn->status = TXN_SUCCESS;
} else if (!jsonrpc_session_send(
hmap_insert(&row->table->idl->txn->txn_rows, &row->txn_node,
uuid_hash(&row->uuid));
}
- if (row->new == row->old) {
- row->new = NULL;
- } else {
- ovsdb_idl_row_clear_new(row);
- }
+ ovsdb_idl_row_clear_new(row);
+ row->new = NULL;
}
struct ovsdb_idl_row *
if (error->type == JSON_STRING) {
if (!strcmp(error->u.string, "timed out")) {
soft_errors++;
- } else {
+ } else if (strcmp(error->u.string, "aborted")) {
hard_errors++;
}
} else {