}
static int
-compare_selflink(const void *a_, const void *b_)
+compare_link1(const void *a_, const void *b_)
{
- const struct idltest_selflink *const *ap = a_;
- const struct idltest_selflink *const *bp = b_;
- const struct idltest_selflink *a = *ap;
- const struct idltest_selflink *b = *bp;
-
+ const struct idltest_link1 *const *ap = a_;
+ const struct idltest_link1 *const *bp = b_;
+ const struct idltest_link1 *a = *ap;
+ const struct idltest_link1 *b = *bp;
return a->i < b->i ? -1 : a->i > b->i;
}
print_idl(struct ovsdb_idl *idl, int step)
{
const struct idltest_simple *s;
- const struct idltest_selflink *sl;
+ const struct idltest_link1 *l1;
+ const struct idltest_link2 *l2;
int n = 0;
IDLTEST_SIMPLE_FOR_EACH (s, idl) {
printf("] uuid="UUID_FMT"\n", UUID_ARGS(&s->header_.uuid));
n++;
}
- IDLTEST_SELFLINK_FOR_EACH (sl, idl) {
- struct idltest_selflink **links;
+ IDLTEST_LINK1_FOR_EACH (l1, idl) {
+ struct idltest_link1 **links;
size_t i;
- printf("%03d: i=%"PRId64" k=", step, sl->i);
- if (sl->k) {
- printf("%"PRId64, sl->k->i);
+ printf("%03d: i=%"PRId64" k=", step, l1->i);
+ if (l1->k) {
+ printf("%"PRId64, l1->k->i);
}
printf(" ka=[");
- links = xmemdup(sl->ka, sl->n_ka * sizeof *sl->ka);
- qsort(links, sl->n_ka, sizeof *links, compare_selflink);
- for (i = 0; i < sl->n_ka; i++) {
+ links = xmemdup(l1->ka, l1->n_ka * sizeof *l1->ka);
+ qsort(links, l1->n_ka, sizeof *links, compare_link1);
+ for (i = 0; i < l1->n_ka; i++) {
printf("%s%"PRId64, i ? " " : "", links[i]->i);
}
free(links);
- printf("] uuid="UUID_FMT"\n", UUID_ARGS(&sl->header_.uuid));
+ printf("] l2=");
+ if (l1->l2) {
+ printf("%"PRId64, l1->l2->i);
+ }
+ printf(" uuid="UUID_FMT"\n", UUID_ARGS(&l1->header_.uuid));
+ n++;
+ }
+ IDLTEST_LINK2_FOR_EACH (l2, idl) {
+ printf("%03d: i=%"PRId64" l1=", step, l2->i);
+ if (l2->l1) {
+ printf("%"PRId64, l2->l1->i);
+ }
+ printf(" uuid="UUID_FMT"\n", UUID_ARGS(&l2->header_.uuid));
n++;
}
if (!n) {
if (json->type == JSON_STRING && uuid_from_string(&uuid, json->u.string)) {
char *name = xasprintf("#%d#", *n);
- ovsdb_symbol_table_put(symtab, name, &uuid);
+ fprintf(stderr, "%s = "UUID_FMT"\n", name, UUID_ARGS(&uuid));
+ ovsdb_symbol_table_put(symtab, name, &uuid, false);
free(name);
*n += 1;
} else if (json->type == JSON_ARRAY) {
substitute_uuids(struct json *json, const struct ovsdb_symbol_table *symtab)
{
if (json->type == JSON_STRING) {
- const struct uuid *uuid;
+ const struct ovsdb_symbol *symbol;
- uuid = ovsdb_symbol_table_get(symtab, json->u.string);
- if (uuid) {
+ symbol = ovsdb_symbol_table_get(symtab, json->u.string);
+ if (symbol) {
free(json->u.string);
- json->u.string = xasprintf(UUID_FMT, UUID_ARGS(uuid));
+ json->u.string = xasprintf(UUID_FMT, UUID_ARGS(&symbol->uuid));
}
} else if (json->type == JSON_ARRAY) {
size_t i;
}
}
+static const struct idltest_simple *
+idltest_find_simple(struct ovsdb_idl *idl, int i)
+{
+ const struct idltest_simple *s;
+
+ IDLTEST_SIMPLE_FOR_EACH (s, idl) {
+ if (s->i == i) {
+ return s;
+ }
+ }
+ return NULL;
+}
+
+static void
+idl_set(struct ovsdb_idl *idl, char *commands, int step)
+{
+ char *cmd, *save_ptr1 = NULL;
+ struct ovsdb_idl_txn *txn;
+ enum ovsdb_idl_txn_status status;
+
+ txn = ovsdb_idl_txn_create(idl);
+ for (cmd = strtok_r(commands, ",", &save_ptr1); cmd;
+ cmd = strtok_r(NULL, ",", &save_ptr1)) {
+ char *save_ptr2 = NULL;
+ char *name, *arg1, *arg2, *arg3;
+
+ name = strtok_r(cmd, " ", &save_ptr2);
+ arg1 = strtok_r(NULL, " ", &save_ptr2);
+ arg2 = strtok_r(NULL, " ", &save_ptr2);
+ arg3 = strtok_r(NULL, " ", &save_ptr2);
+
+ if (!strcmp(name, "set")) {
+ const struct idltest_simple *s;
+
+ if (!arg3) {
+ ovs_fatal(0, "\"set\" command requires 3 arguments");
+ }
+
+ s = idltest_find_simple(idl, atoi(arg1));
+ if (!s) {
+ ovs_fatal(0, "\"set\" command asks for nonexistent "
+ "i=%d", atoi(arg1));
+ }
+
+ if (!strcmp(arg2, "b")) {
+ idltest_simple_set_b(s, atoi(arg3));
+ } else if (!strcmp(arg2, "s")) {
+ idltest_simple_set_s(s, arg3);
+ } else if (!strcmp(arg2, "u")) {
+ struct uuid uuid;
+ uuid_from_string(&uuid, arg3);
+ idltest_simple_set_u(s, uuid);
+ } else if (!strcmp(arg2, "r")) {
+ idltest_simple_set_r(s, atof(arg3));
+ } else {
+ ovs_fatal(0, "\"set\" command asks for unknown column %s",
+ arg2);
+ }
+ } else if (!strcmp(name, "insert")) {
+ struct idltest_simple *s;
+
+ if (!arg1 || arg2) {
+ ovs_fatal(0, "\"set\" command requires 1 argument");
+ }
+
+ s = idltest_simple_insert(txn);
+ idltest_simple_set_i(s, atoi(arg1));
+ } else if (!strcmp(name, "delete")) {
+ const struct idltest_simple *s;
+
+ if (!arg1 || arg2) {
+ ovs_fatal(0, "\"set\" command requires 1 argument");
+ }
+
+ s = idltest_find_simple(idl, atoi(arg1));
+ if (!s) {
+ ovs_fatal(0, "\"set\" command asks for nonexistent "
+ "i=%d", atoi(arg1));
+ }
+ idltest_simple_delete(s);
+ } else {
+ ovs_fatal(0, "unknown command %s", name);
+ }
+ }
+
+ while ((status = ovsdb_idl_txn_commit(txn)) == TXN_INCOMPLETE) {
+ ovsdb_idl_run(idl);
+ ovsdb_idl_wait(idl);
+ ovsdb_idl_txn_wait(txn);
+ poll_block();
+ }
+ printf("%03d: commit, status=%s\n",
+ step, ovsdb_idl_txn_status_to_string(status));
+ ovsdb_idl_txn_destroy(txn);
+}
+
static void
do_idl(int argc, char *argv[])
{
if (!strcmp(argv[i], "reconnect")) {
printf("%03d: reconnect\n", step++);
ovsdb_idl_force_reconnect(idl);
+ } else if (argv[i][0] != '[') {
+ idl_set(idl, argv[i], step++);
} else {
struct json *json = parse_json(argv[i]);
substitute_uuids(json, symtab);