X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Fcolumn.c;h=58fff1084fd9ae1b8b1bf86ea49a91d86af9f1b7;hb=90887925206f585db65ae8872f197a97543f2860;hp=1e8a2d09d6b75cde68ab00935fac4190bb6f3996;hpb=f85f8ebbfac946c19b3c6eb0f4170f579d0a4d25;p=openvswitch diff --git a/ovsdb/column.c b/ovsdb/column.c index 1e8a2d09..58fff108 100644 --- a/ovsdb/column.c +++ b/ovsdb/column.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. @@ -31,21 +31,32 @@ ovsdb_column_create(const char *name, const char *comment, bool mutable, bool persistent, const struct ovsdb_type *type) { - struct ovsdb_column *ts; + /* Doesn't set the new column's 'index': the caller must do that. */ + struct ovsdb_column *column; - ts = xzalloc(sizeof *ts); - ts->name = xstrdup(name); - ts->comment = comment ? xstrdup(comment) : NULL; - ts->mutable = mutable; - ts->persistent = persistent; - ts->type = *type; + column = xzalloc(sizeof *column); + column->name = xstrdup(name); + column->comment = comment ? xstrdup(comment) : NULL; + column->mutable = mutable; + column->persistent = persistent; + ovsdb_type_clone(&column->type, type); - return ts; + return column; +} + +struct ovsdb_column * +ovsdb_column_clone(const struct ovsdb_column *old) +{ + /* Doesn't copy the column's 'index': the caller must do that. */ + return ovsdb_column_create(old->name, old->comment, + old->mutable, old->persistent, + &old->type); } void ovsdb_column_destroy(struct ovsdb_column *column) { + ovsdb_type_destroy(&column->type); free(column->name); free(column->comment); free(column); @@ -85,6 +96,9 @@ ovsdb_column_from_json(const struct json *json, const char *name, comment ? json_string(comment) : NULL, mutable ? json_boolean(mutable) : true, persistent, &type); + + ovsdb_type_destroy(&type); + return NULL; } @@ -143,6 +157,7 @@ ovsdb_column_set_from_json(const struct json *json, return NULL; } else { + struct ovsdb_error *error = NULL; size_t i; if (json->type != JSON_ARRAY) { @@ -151,27 +166,48 @@ ovsdb_column_set_from_json(const struct json *json, /* XXX this is O(n**2) */ for (i = 0; i < json->u.array.n; i++) { - struct ovsdb_column *column; + const struct ovsdb_column *column; + const char *s; if (json->u.array.elems[i]->type != JSON_STRING) { goto error; } - column = shash_find_data(&table->schema->columns, - json->u.array.elems[i]->u.string); - if (ovsdb_column_set_contains(set, column->index)) { + s = json->u.array.elems[i]->u.string; + column = shash_find_data(&table->schema->columns, s); + if (!column) { + error = ovsdb_syntax_error(json, NULL, "%s is not a valid " + "column name", s); + goto error; + } else if (ovsdb_column_set_contains(set, column->index)) { goto error; } ovsdb_column_set_add(set, column); } - return NULL; + + error: + ovsdb_column_set_destroy(set); + ovsdb_column_set_init(set); + if (!error) { + error = ovsdb_syntax_error(json, NULL, "array of distinct column " + "names expected"); + } + return error; } +} -error: - ovsdb_column_set_destroy(set); - return ovsdb_syntax_error(json, NULL, - "array of distinct column names expected"); +struct json * +ovsdb_column_set_to_json(const struct ovsdb_column_set *set) +{ + struct json *json; + size_t i; + + json = json_array_create_empty(); + for (i = 0; i < set->n_columns; i++) { + json_array_add(json, json_string_create(set->columns[i]->name)); + } + return json; } void