ovs-vsctl: Support references among records at creation time.
[openvswitch] / lib / ovsdb-idl.c
index 42c53b831c60e9044731af6dd4cdedb69ba46b38..ca77cc2eb1805abd83d6b688bc02bd13e4b4e0c9 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "bitmap.h"
 #include "dynamic-string.h"
+#include "fatal-signal.h"
 #include "json.h"
 #include "jsonrpc.h"
 #include "ovsdb-data.h"
@@ -1281,6 +1282,7 @@ ovsdb_idl_txn_commit_block(struct ovsdb_idl_txn *txn)
 {
     enum ovsdb_idl_txn_status status;
 
+    fatal_signal_run();
     while ((status = ovsdb_idl_txn_commit(txn)) == TXN_INCOMPLETE) {
         ovsdb_idl_run(txn->idl);
         ovsdb_idl_wait(txn->idl);
@@ -1458,10 +1460,18 @@ ovsdb_idl_txn_delete(const struct ovsdb_idl_row *row_)
 
 const struct ovsdb_idl_row *
 ovsdb_idl_txn_insert(struct ovsdb_idl_txn *txn,
-                     const struct ovsdb_idl_table_class *class)
+                     const struct ovsdb_idl_table_class *class,
+                     const struct uuid *uuid)
 {
     struct ovsdb_idl_row *row = ovsdb_idl_row_create__(class);
-    uuid_generate(&row->uuid);
+
+    if (uuid) {
+        assert(!ovsdb_idl_txn_get_row(txn, uuid));
+        row->uuid = *uuid;
+    } else {
+        uuid_generate(&row->uuid);
+    }
+
     row->table = ovsdb_idl_table_from_class(txn->idl, class);
     row->new = xmalloc(class->n_columns * sizeof *row->new);
     row->written = bitmap_allocate(class->n_columns);
@@ -1520,7 +1530,7 @@ ovsdb_idl_txn_process_inc_reply(struct ovsdb_idl_txn *txn,
 
     if (txn->inc_index + 2 > results->n) {
         VLOG_WARN_RL(&syntax_rl, "reply does not contain enough operations "
-                     "for increment (has %u, needs %u)",
+                     "for increment (has %zu, needs %u)",
                      results->n, txn->inc_index + 2);
         return false;
     }
@@ -1534,7 +1544,7 @@ ovsdb_idl_txn_process_inc_reply(struct ovsdb_idl_txn *txn,
     }
     if (count->u.integer != 1) {
         VLOG_WARN_RL(&syntax_rl,
-                     "\"mutate\" reply \"count\" is %"PRId64" instead of 1",
+                     "\"mutate\" reply \"count\" is %lld instead of 1",
                      count->u.integer);
         return false;
     }
@@ -1545,7 +1555,7 @@ ovsdb_idl_txn_process_inc_reply(struct ovsdb_idl_txn *txn,
         return false;
     }
     if (rows->u.array.n != 1) {
-        VLOG_WARN_RL(&syntax_rl, "\"select\" reply \"rows\" has %u elements "
+        VLOG_WARN_RL(&syntax_rl, "\"select\" reply \"rows\" has %zu elements "
                      "instead of 1",
                      rows->u.array.n);
         return false;
@@ -1575,7 +1585,7 @@ ovsdb_idl_txn_process_insert_reply(struct ovsdb_idl_txn_insert *insert,
 
     if (insert->op_index >= results->n) {
         VLOG_WARN_RL(&syntax_rl, "reply does not contain enough operations "
-                     "for insert (has %u, needs %u)",
+                     "for insert (has %zu, needs %u)",
                      results->n, insert->op_index);
         return false;
     }