+
+/* "ovsdb-server/add-db DB": adds the DB to ovsdb-server. */
+static void
+ovsdb_server_add_database(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[], void *config_)
+{
+ struct server_config *config = config_;
+ const char *filename = argv[1];
+ char *error;
+
+ error = open_db(config, filename);
+ if (!error) {
+ save_config(config);
+ unixctl_command_reply(conn, NULL);
+ } else {
+ unixctl_command_reply_error(conn, error);
+ free(error);
+ }
+}
+
+static void
+ovsdb_server_remove_database(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[], void *config_)
+{
+ struct server_config *config = config_;
+ struct shash_node *node;
+ struct db *db;
+ bool ok;
+
+ node = shash_find(config->all_dbs, argv[1]);
+ if (!node) {
+ unixctl_command_reply_error(conn, "Failed to find the database.");
+ return;
+ }
+ db = node->data;
+
+ ok = ovsdb_jsonrpc_server_remove_db(config->jsonrpc, db->db);
+ ovs_assert(ok);
+
+ ovsdb_destroy(db->db);
+ shash_delete(config->all_dbs, node);
+ free(db->filename);
+ free(db);
+
+ save_config(config);
+ unixctl_command_reply(conn, NULL);
+}
+
+static void
+ovsdb_server_list_databases(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[] OVS_UNUSED, void *all_dbs_)
+{
+ struct shash *all_dbs = all_dbs_;
+ const struct shash_node **nodes;
+ struct ds s;
+ size_t i;
+
+ ds_init(&s);
+
+ nodes = shash_sort(all_dbs);
+ for (i = 0; i < shash_count(all_dbs); i++) {
+ struct db *db = nodes[i]->data;
+ ds_put_format(&s, "%s\n", db->db->schema->name);
+ }
+ free(nodes);
+
+ unixctl_command_reply(conn, ds_cstr(&s));
+ ds_destroy(&s);
+}
+