diff options
author | Ben Pfaff <blp@nicira.com> | 2013-03-27 09:32:56 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2013-04-02 19:21:27 -0700 |
commit | 4a95e9bf2a4fc1d2b261a4cc2071e190e3a15ddc (patch) | |
tree | 7a6d391e7bcf477b894d20736a06b1f221535b52 /lib | |
parent | 9df297204560482c6b51571cef05fb8ad0184e35 (diff) |
ovsdb-data: New functions for predicting serialized length of data.
These will be used for the first time in an upcoming commit.
Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ovsdb-data.c | 93 | ||||
-rw-r--r-- | lib/ovsdb-data.h | 6 |
2 files changed, 97 insertions, 2 deletions
diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c index 0afd03a2..7ec76947 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. @@ -466,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, @@ -1307,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) { diff --git a/lib/ovsdb-data.h b/lib/ovsdb-data.h index 2e31cc5b..ece16722 100644 --- a/lib/ovsdb-data.h +++ b/lib/ovsdb-data.h @@ -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. @@ -88,6 +88,8 @@ struct ovsdb_error *ovsdb_atom_from_json(union ovsdb_atom *, WARN_UNUSED_RESULT; struct json *ovsdb_atom_to_json(const union ovsdb_atom *, enum ovsdb_atomic_type); +size_t ovsdb_atom_json_length(const union ovsdb_atom *, + enum ovsdb_atomic_type); char *ovsdb_atom_from_string(union ovsdb_atom *, const struct ovsdb_base_type *, const char *, @@ -163,6 +165,8 @@ struct ovsdb_error *ovsdb_datum_from_json(struct ovsdb_datum *, WARN_UNUSED_RESULT; struct json *ovsdb_datum_to_json(const struct ovsdb_datum *, const struct ovsdb_type *); +size_t ovsdb_datum_json_length(const struct ovsdb_datum *, + const struct ovsdb_type *); char *ovsdb_datum_from_string(struct ovsdb_datum *, const struct ovsdb_type *, const char *, |