Heh, that's a funny typo. I fixed that, thank you for the review.
On Mon, Jul 25, 2011 at 03:11:36PM -0700, Ethan Jackson wrote: > s/max_rags/max_args/ > > Otherwise looks good, > Ethan > > On Thu, Jul 14, 2011 at 14:27, Ben Pfaff <[email protected]> wrote: > > In practice these arguments are almost always the defaults, so this change > > makes ovsdb-client much more usable interactively. > > --- > > ?ovsdb/ovsdb-client.1.in | ? 41 ++++---- > > ?ovsdb/ovsdb-client.c ? ?| ?245 > > ++++++++++++++++++++++++++++++++-------------- > > ?tests/ovsdb-server.at ? | ? ?6 +- > > ?3 files changed, 195 insertions(+), 97 deletions(-) > > > > diff --git a/ovsdb/ovsdb-client.1.in b/ovsdb/ovsdb-client.1.in > > index 7d8d0b0..ede3e4a 100644 > > --- a/ovsdb/ovsdb-client.1.in > > +++ b/ovsdb/ovsdb-client.1.in > > @@ -15,21 +15,21 @@ > > ?ovsdb\-client \- command-line interface to \fBovsdb-server\fR(1) > > ?. > > ?.SH SYNOPSIS > > -\fBovsdb\-client \fR[\fIoptions\fR] \fBlist\-dbs\fI server\fR > > +\fBovsdb\-client \fR[\fIoptions\fR] \fBlist\-dbs \fR[\fIserver\fR] > > ?.br > > -\fBovsdb\-client \fR[\fIoptions\fR] \fBget\-schema\fI server database\fR > > +\fBovsdb\-client \fR[\fIoptions\fR] \fBget\-schema \fR[\fIserver\fR] > > \fR[\fIdatabase\fR] > > ?.br > > -\fBovsdb\-client \fR[\fIoptions\fR] \fBget\-schema\-version\fI server > > database\fR > > +\fBovsdb\-client \fR[\fIoptions\fR] \fBget\-schema\-version\fI > > \fR[\fIserver\fR] \fR[\fIdatabase\fR] > > ?.br > > -\fBovsdb\-client \fR[\fIoptions\fR] \fBlist\-tables\fI server database\fR > > +\fBovsdb\-client \fR[\fIoptions\fR] \fBlist\-tables\fI \fR[\fIserver\fR] > > \fR[\fIdatabase\fR] > > ?.br > > -\fBovsdb\-client \fR[\fIoptions\fR] \fBlist\-columns\fI server database > > \fR[\fItable\fR] > > +\fBovsdb\-client \fR[\fIoptions\fR] \fBlist\-columns\fI \fR[\fIserver\fR] > > \fR[\fIdatabase\fR] [\fItable\fR] > > ?.br > > -\fBovsdb\-client \fR[\fIoptions\fR] \fBtransact\fI server transaction\fR > > +\fBovsdb\-client \fR[\fIoptions\fR] \fBtransact\fI \fR[\fIserver\fR] > > \fItransaction\fR > > ?.br > > -\fBovsdb\-client \fR[\fIoptions\fR] \fBdump\fI server database\fR > > +\fBovsdb\-client \fR[\fIoptions\fR] \fBdump\fI \fR[\fIserver\fR] > > \fR[\fIdatabase\fR]\fR > > ?.br > > -\fBovsdb\-client \fR[\fIoptions\fR] \fBmonitor\fI server database table\fR > > +\fBovsdb\-client \fR[\fIoptions\fR] \fBmonitor\fI \fR[\fIserver\fR] > > \fR[\fIdatabase\fR] \fItable\fR > > ?[\fIcolumn\fR[\fB,\fIcolumn\fR]...]... > > ?.br > > ?\fBovsdb\-client help\fR > > @@ -44,26 +44,29 @@ ovsdb\-client \- command-line interface to > > \fBovsdb-server\fR(1) > > ?. > > ?.SH DESCRIPTION > > ?The \fBovsdb\-client\fR program is a command-line client for > > -interacting with a running \fBovsdb\-server\fR process. ?For each > > -command, the \fIserver\fR to connect to must be specified in one of > > -the following forms: > > +interacting with a running \fBovsdb\-server\fR process. > > +Each command connects to an OVSDB server, which is > > +\fBunix:@RUNDIR@/db.sock\fR by default, or may be specified as > > +\fIserver\fR in one of the following forms: > > ?.RS > > ?.so ovsdb/remote-active.man > > ?.so ovsdb/remote-passive.man > > ?.RE > > +.PP > > +The default \fIdatabase\fR is \fBOpen_vSwitch\fR. > > ?. > > ?.SS "Commands" > > ?The following commands are implemented: > > -.IP "\fBlist\-dbs\fI server\fR" > > +.IP "\fBlist\-dbs \fR[\fIserver\fR]" > > ?Connects to \fIserver\fR, retrieves the list of known databases, and > > ?prints them one per line. ?These database names are the ones that may > > ?be used for \fIdatabase\fR in the following commands. > > ?. > > -.IP "\fBget\-schema\fI server database\fR" > > +.IP "\fBget\-schema \fR[\fIserver\fR] \fR[\fIdatabase\fR]" > > ?Connects to \fIserver\fR, retrieves the schema for \fIdatabase\fR, and > > ?prints it in JSON format. > > ?. > > -.IP "\fBget\-schema\-version\fI server database\fR" > > +.IP "\fBget\-schema\-version\fI \fR[\fIserver\fR] \fR[\fIdatabase\fR]" > > ?Connects to \fIserver\fR, retrieves the schema for \fIdatabase\fR, and > > ?prints its version number on stdout. ?A schema version number has the form > > ?\fIx\fB.\fIy\fB.\fIz\fR. ?See \fBovs\-vswitchd.conf.db\fR(5) for > > @@ -76,27 +79,27 @@ If \fIdatabase\fR was created before schema versioning > > was introduced, > > ?then it will not have a version number and this command will print a > > ?blank line. > > ?. > > -.IP "\fBlist\-tables\fI server database\fR" > > +.IP "\fBlist\-columns\fI \fR[\fIserver\fR] \fR[\fIdatabase\fR]" > > ?Connects to \fIserver\fR, retrieves the schema for \fIdatabase\fR, and > > ?prints a table listing the name of each table > > ?within the database. > > ?. > > -.IP "\fBlist\-columns\fI server database \fR[\fItable\fR]" > > +.IP "\fBlist\-columns\fI \fR[\fIserver\fR] \fR[\fIdatabase\fR] \fItable\fR" > > ?Connects to \fIserver\fR, retrieves the schema for \fIdatabase\fR, and > > ?prints a table listing the name and type of each > > ?column. ?If \fItable\fR is specified, only columns in that table are > > ?listed; otherwise, the tables include columns in all tables. > > ?. > > -.IP "\fBtransact\fI server transaction\fR" > > +.IP "\fBtransact\fI \fR[\fIserver\fR] \fItransaction\fR" > > ?Connects to \fIserver\fR, sends it the specified \fItransaction\fR, > > ?which must be a JSON array containing one or more valid OVSDB > > ?operations, and prints the received reply on stdout. > > ?. > > -.IP "\fBdump\fI server database\fR" > > +.IP "\fBdump\fI \fR[\fIserver\fR] \fR[\fIdatabase\fR]\fR" > > ?Connects to \fIserver\fR, retrieves all of the data in \fIdatabase\fR, > > ?and prints it on stdout as a series of tables. > > ?. > > -.IP "\fBmonitor\fI server database table\fR > > [\fIcolumn\fR[\fB,\fIcolumn\fR]...]..." > > +.IP "\fBmonitor\fI \fR[\fIserver\fR] \fR[\fIdatabase\fR] \fItable\fR" > > ?Connects to \fIserver\fR and monitors the contents of \fItable\fR in > > ?\fIdatabase\fR. ?By default, the initial contents of \fItable\fR are > > ?printed, followed by each change as it occurs. ?If at least one > > diff --git a/ovsdb/ovsdb-client.c b/ovsdb/ovsdb-client.c > > index 800d3e1..7c83aee 100644 > > --- a/ovsdb/ovsdb-client.c > > +++ b/ovsdb/ovsdb-client.c > > @@ -17,6 +17,7 @@ > > ?#include <config.h> > > > > ?#include <assert.h> > > +#include <ctype.h> > > ?#include <errno.h> > > ?#include <getopt.h> > > ?#include <limits.h> > > @@ -29,6 +30,7 @@ > > ?#include "column.h" > > ?#include "compiler.h" > > ?#include "daemon.h" > > +#include "dirs.h" > > ?#include "dynamic-string.h" > > ?#include "json.h" > > ?#include "jsonrpc.h" > > @@ -37,6 +39,7 @@ > > ?#include "ovsdb-data.h" > > ?#include "ovsdb-error.h" > > ?#include "sort.h" > > +#include "sset.h" > > ?#include "stream.h" > > ?#include "stream-ssl.h" > > ?#include "table.h" > > @@ -46,22 +49,109 @@ > > > > ?VLOG_DEFINE_THIS_MODULE(ovsdb_client); > > > > +enum args_needed { > > + ? ?NEED_NONE, ? ? ? ? ? ?/* No JSON-RPC connection or database name > > needed. */ > > + ? ?NEED_RPC, ? ? ? ? ? ? /* JSON-RPC connection needed. */ > > + ? ?NEED_DATABASE ? ? ? ? /* JSON-RPC connection and database name needed. > > */ > > +}; > > + > > +struct ovsdb_client_command { > > + ? ?const char *name; > > + ? ?enum args_needed need; > > + ? ?int min_args; > > + ? ?int max_args; > > + ? ?void (*handler)(struct jsonrpc *rpc, const char *database, > > + ? ? ? ? ? ? ? ? ? ?int argc, char *argv[]); > > +}; > > + > > ?/* Format for table output. */ > > ?static struct table_style table_style = TABLE_STYLE_DEFAULT; > > > > -static const struct command all_commands[]; > > +static const struct ovsdb_client_command all_commands[]; > > > > ?static void usage(void) NO_RETURN; > > ?static void parse_options(int argc, char *argv[]); > > +static struct jsonrpc *open_jsonrpc(const char *server); > > +static void fetch_dbs(struct jsonrpc *, struct sset *dbs); > > > > ?int > > ?main(int argc, char *argv[]) > > ?{ > > + ? ?const struct ovsdb_client_command *command; > > + ? ?const char *database; > > + ? ?struct jsonrpc *rpc; > > + > > ? ? proctitle_init(argc, argv); > > ? ? set_program_name(argv[0]); > > ? ? parse_options(argc, argv); > > ? ? signal(SIGPIPE, SIG_IGN); > > - ? ?run_command(argc - optind, argv + optind, all_commands); > > + > > + ? ?if (optind >= argc) { > > + ? ? ? ?ovs_fatal(0, "missing command name; use --help for help"); > > + ? ?} > > + > > + ? ?for (command = all_commands; ; command++) { > > + ? ? ? ?if (!command->name) { > > + ? ? ? ? ? ?VLOG_FATAL("unknown command '%s'; use --help for help", > > + ? ? ? ? ? ? ? ? ? ? ? argv[optind]); > > + ? ? ? ?} else if (!strcmp(command->name, argv[optind])) { > > + ? ? ? ? ? ?break; > > + ? ? ? ?} > > + ? ?} > > + ? ?optind++; > > + > > + ? ?if (command->need != NEED_NONE) { > > + ? ? ? ?if (argc - optind > command->min_args > > + ? ? ? ? ? ?&& (isalpha((unsigned char) argv[optind][0]) > > + ? ? ? ? ? ? ? ?&& strchr(argv[optind], ':'))) { > > + ? ? ? ? ? ?rpc = open_jsonrpc(argv[optind++]); > > + ? ? ? ?} else { > > + ? ? ? ? ? ?char *sock = xasprintf("unix:%s/db.sock", ovs_rundir()); > > + ? ? ? ? ? ?rpc = open_jsonrpc(sock); > > + ? ? ? ? ? ?free(sock); > > + ? ? ? ?} > > + ? ?} else { > > + ? ? ? ?rpc = NULL; > > + ? ?} > > + > > + ? ?if (command->need == NEED_DATABASE) { > > + ? ? ? ?struct sset dbs; > > + > > + ? ? ? ?sset_init(&dbs); > > + ? ? ? ?fetch_dbs(rpc, &dbs); > > + ? ? ? ?if (argc - optind > command->min_args > > + ? ? ? ? ? ?&& sset_contains(&dbs, argv[optind])) { > > + ? ? ? ? ? ?database = argv[optind++]; > > + ? ? ? ?} else if (sset_count(&dbs) == 1) { > > + ? ? ? ? ? ?database = xstrdup(SSET_FIRST(&dbs)); > > + ? ? ? ?} else if (sset_contains(&dbs, "Open_vSwitch")) { > > + ? ? ? ? ? ?database = "Open_vSwitch"; > > + ? ? ? ?} else { > > + ? ? ? ? ? ?ovs_fatal(0, "no default database for `%s' command, please " > > + ? ? ? ? ? ? ? ? ? ? ?"specify a database name", command->name); > > + ? ? ? ?} > > + ? ? ? ?sset_destroy(&dbs); > > + ? ?} else { > > + ? ? ? ?database = NULL; > > + ? ?} > > + > > + ? ?if (argc - optind < command->min_args || > > + ? ? ? ?argc - optind > command->max_args) { > > + ? ? ? ?VLOG_FATAL("invalid syntax for '%s' (use --help for help)", > > + ? ? ? ? ? ? ? ? ? ?command->name); > > + ? ?} > > + > > + ? ?command->handler(rpc, database, argc - optind, argv + optind); > > + > > + ? ?jsonrpc_close(rpc); > > + > > + ? ?if (ferror(stdout)) { > > + ? ? ? ?VLOG_FATAL("write to stdout failed"); > > + ? ?} > > + ? ?if (ferror(stderr)) { > > + ? ? ? ?VLOG_FATAL("write to stderr failed"); > > + ? ?} > > + > > ? ? return 0; > > ?} > > > > @@ -137,27 +227,29 @@ usage(void) > > ? ? printf("%s: Open vSwitch database JSON-RPC client\n" > > ? ? ? ? ? ?"usage: %s [OPTIONS] COMMAND [ARG...]\n" > > ? ? ? ? ? ?"\nValid commands are:\n" > > - ? ? ? ? ? "\n ?list-dbs SERVER\n" > > + ? ? ? ? ? "\n ?list-dbs [SERVER]\n" > > ? ? ? ? ? ?" ? ?list databases available on SERVER\n" > > - ? ? ? ? ? "\n ?get-schema SERVER DATABASE\n" > > + ? ? ? ? ? "\n ?get-schema [SERVER] [DATABASE]\n" > > ? ? ? ? ? ?" ? ?retrieve schema for DATABASE from SERVER\n" > > - ? ? ? ? ? "\n ?get-schema-version SERVER DATABASE\n" > > + ? ? ? ? ? "\n ?get-schema-version [SERVER] [DATABASE]\n" > > ? ? ? ? ? ?" ? ?retrieve schema for DATABASE from SERVER and report only > > its\n" > > ? ? ? ? ? ?" ? ?version number on stdout\n" > > - ? ? ? ? ? "\n ?list-tables SERVER DATABASE\n" > > + ? ? ? ? ? "\n ?list-tables [SERVER] [DATABASE]\n" > > ? ? ? ? ? ?" ? ?list tables for DATABASE on SERVER\n" > > - ? ? ? ? ? "\n ?list-columns SERVER DATABASE [TABLE]\n" > > + ? ? ? ? ? "\n ?list-columns [SERVER] [DATABASE] [TABLE]\n" > > ? ? ? ? ? ?" ? ?list columns in TABLE (or all tables) in DATABASE on > > SERVER\n" > > - ? ? ? ? ? "\n ?transact SERVER TRANSACTION\n" > > + ? ? ? ? ? "\n ?transact [SERVER] TRANSACTION\n" > > ? ? ? ? ? ?" ? ?run TRANSACTION (a JSON array of operations) on SERVER\n" > > ? ? ? ? ? ?" ? ?and print the results as JSON on stdout\n" > > - ? ? ? ? ? "\n ?monitor SERVER DATABASE TABLE [COLUMN,...]...\n" > > + ? ? ? ? ? "\n ?monitor [SERVER] [DATABASE] TABLE [COLUMN,...]...\n" > > ? ? ? ? ? ?" ? ?monitor contents of COLUMNs in TABLE in DATABASE on > > SERVER.\n" > > ? ? ? ? ? ?" ? ?COLUMNs may include !initial, !insert, !delete, !modify\n" > > ? ? ? ? ? ?" ? ?to avoid seeing the specified kinds of changes.\n" > > - ? ? ? ? ? "\n ?dump SERVER DATABASE\n" > > - ? ? ? ? ? " ? ?dump contents of DATABASE on SERVER to stdout\n", > > - ? ? ? ? ? program_name, program_name); > > + ? ? ? ? ? "\n ?dump [SERVER] [DATABASE]\n" > > + ? ? ? ? ? " ? ?dump contents of DATABASE on SERVER to stdout\n" > > + ? ? ? ? ? "\nThe default SERVER is unix:%s/db.sock.\n" > > + ? ? ? ? ? "The default DATABASE is Open_vSwitch.\n", > > + ? ? ? ? ? program_name, program_name, ovs_rundir()); > > ? ? stream_usage("SERVER", true, true, true); > > ? ? printf("\nOutput formatting options:\n" > > ? ? ? ? ? ?" ?-f, --format=FORMAT ? ? ? ? set output formatting to FORMAT\n" > > @@ -236,7 +328,7 @@ check_ovsdb_error(struct ovsdb_error *error) > > ?} > > > > ?static struct ovsdb_schema * > > -fetch_schema_from_rpc(struct jsonrpc *rpc, const char *database) > > +fetch_schema(struct jsonrpc *rpc, const char *database) > > ?{ > > ? ? struct jsonrpc_msg *request, *reply; > > ? ? struct ovsdb_schema *schema; > > @@ -256,29 +348,13 @@ fetch_schema_from_rpc(struct jsonrpc *rpc, const char > > *database) > > ? ? return schema; > > ?} > > > > -static struct ovsdb_schema * > > -fetch_schema(const char *server, const char *database) > > -{ > > - ? ?struct ovsdb_schema *schema; > > - ? ?struct jsonrpc *rpc; > > - > > - ? ?rpc = open_jsonrpc(server); > > - ? ?schema = fetch_schema_from_rpc(rpc, database); > > - ? ?jsonrpc_close(rpc); > > - > > - ? ?return schema; > > -} > > - > > - > > ?static void > > -do_list_dbs(int argc OVS_UNUSED, char *argv[]) > > +fetch_dbs(struct jsonrpc *rpc, struct sset *dbs) > > ?{ > > ? ? struct jsonrpc_msg *request, *reply; > > - ? ?struct jsonrpc *rpc; > > ? ? int error; > > ? ? size_t i; > > > > - ? ?rpc = open_jsonrpc(argv[1]); > > ? ? request = jsonrpc_create_request("list_dbs", json_array_create_empty(), > > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NULL); > > ? ? error = jsonrpc_transact_block(rpc, request, &reply); > > @@ -296,35 +372,53 @@ do_list_dbs(int argc OVS_UNUSED, char *argv[]) > > ? ? ? ? if (name->type != JSON_STRING) { > > ? ? ? ? ? ? ovs_fatal(0, "list_dbs response %zu is not string", i); > > ? ? ? ? } > > - ? ? ? ?puts(name->u.string); > > + ? ? ? ?sset_add(dbs, name->u.string); > > ? ? } > > ? ? jsonrpc_msg_destroy(reply); > > ?} > > + > > +static void > > +do_list_dbs(struct jsonrpc *rpc, const char *database OVS_UNUSED, > > + ? ? ? ? ? ?int argc OVS_UNUSED, char *argv[] OVS_UNUSED) > > +{ > > + ? ?const char *db_name; > > + ? ?struct sset dbs; > > + > > + ? ?sset_init(&dbs); > > + ? ?fetch_dbs(rpc, &dbs); > > + ? ?SSET_FOR_EACH (db_name, &dbs) { > > + ? ? ? ?puts(db_name); > > + ? ?} > > + ? ?sset_destroy(&dbs); > > +} > > > > ?static void > > -do_get_schema(int argc OVS_UNUSED, char *argv[]) > > +do_get_schema(struct jsonrpc *rpc, const char *database, > > + ? ? ? ? ? ? ?int argc OVS_UNUSED, char *argv[] OVS_UNUSED) > > ?{ > > - ? ?struct ovsdb_schema *schema = fetch_schema(argv[1], argv[2]); > > + ? ?struct ovsdb_schema *schema = fetch_schema(rpc, database); > > ? ? print_and_free_json(ovsdb_schema_to_json(schema)); > > ? ? ovsdb_schema_destroy(schema); > > ?} > > > > ?static void > > -do_get_schema_version(int argc OVS_UNUSED, char *argv[]) > > +do_get_schema_version(struct jsonrpc *rpc, const char *database, > > + ? ? ? ? ? ? ? ? ? ? ?int argc OVS_UNUSED, char *argv[] OVS_UNUSED) > > ?{ > > - ? ?struct ovsdb_schema *schema = fetch_schema(argv[1], argv[2]); > > + ? ?struct ovsdb_schema *schema = fetch_schema(rpc, database); > > ? ? puts(schema->version); > > ? ? ovsdb_schema_destroy(schema); > > ?} > > > > ?static void > > -do_list_tables(int argc OVS_UNUSED, char *argv[]) > > +do_list_tables(struct jsonrpc *rpc, const char *database, > > + ? ? ? ? ? ? ? int argc OVS_UNUSED, char *argv[] OVS_UNUSED) > > ?{ > > ? ? struct ovsdb_schema *schema; > > ? ? struct shash_node *node; > > ? ? struct table t; > > > > - ? ?schema = fetch_schema(argv[1], argv[2]); > > + ? ?schema = fetch_schema(rpc, database); > > ? ? table_init(&t); > > ? ? table_add_column(&t, "Table"); > > ? ? SHASH_FOR_EACH (node, &schema->tables) { > > @@ -338,14 +432,15 @@ do_list_tables(int argc OVS_UNUSED, char *argv[]) > > ?} > > > > ?static void > > -do_list_columns(int argc OVS_UNUSED, char *argv[]) > > +do_list_columns(struct jsonrpc *rpc, const char *database, > > + ? ? ? ? ? ? ? ?int argc OVS_UNUSED, char *argv[]) > > ?{ > > - ? ?const char *table_name = argv[3]; > > + ? ?const char *table_name = argv[0]; > > ? ? struct ovsdb_schema *schema; > > ? ? struct shash_node *table_node; > > ? ? struct table t; > > > > - ? ?schema = fetch_schema(argv[1], argv[2]); > > + ? ?schema = fetch_schema(rpc, database); > > ? ? table_init(&t); > > ? ? if (!table_name) { > > ? ? ? ? table_add_column(&t, "Table"); > > @@ -375,16 +470,15 @@ do_list_columns(int argc OVS_UNUSED, char *argv[]) > > ?} > > > > ?static void > > -do_transact(int argc OVS_UNUSED, char *argv[]) > > +do_transact(struct jsonrpc *rpc, const char *database OVS_UNUSED, > > + ? ? ? ? ? ?int argc OVS_UNUSED, char *argv[]) > > ?{ > > ? ? struct jsonrpc_msg *request, *reply; > > ? ? struct json *transaction; > > - ? ?struct jsonrpc *rpc; > > ? ? int error; > > > > - ? ?transaction = parse_json(argv[2]); > > + ? ?transaction = parse_json(argv[0]); > > > > - ? ?rpc = open_jsonrpc(argv[1]); > > ? ? request = jsonrpc_create_request("transact", transaction, NULL); > > ? ? error = jsonrpc_transact_block(rpc, request, &reply); > > ? ? if (error) { > > @@ -397,7 +491,6 @@ do_transact(int argc OVS_UNUSED, char *argv[]) > > ? ? print_json(reply->result); > > ? ? putchar('\n'); > > ? ? jsonrpc_msg_destroy(reply); > > - ? ?jsonrpc_close(rpc); > > ?} > > > > ?static void > > @@ -565,22 +658,19 @@ parse_monitor_columns(char *arg, const char *server, > > const char *database, > > ?} > > > > ?static void > > -do_monitor(int argc, char *argv[]) > > +do_monitor(struct jsonrpc *rpc, const char *database, > > + ? ? ? ? ? int argc, char *argv[]) > > ?{ > > - ? ?const char *server = argv[1]; > > - ? ?const char *database = argv[2]; > > - ? ?const char *table_name = argv[3]; > > + ? ?const char *server = jsonrpc_get_name(rpc); > > + ? ?const char *table_name = argv[0]; > > ? ? struct ovsdb_column_set columns = OVSDB_COLUMN_SET_INITIALIZER; > > ? ? struct ovsdb_table_schema *table; > > ? ? struct ovsdb_schema *schema; > > ? ? struct jsonrpc_msg *request; > > - ? ?struct jsonrpc *rpc; > > ? ? struct json *monitor, *monitor_request_array, > > ? ? ? ? *monitor_requests, *request_id; > > > > - ? ?rpc = open_jsonrpc(server); > > - > > - ? ?schema = fetch_schema_from_rpc(rpc, database); > > + ? ?schema = fetch_schema(rpc, database); > > ? ? table = shash_find_data(&schema->tables, table_name); > > ? ? if (!table) { > > ? ? ? ? ovs_fatal(0, "%s: %s does not have a table named \"%s\"", > > @@ -588,10 +678,10 @@ do_monitor(int argc, char *argv[]) > > ? ? } > > > > ? ? monitor_request_array = json_array_create_empty(); > > - ? ?if (argc > 4) { > > + ? ?if (argc > 1) { > > ? ? ? ? int i; > > > > - ? ? ? ?for (i = 4; i < argc; i++) { > > + ? ? ? ?for (i = 1; i < argc; i++) { > > ? ? ? ? ? ? json_array_add( > > ? ? ? ? ? ? ? ? monitor_request_array, > > ? ? ? ? ? ? ? ? parse_monitor_columns(argv[i], server, database, table, > > @@ -795,15 +885,12 @@ dump_table(const struct ovsdb_table_schema *ts, > > struct json_array *rows) > > ?} > > > > ?static void > > -do_dump(int argc OVS_UNUSED, char *argv[]) > > +do_dump(struct jsonrpc *rpc, const char *database, > > + ? ? ? ?int argc OVS_UNUSED, char *argv[] OVS_UNUSED) > > ?{ > > - ? ?const char *server = argv[1]; > > - ? ?const char *database = argv[2]; > > - > > ? ? struct jsonrpc_msg *request, *reply; > > ? ? struct ovsdb_schema *schema; > > ? ? struct json *transaction; > > - ? ?struct jsonrpc *rpc; > > ? ? int error; > > > > ? ? const struct shash_node **tables; > > @@ -811,9 +898,7 @@ do_dump(int argc OVS_UNUSED, char *argv[]) > > > > ? ? size_t i; > > > > - ? ?rpc = open_jsonrpc(server); > > - > > - ? ?schema = fetch_schema_from_rpc(rpc, database); > > + ? ?schema = fetch_schema(rpc, database); > > ? ? tables = shash_sort(&schema->tables); > > ? ? n_tables = shash_count(&schema->tables); > > > > @@ -872,20 +957,30 @@ do_dump(int argc OVS_UNUSED, char *argv[]) > > ?} > > > > ?static void > > -do_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) > > +do_help(struct jsonrpc *rpc OVS_UNUSED, const char *database OVS_UNUSED, > > + ? ? ? ?int argc OVS_UNUSED, char *argv[] OVS_UNUSED) > > ?{ > > ? ? usage(); > > ?} > > > > -static const struct command all_commands[] = { > > - ? ?{ "list-dbs", 1, 1, do_list_dbs }, > > - ? ?{ "get-schema", 2, 2, do_get_schema }, > > - ? ?{ "get-schema-version", 2, 2, do_get_schema_version }, > > - ? ?{ "list-tables", 2, 2, do_list_tables }, > > - ? ?{ "list-columns", 2, 3, do_list_columns }, > > - ? ?{ "transact", 2, 2, do_transact }, > > - ? ?{ "monitor", 3, INT_MAX, do_monitor }, > > - ? ?{ "dump", 2, 2, do_dump }, > > - ? ?{ "help", 0, INT_MAX, do_help }, > > - ? ?{ NULL, 0, 0, NULL }, > > +/* All command handlers (except for "help") are expected to take an > > optional > > + * server socket name (e.g. "unix:...") as their first argument. ?The > > socket > > + * name argument must be included in max_rags (but left out of min_args). > > ?The > > + * command name and socket name are not included in the arguments passed > > to the > > + * handler: the argv[0] passed to the handler is the first argument after > > the > > + * optional server socket name. ?The connection to the server is available > > as > > + * global variable 'rpc'. */ > > +static const struct ovsdb_client_command all_commands[] = { > > + ? ?{ "list-dbs", ? ? ? ? ? NEED_RPC, ? ? ?0, 0, ? ? ? do_list_dbs }, > > + ? ?{ "get-schema", ? ? ? ? NEED_DATABASE, 0, 0, ? ? ? do_get_schema }, > > + ? ?{ "get-schema-version", NEED_DATABASE, 0, 0, ? ? ? > > do_get_schema_version }, > > + ? ?{ "list-tables", ? ? ? ?NEED_DATABASE, 0, 0, ? ? ? do_list_tables }, > > + ? ?{ "list-columns", ? ? ? NEED_DATABASE, 0, 1, ? ? ? do_list_columns }, > > + ? ?{ "transact", ? ? ? ? ? NEED_RPC, ? ? ?1, 1, ? ? ? do_transact }, > > + ? ?{ "monitor", ? ? ? ? ? ?NEED_DATABASE, 1, INT_MAX, do_monitor }, > > + ? ?{ "dump", ? ? ? ? ? ? ? NEED_DATABASE, 0, 0, ? ? ? do_dump }, > > + > > + ? ?{ "help", ? ? ? ? ? ? ? NEED_NONE, ? ? 0, INT_MAX, do_help }, > > + > > + ? ?{ NULL, ? ? ? ? ? ? ? ? 0, ? ? ? ? ? ? 0, 0, ? ? ? NULL }, > > ?}; > > diff --git a/tests/ovsdb-server.at b/tests/ovsdb-server.at > > index a7a2829..7d79d22 100644 > > --- a/tests/ovsdb-server.at > > +++ b/tests/ovsdb-server.at > > @@ -155,9 +155,9 @@ AT_CHECK( > > ? [0], [ordinals > > ?], [ignore], [test ! -e pid || kill `cat pid`]) > > ?AT_CHECK( > > - ?[[ovsdb-client get-schema unix:socket nonexistent]], > > - ?[1], [], [[ovsdb-client: syntax "{"details":"get_schema request > > specifies unknown database nonexistent","error":"unknown > > database","syntax":"[\"nonexistent\"]"}": syntax error: Parsing database > > schema failed: Required 'name' member is missing. > > -]], [test ! -e pid || kill `cat pid`]) > > + ?[[test-jsonrpc request unix:socket get_schema [\"nonexistent\"]]], [0], > > + ?[[{"error":null,"id":0,"result":{"details":"get_schema request specifies > > unknown database nonexistent","error":"unknown > > database","syntax":"[\"nonexistent\"]"}} > > +]], [], [test ! -e pid || kill `cat pid`]) > > ?OVSDB_SERVER_SHUTDOWN > > ?AT_CLEANUP > > > > -- > > 1.7.4.4 > > > > _______________________________________________ > > dev mailing list > > [email protected] > > http://openvswitch.org/mailman/listinfo/dev > > _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
