#include "ovsdb.h"
-#include <fcntl.h>
-
-#include "file.h"
#include "json.h"
#include "ovsdb-error.h"
#include "ovsdb-parser.h"
#include "table.h"
#include "transaction.h"
-#define THIS_MODULE VLM_ovsdb
-#include "vlog.h"
-
struct ovsdb_schema *
ovsdb_schema_create(const char *name, const char *comment)
{
if (node->name[0] == '_') {
error = ovsdb_syntax_error(json, NULL, "names beginning with "
"\"_\" are reserved");
+ } else if (!ovsdb_parser_is_id(node->name)) {
+ error = ovsdb_syntax_error(json, NULL, "name must be a valid id");
} else {
error = ovsdb_table_schema_from_json(node->data, node->name,
&table);
}
\f
struct ovsdb *
-ovsdb_create(struct ovsdb_file *file, struct ovsdb_schema *schema)
+ovsdb_create(struct ovsdb_schema *schema)
{
struct shash_node *node;
struct ovsdb *db;
db = xmalloc(sizeof *db);
db->schema = schema;
- db->file = file;
+ list_init(&db->replicas);
list_init(&db->triggers);
db->run_triggers = false;
return db;
}
-struct ovsdb_error *
-ovsdb_open(const char *file_name, bool read_only, struct ovsdb **dbp)
-{
- struct ovsdb_schema *schema;
- struct ovsdb_error *error;
- struct ovsdb_file *file;
- struct json *json;
- struct ovsdb *db;
-
- error = ovsdb_file_open(file_name, read_only ? O_RDONLY : O_RDWR, &file);
- if (error) {
- return error;
- }
-
- error = ovsdb_file_read(file, &json);
- if (error) {
- return error;
- } else if (!json) {
- return ovsdb_io_error(EOF, "%s: database file contains no schema",
- file_name);
- }
-
- error = ovsdb_schema_from_json(json, &schema);
- if (error) {
- json_destroy(json);
- return ovsdb_wrap_error(error,
- "failed to parse \"%s\" as ovsdb schema",
- file_name);
- }
- json_destroy(json);
-
- db = ovsdb_create(read_only ? NULL : file, schema);
- while ((error = ovsdb_file_read(file, &json)) == NULL && json) {
- struct ovsdb_txn *txn;
-
- error = ovsdb_txn_from_json(db, json, &txn);
- json_destroy(json);
- if (error) {
- break;
- }
-
- ovsdb_txn_commit(txn);
- }
- if (error) {
- char *msg = ovsdb_error_to_string(error);
- VLOG_WARN("%s", msg);
- free(msg);
-
- ovsdb_error_destroy(error);
- }
-
- if (read_only) {
- ovsdb_file_close(file);
- }
-
- *dbp = db;
- return NULL;
-}
-
void
ovsdb_destroy(struct ovsdb *db)
{
if (db) {
struct shash_node *node;
+ /* Remove all the replicas. */
+ while (!list_is_empty(&db->replicas)) {
+ struct ovsdb_replica *r
+ = CONTAINER_OF(list_pop_back(&db->replicas),
+ struct ovsdb_replica, node);
+ ovsdb_remove_replica(db, r);
+ }
+
/* Delete all the tables. This also deletes their schemas. */
SHASH_FOR_EACH (node, &db->tables) {
struct ovsdb_table *table = node->data;
shash_clear(&db->schema->tables);
ovsdb_schema_destroy(db->schema);
- ovsdb_file_close(db->file);
free(db);
}
}
{
return shash_find_data(&db->tables, name);
}
+\f
+void
+ovsdb_replica_init(struct ovsdb_replica *r,
+ const struct ovsdb_replica_class *class)
+{
+ r->class = class;
+}
+
+void
+ovsdb_add_replica(struct ovsdb *db, struct ovsdb_replica *r)
+{
+ list_push_back(&db->replicas, &r->node);
+}
+
+void
+ovsdb_remove_replica(struct ovsdb *db UNUSED, struct ovsdb_replica *r)
+{
+ list_remove(&r->node);
+ (r->class->destroy)(r);
+}