X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Fovsdb.c;h=2dea507cbf1cd2426800e87b0dd7a74782b06fbb;hb=141c83fa93693d750f804d5124d960992a723de7;hp=4d5f1c5e5270b7267e8290ad4bde05cf99fdac71;hpb=bd06962ad334fa4631b67905fc9f43f96a908915;p=openvswitch diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c index 4d5f1c5e..2dea507c 100644 --- a/ovsdb/ovsdb.c +++ b/ovsdb/ovsdb.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009 Nicira Networks +/* Copyright (c) 2009, 2010 Nicira Networks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,9 +17,11 @@ #include "ovsdb.h" +#include "column.h" #include "json.h" #include "ovsdb-error.h" #include "ovsdb-parser.h" +#include "ovsdb-types.h" #include "table.h" #include "transaction.h" @@ -68,8 +70,8 @@ ovsdb_schema_from_file(const char *file_name, struct ovsdb_schema **schemap) } error = ovsdb_schema_from_json(json, &schema); + json_destroy(json); if (error) { - json_destroy(json); return ovsdb_wrap_error(error, "failed to parse \"%s\" as ovsdb schema", file_name); @@ -79,6 +81,23 @@ ovsdb_schema_from_file(const char *file_name, struct ovsdb_schema **schemap) return NULL; } +static struct ovsdb_error * WARN_UNUSED_RESULT +ovsdb_schema_check_ref_table(const struct ovsdb_column *column, + const struct shash *tables, + const struct ovsdb_base_type *base, + const char *base_name) +{ + if (base->type == OVSDB_TYPE_UUID && base->u.uuid.refTableName + && !shash_find(tables, base->u.uuid.refTableName)) { + return ovsdb_syntax_error(NULL, NULL, + "column %s %s refers to undefined table %s", + column->name, base_name, + base->u.uuid.refTableName); + } else { + return NULL; + } +} + struct ovsdb_error * ovsdb_schema_from_json(struct json *json, struct ovsdb_schema **schemap) { @@ -107,6 +126,8 @@ ovsdb_schema_from_json(struct json *json, struct ovsdb_schema **schemap) 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); @@ -118,6 +139,29 @@ ovsdb_schema_from_json(struct json *json, struct ovsdb_schema **schemap) shash_add(&schema->tables, table->name, table); } + + /* Validate that all refTables refer to the names of tables that exist. */ + SHASH_FOR_EACH (node, &schema->tables) { + struct ovsdb_table_schema *table = node->data; + struct shash_node *node2; + + SHASH_FOR_EACH (node2, &table->columns) { + struct ovsdb_column *column = node2->data; + + error = ovsdb_schema_check_ref_table(column, &schema->tables, + &column->type.key, "key"); + if (!error) { + error = ovsdb_schema_check_ref_table(column, &schema->tables, + &column->type.value, + "value"); + } + if (error) { + ovsdb_schema_destroy(schema); + return error; + } + } + } + *schemap = schema; return 0; } @@ -146,6 +190,18 @@ ovsdb_schema_to_json(const struct ovsdb_schema *schema) return json; } +static void +ovsdb_set_ref_table(const struct shash *tables, + struct ovsdb_base_type *base) +{ + if (base->type == OVSDB_TYPE_UUID && base->u.uuid.refTableName) { + struct ovsdb_table *table; + + table = shash_find_data(tables, base->u.uuid.refTableName); + base->u.uuid.refTable = table; + } +} + struct ovsdb * ovsdb_create(struct ovsdb_schema *schema) { @@ -164,6 +220,19 @@ ovsdb_create(struct ovsdb_schema *schema) shash_add(&db->tables, node->name, ovsdb_table_create(ts)); } + /* Set all the refTables. */ + SHASH_FOR_EACH (node, &schema->tables) { + struct ovsdb_table_schema *table = node->data; + struct shash_node *node2; + + SHASH_FOR_EACH (node2, &table->columns) { + struct ovsdb_column *column = node2->data; + + ovsdb_set_ref_table(&db->tables, &column->type.key); + ovsdb_set_ref_table(&db->tables, &column->type.value); + } + } + return db; }