" query-distinct TABLE [ROW,...] [CONDITION,...] COLUMNS\n"
" add each ROW to TABLE, then query and print the rows that\n"
" satisfy each CONDITION and have distinct COLUMNS.\n"
+ " parse-schema JSON\n"
+ " parse JSON as an OVSDB schema, and re-serialize\n"
" transact COMMAND\n"
" execute each specified transactional COMMAND:\n"
" commit\n"
do_log_io(int argc, char *argv[])
{
const char *name = argv[1];
- char *mode = argv[2];
+ char *mode_string = argv[2];
struct ovsdb_error *error;
+ enum ovsdb_log_open_mode mode;
struct ovsdb_log *log;
- char *save_ptr = NULL;
- const char *token;
- int flags;
int i;
- for (flags = 0, token = strtok_r(mode, " |", &save_ptr); token != NULL;
- token = strtok_r(NULL, " |", &save_ptr))
- {
- if (!strcmp(token, "O_RDONLY")) {
- flags |= O_RDONLY;
- } else if (!strcmp(token, "O_RDWR")) {
- flags |= O_RDWR;
- } else if (!strcmp(token, "O_TRUNC")) {
- flags |= O_TRUNC;
- } else if (!strcmp(token, "O_CREAT")) {
- flags |= O_CREAT;
- } else if (!strcmp(token, "O_EXCL")) {
- flags |= O_EXCL;
- } else if (!strcmp(token, "O_TRUNC")) {
- flags |= O_TRUNC;
- }
+ if (!strcmp(mode_string, "read-only")) {
+ mode = OVSDB_LOG_READ_ONLY;
+ } else if (!strcmp(mode_string, "read/write")) {
+ mode = OVSDB_LOG_READ_WRITE;
+ } else if (!strcmp(mode_string, "create")) {
+ mode = OVSDB_LOG_CREATE;
+ } else {
+ ovs_fatal(0, "unknown log-io open mode \"%s\"", mode_string);
}
- check_ovsdb_error(ovsdb_log_open(name, flags, &log));
+ check_ovsdb_error(ovsdb_log_open(name, mode, -1, &log));
printf("%s: open successful\n", name);
for (i = 3; i < argc; i++) {
}
static void
-do_parse_atomic_type(int argc UNUSED, char *argv[])
+do_parse_atomic_type(int argc OVS_UNUSED, char *argv[])
{
enum ovsdb_atomic_type type;
struct json *json;
}
static void
-do_parse_base_type(int argc UNUSED, char *argv[])
+do_parse_base_type(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_base_type base;
struct json *json;
}
static void
-do_parse_type(int argc UNUSED, char *argv[])
+do_parse_type(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_type type;
struct json *json;
}
static void
-do_sort_atoms(int argc UNUSED, char *argv[])
+do_sort_atoms(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_base_type base;
union ovsdb_atom *atoms;
}
static void
-do_parse_column(int argc UNUSED, char *argv[])
+do_parse_column(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_column *column;
struct json *json;
}
static void
-do_parse_table(int argc UNUSED, char *argv[])
+do_parse_table(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_table_schema *ts;
struct json *json;
}
static void
-do_evaluate_conditions(int argc UNUSED, char *argv[])
+do_evaluate_conditions(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_table_schema *ts;
struct ovsdb_table *table;
}
static void
-do_execute_mutations(int argc UNUSED, char *argv[])
+do_execute_mutations(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_table_schema *ts;
struct ovsdb_table *table;
}
static void
-do_query(int argc UNUSED, char *argv[])
+do_query(int argc OVS_UNUSED, char *argv[])
{
struct do_query_cbdata cbdata;
struct ovsdb_table_schema *ts;
};
static void
-do_query_distinct(int argc UNUSED, char *argv[])
+do_query_distinct(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_column_set columns;
struct ovsdb_table_schema *ts;
}
static void
-do_execute(int argc UNUSED, char *argv[])
+do_parse_schema(int argc OVS_UNUSED, char *argv[])
+{
+ struct ovsdb_schema *schema;
+ struct json *json;
+
+ json = parse_json(argv[1]);
+ check_ovsdb_error(ovsdb_schema_from_json(json, &schema));
+ json_destroy(json);
+ print_and_free_json(ovsdb_schema_to_json(schema));
+ ovsdb_schema_destroy(schema);
+}
+
+static void
+do_execute(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_schema *schema;
struct json *json;
}
static void
-do_trigger(int argc UNUSED, char *argv[])
+do_trigger(int argc OVS_UNUSED, char *argv[])
{
struct ovsdb_schema *schema;
struct list completions;
}
static void
-do_help(int argc UNUSED, char *argv[] UNUSED)
+do_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
usage();
}
static struct ovsdb_table *do_transact_table;
static void
-do_transact_commit(int argc UNUSED, char *argv[] UNUSED)
+do_transact_commit(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
ovsdb_txn_commit(do_transact_txn, false);
do_transact_txn = NULL;
}
static void
-do_transact_abort(int argc UNUSED, char *argv[] UNUSED)
+do_transact_abort(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
ovsdb_txn_abort(do_transact_txn);
do_transact_txn = NULL;
}
static void
-do_transact_insert(int argc UNUSED, char *argv[] UNUSED)
+do_transact_insert(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
struct ovsdb_row *row;
struct uuid *uuid;
}
static void
-do_transact_delete(int argc UNUSED, char *argv[] UNUSED)
+do_transact_delete(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
const struct ovsdb_row *row = do_transact_find_row(argv[1]);
ovsdb_txn_row_delete(do_transact_txn, row);
}
static void
-do_transact_modify(int argc UNUSED, char *argv[] UNUSED)
+do_transact_modify(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
const struct ovsdb_row *row_ro;
struct ovsdb_row *row_rw;
}
static void
-do_transact_print(int argc UNUSED, char *argv[] UNUSED)
+do_transact_print(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
{
const struct ovsdb_row **rows;
const struct ovsdb_row *row;
}
}
- while ((status = ovsdb_idl_txn_commit(txn)) == TXN_INCOMPLETE) {
- ovsdb_idl_run(idl);
- ovsdb_idl_wait(idl);
- ovsdb_idl_txn_wait(txn);
- poll_block();
- }
+ status = ovsdb_idl_txn_commit_block(txn);
printf("%03d: commit, status=%s",
step, ovsdb_idl_txn_status_to_string(status));
if (increment) {
if (argc > 2) {
struct stream *stream;
- error = stream_open_block(argv[1], &stream);
+ error = stream_open_block(jsonrpc_stream_open(argv[1], &stream),
+ &stream);
if (error) {
ovs_fatal(error, "failed to connect to \"%s\"", argv[1]);
}
rpc = NULL;
}
+ setvbuf(stdout, NULL, _IOLBF, 0);
+
symtab = ovsdb_symbol_table_create();
for (i = 2; i < argc; i++) {
+ char *arg = argv[i];
struct jsonrpc_msg *request, *reply;
int error;
- seqno = print_updated_idl(idl, rpc, step++, seqno);
+ if (*arg == '+') {
+ /* The previous transaction didn't change anything. */
+ arg++;
+ } else {
+ seqno = print_updated_idl(idl, rpc, step++, seqno);
+ }
- if (!strcmp(argv[i], "reconnect")) {
+ if (!strcmp(arg, "reconnect")) {
printf("%03d: reconnect\n", step++);
ovsdb_idl_force_reconnect(idl);
- } else if (argv[i][0] != '[') {
- idl_set(idl, argv[i], step++);
+ } else if (arg[0] != '[') {
+ idl_set(idl, arg, step++);
} else {
- struct json *json = parse_json(argv[i]);
+ struct json *json = parse_json(arg);
substitute_uuids(json, symtab);
request = jsonrpc_create_request("transact", json, NULL);
error = jsonrpc_transact_block(rpc, request, &reply);
{ "query", 3, 3, do_query },
{ "query-distinct", 4, 4, do_query_distinct },
{ "transact", 1, INT_MAX, do_transact },
+ { "parse-schema", 1, 1, do_parse_schema },
{ "execute", 2, INT_MAX, do_execute },
{ "trigger", 2, INT_MAX, do_trigger },
{ "idl", 1, INT_MAX, do_idl },