+const char *
+ovsdb_idl_txn_get_error(const struct ovsdb_idl_txn *txn)
+{
+ if (txn->status != TXN_ERROR) {
+ return ovsdb_idl_txn_status_to_string(txn->status);
+ } else if (txn->error) {
+ return txn->error;
+ } else {
+ return "no error details available";
+ }
+}
+
+static void
+ovsdb_idl_txn_set_error_json(struct ovsdb_idl_txn *txn,
+ const struct json *json)
+{
+ if (txn->error == NULL) {
+ txn->error = json_to_string(json, JSSF_SORT);
+ }
+}
+
+/* For transaction 'txn' that completed successfully, finds and returns the
+ * permanent UUID that the database assigned to a newly inserted row, given the
+ * 'uuid' that ovsdb_idl_txn_insert() assigned locally to that row.
+ *
+ * Returns NULL if 'uuid' is not a UUID assigned by ovsdb_idl_txn_insert() or
+ * if it was assigned by that function and then deleted by
+ * ovsdb_idl_txn_delete() within the same transaction. (Rows that are inserted
+ * and then deleted within a single transaction are never sent to the database
+ * server, so it never assigns them a permanent UUID.) */
+const struct uuid *
+ovsdb_idl_txn_get_insert_uuid(const struct ovsdb_idl_txn *txn,
+ const struct uuid *uuid)
+{
+ const struct ovsdb_idl_txn_insert *insert;
+
+ assert(txn->status == TXN_SUCCESS || txn->status == TXN_UNCHANGED);
+ HMAP_FOR_EACH_IN_BUCKET (insert, struct ovsdb_idl_txn_insert, hmap_node,
+ uuid_hash(uuid), &txn->inserted_rows) {
+ if (uuid_equals(uuid, &insert->dummy)) {
+ return &insert->real;
+ }
+ }
+ return NULL;
+}
+