X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fovsdb-data.c;h=7ec769479e903f088794d85c77781259462d7319;hb=3444fdfb453d3593914cf1e18f9ac2f8b036e986;hp=e357233bc69a063616fe70513f1eab446e021b46;hpb=8706009e555bb9fa04a5679e4be2c7c67506802b;p=sliver-openvswitch.git diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c index e357233bc..7ec769479 100644 --- a/lib/ovsdb-data.c +++ b/lib/ovsdb-data.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. +/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ #include "ovsdb-data.h" -#include #include #include #include @@ -108,7 +107,7 @@ ovsdb_atom_default(enum ovsdb_atomic_type type) inited = true; } - assert(ovsdb_atomic_type_is_valid(type)); + ovs_assert(ovsdb_atomic_type_is_valid(type)); return &default_atoms[type]; } @@ -290,7 +289,7 @@ static void ovsdb_symbol_referenced(struct ovsdb_symbol *symbol, const struct ovsdb_base_type *base) { - assert(base->type == OVSDB_TYPE_UUID); + ovs_assert(base->type == OVSDB_TYPE_UUID); if (base->u.uuid.refTableName) { switch (base->u.uuid.refType) { @@ -467,6 +466,47 @@ ovsdb_atom_to_json(const union ovsdb_atom *atom, enum ovsdb_atomic_type type) } } +/* Returns strlen(json_to_string(ovsdb_atom_to_json(atom, type), 0)). */ +size_t +ovsdb_atom_json_length(const union ovsdb_atom *atom, + enum ovsdb_atomic_type type) +{ + struct json json; + + switch (type) { + case OVSDB_TYPE_VOID: + NOT_REACHED(); + + case OVSDB_TYPE_INTEGER: + json.type = JSON_INTEGER; + json.u.integer = atom->integer; + break; + + case OVSDB_TYPE_REAL: + json.type = JSON_REAL; + json.u.real = atom->real; + break; + + case OVSDB_TYPE_BOOLEAN: + json.type = atom->boolean ? JSON_TRUE : JSON_FALSE; + break; + + case OVSDB_TYPE_STRING: + json.type = JSON_STRING; + json.u.string = atom->string; + break; + + case OVSDB_TYPE_UUID: + return strlen("[\"uuid\",\"00000000-0000-0000-0000-000000000000\"]"); + + case OVSDB_N_TYPES: + default: + NOT_REACHED(); + } + + return json_serialized_length(&json); +} + static char * ovsdb_atom_from_string__(union ovsdb_atom *atom, const struct ovsdb_base_type *base, const char *s, @@ -879,7 +919,7 @@ ovsdb_datum_default(const struct ovsdb_type *type) int kt = type->key.type; int vt = type->value.type; - assert(ovsdb_type_is_valid(type)); + ovs_assert(ovsdb_type_is_valid(type)); d = &default_data[kt][vt]; if (!d->n) { @@ -1308,6 +1348,56 @@ ovsdb_datum_to_json(const struct ovsdb_datum *datum, } } +/* Returns strlen(json_to_string(ovsdb_datum_to_json(datum, type), 0)). */ +size_t +ovsdb_datum_json_length(const struct ovsdb_datum *datum, + const struct ovsdb_type *type) +{ + if (ovsdb_type_is_map(type)) { + size_t length; + + /* ["map",[...]]. */ + length = 10; + if (datum->n > 0) { + size_t i; + + /* Commas between pairs in the inner [...] */ + length += datum->n - 1; + + /* [,] in each pair. */ + length += datum->n * 3; + + /* Data. */ + for (i = 0; i < datum->n; i++) { + length += ovsdb_atom_json_length(&datum->keys[i], + type->key.type); + length += ovsdb_atom_json_length(&datum->values[i], + type->value.type); + } + } + return length; + } else if (datum->n == 1) { + return ovsdb_atom_json_length(&datum->keys[0], type->key.type); + } else { + size_t length; + size_t i; + + /* ["set",[...]]. */ + length = 10; + if (datum->n > 0) { + /* Commas between elements in the inner [...]. */ + length += datum->n - 1; + + /* Data. */ + for (i = 0; i < datum->n; i++) { + length += ovsdb_atom_json_length(&datum->keys[i], + type->key.type); + } + } + return length; + } +} + static const char * skip_spaces(const char *p) { @@ -1543,7 +1633,7 @@ ovsdb_datum_from_smap(struct ovsdb_datum *datum, struct smap *smap) &datum->keys[i].string, &datum->values[i].string); i++; } - assert(i == datum->n); + ovs_assert(i == datum->n); smap_destroy(smap); ovsdb_datum_sort_unique(datum, OVSDB_TYPE_STRING, OVSDB_TYPE_STRING); @@ -1802,7 +1892,7 @@ ovsdb_datum_union(struct ovsdb_datum *a, const struct ovsdb_datum *b, struct ovsdb_error *error; a->n = n; error = ovsdb_datum_sort(a, type->key.type); - assert(!error); + ovs_assert(!error); } } @@ -1814,9 +1904,9 @@ ovsdb_datum_subtract(struct ovsdb_datum *a, const struct ovsdb_type *a_type, bool changed = false; size_t i; - assert(a_type->key.type == b_type->key.type); - assert(a_type->value.type == b_type->value.type - || b_type->value.type == OVSDB_TYPE_VOID); + ovs_assert(a_type->key.type == b_type->key.type); + ovs_assert(a_type->value.type == b_type->value.type + || b_type->value.type == OVSDB_TYPE_VOID); /* XXX The big-O of this could easily be improved. */ for (i = 0; i < a->n; ) { @@ -1863,7 +1953,7 @@ ovsdb_symbol_table_put(struct ovsdb_symbol_table *symtab, const char *name, { struct ovsdb_symbol *symbol; - assert(!ovsdb_symbol_table_get(symtab, name)); + ovs_assert(!ovsdb_symbol_table_get(symtab, name)); symbol = xmalloc(sizeof *symbol); symbol->uuid = *uuid; symbol->created = created;