Added ovsdb_transient_datum_from_json() to avoid size check for the diff datum that is transient in nature. Suppose a datum contains set, and the max number of elements is 2. If we are changing from set that contains [A, B], to a set contains [C, D], the diff datum will contains 4 elements [A, B, C, D].
Thus diff datum should not be constrained by the size limit. However the datum after diff is applied should not violate the size limit. Signed-off-by: Andy Zhou <az...@nicira.com> --- lib/ovsdb-data.c | 32 +++++++++++++++++++++++++++++--- lib/ovsdb-data.h | 5 +++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/lib/ovsdb-data.c b/lib/ovsdb-data.c index a62e92e..592e9ed 100644 --- a/lib/ovsdb-data.c +++ b/lib/ovsdb-data.c @@ -1158,7 +1158,8 @@ static struct ovsdb_error * ovsdb_datum_from_json__(struct ovsdb_datum *datum, const struct ovsdb_type *type, const struct json *json, - struct ovsdb_symbol_table *symtab) + struct ovsdb_symbol_table *symtab, + bool check_size) { struct ovsdb_error *error; @@ -1179,7 +1180,7 @@ ovsdb_datum_from_json__(struct ovsdb_datum *datum, } n = inner->u.array.n; - if (n < type->n_min || n > type->n_max) { + if (check_size && (n < type->n_min || n > type->n_max)) { return ovsdb_syntax_error(json, NULL, "%s must have %u to " "%u members but %"PRIuSIZE" are present", class, type->n_min, type->n_max, n); @@ -1256,7 +1257,32 @@ ovsdb_datum_from_json(struct ovsdb_datum *datum, { struct ovsdb_error *error; - error = ovsdb_datum_from_json__(datum, type, json, symtab); + error = ovsdb_datum_from_json__(datum, type, json, symtab, true); + if (error) { + return error; + } + + error = ovsdb_datum_sort(datum, type->key.type); + if (error) { + ovsdb_datum_destroy(datum, type); + } + return error; +} + +/* Parses 'json' as a datum of the type described by 'type' for internal + * use. This function is similar to 'ovsdb_datum_from_json', except: + * the member size of set or map is not checked. + * + * The datum generated should be used then discard. It is not suitable + * for storing into IDL because of the possible member size violation. */ +struct ovsdb_error * +ovsdb_transient_datum_from_json(struct ovsdb_datum *datum, + const struct ovsdb_type *type, + const struct json *json) +{ + struct ovsdb_error *error; + + error = ovsdb_datum_from_json__(datum, type, json, NULL, false); if (error) { return error; } diff --git a/lib/ovsdb-data.h b/lib/ovsdb-data.h index e144c70..802f718 100644 --- a/lib/ovsdb-data.h +++ b/lib/ovsdb-data.h @@ -161,6 +161,11 @@ struct ovsdb_error *ovsdb_datum_from_json(struct ovsdb_datum *, const struct json *, struct ovsdb_symbol_table *) OVS_WARN_UNUSED_RESULT; +struct ovsdb_error *ovsdb_transient_datum_from_json( + struct ovsdb_datum *, + const struct ovsdb_type *, + const struct json *) + OVS_WARN_UNUSED_RESULT; struct json *ovsdb_datum_to_json(const struct ovsdb_datum *, const struct ovsdb_type *); -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev