On Sun, Jun 21, 2015 at 1:29 PM, Ansis Atteka <ansisatt...@gmail.com> wrote: > > > On 15 June 2015 at 19:35, Andy Zhou <az...@nicira.com> wrote: >> >> Add functions to support dealing with multiple schemas as a set. These > > > It seems that you are not using plural form of "schema" consistently (i.e. > in the actual code you are using "schemata"). Take a look > here[http://english.stackexchange.com/questions/77764/plural-form-of-schema] > regarding "schema" plural usage. I personally would prefer anglicized > version because it is more obvious. > I treat them as interchangeable terms. Sure I can switch to schemas if it is easier to read.
> Minor. Also, "dealing with multiple schemas" is loose description. Would you > mind to be more specific in commit message? > Yes, I will add more context. >> >> functions will be useful in the following patch. >> >> Signed-off-by: Andy Zhou <az...@nicira.com> >> --- >> ovsdb/ovsdb.c | 153 >> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> ovsdb/ovsdb.h | 34 ++++++++++++- >> 2 files changed, 186 insertions(+), 1 deletion(-) >> >> diff --git a/ovsdb/ovsdb.c b/ovsdb/ovsdb.c >> index 64355eb..5ec59ca 100644 >> --- a/ovsdb/ovsdb.c >> +++ b/ovsdb/ovsdb.c >> @@ -455,3 +455,156 @@ ovsdb_remove_replica(struct ovsdb *db OVS_UNUSED, >> struct ovsdb_replica *r) >> list_remove(&r->node); >> (r->class->destroy)(r); >> } >> + > > > Document this function's API. Here I am left wondering: How about adding the following comment? +/* Join all schemas contains within 'schemas' to produce a single joined schema. + * 'schmas' passed in is expected to contain at least one schema. + * + * On success, this function returns NULL, 'schemap' points to the newly created + * joined schema, The caller is responsible for reclaim its memory by calling + * ovsdb_schema_destroy(). + * + * On error, an ovsdb_error will be allocated describing the error, the caller + * is responsible for dispose its memory. */ > 1) under what circumstances I would hit the ovs_assert() below. If 'schmas' is empty, this is not expected by the function. > 2) what happens with schemap in case of error. *schemap will be set to NULL. > 3) what does return value imply about error? What do you mean? It is of type ovsdb_error which is standard. > >> +struct ovsdb_error * >> +ovsdb_schemata_join(const struct shash *schemata, struct ovsdb_schema >> **schemap) > > I would rename schemap to dst_schema or joined_schema (especially if you > will rename schemata to schemas). > Make sense. Will do. > > >> >> +{ >> + struct shash_node *first_node = shash_first(schemata), *node; >> + struct ovsdb_schema *schema; >> + struct ovsdb_error *error; >> + >> + ovs_assert(first_node); >> + schema = ovsdb_schema_clone(first_node->data); >> + >> + SHASH_FOR_EACH (node, schemata) { >> + struct ovsdb_schema *s = node->data; >> + >> + if (node != first_node) { >> + error = ovsdb_schema_join(schema, s); >> + >> + if (error) { >> >> + goto err; >> + } >> + } >> + } >> + >> + *schemap = schema; >> + return NULL; >> + >> +err: >> + ovsdb_schema_destroy(schema); >> + *schemap = NULL; >> + return error; >> +} >> + >> +void >> +ovsdb_schemata_destroy(struct shash *schemata) >> +{ >> + struct shash_node *node, *next; >> + >> + SHASH_FOR_EACH_SAFE (node, next, schemata) { >> + struct ovsdb_schema *schema = node->data; >> + >> + shash_delete(schemata, node); >> + ovsdb_schema_destroy(schema); >> + } >> + shash_destroy(schemata); >> +} >> + >> +struct ovsdb_error * >> +ovsdb_schemata_from_files(struct sset *files, struct shash *schemata)' > > Minor. How about "ovsdb_load_schemas[_from_files](...)" >> Sounds good, for consistency with functions around it, I will probably use ovsdb_schmeas_load() >> +{ >> + const char *filename; >> + >> + ovs_assert(schemata); >> + ovs_assert(ovsdb_schemata_is_empty(schemata)); > > Also, because of these asserts I would recommend you to document how this > function is supposed to be used. To address other comments you have, I will change the API to use a double pointer, as struct shash **schemas. Sure, will add comments to this function. > > I personally prefer to avoid asserts to "verify" function API usage, but I > don't think there is agreement in CodyingStyle.md. I can remove the asserts with the API change. > >> + >> + SSET_FOR_EACH(filename, files) { >> + struct ovsdb_schema *schema; >> + struct ovsdb_error *err; >> + >> + err = ovsdb_schema_from_file(filename, &schema); >> + if (err) { > > This function's API is lacking "symmetry" (this is an abstract term when > creating something and deleting does not happen in a consistent way): > 1. caller creates and provides shash > 2. you free it in ovsdb_schemata_destroy() in case of error. > The API change should address this -- it will only free the memory allocated within this function. > If there really is a reason why this function should free shash then at > least document that. > >> + ovsdb_schemata_destroy(schemata); >> + return err; >> + } >> + shash_add(schemata, schema->name, schema); > > What happens if one passes duplicate file names in 'files'? sset_add will remove that duplication. We probably should not allow schema name duplication either. I will use shash_add_once in stead shash_add here. >> >> + } >> + >> + return NULL; >> +} >> + >> +struct json * >> +ovsdb_schemata_to_json(const struct shash *schemata) >> +{ >> + switch (shash_count(schemata)) { >> + case 0: >> + return NULL; >> + >> + case 1: >> + { >> + struct shash_node *node; >> + struct ovsdb_schema *schema; >> + >> + node = shash_first(schemata); >> + schema = node->data; >> + >> + return ovsdb_schema_to_json(schema); >> + } >> + >> + default: >> + { >> + struct json *json_schemata; >> + struct shash_node *node; >> + >> + json_schemata = json_array_create_empty(); >> + SHASH_FOR_EACH (node, schemata) { >> + struct ovsdb_schema *schema = node->data; >> + json_array_add(json_schemata, >> ovsdb_schema_to_json(schema)); >> + } >> + return json_schemata; >> + } >> + } >> +} >> + >> +struct ovsdb_error * >> +ovsdb_schemata_from_json(struct json *json, struct shash *schemata) >> +{ >> + struct ovsdb_schema *schema; >> + struct ovsdb_error *err; >> + >> + ovs_assert(ovsdb_schemata_is_empty(schemata)); >> + >> + switch (json->type) { >> + case JSON_OBJECT: >> + err = ovsdb_schema_from_json(json, &schema); >> + if (err) { >> + goto error; >> + } >> + shash_add(schemata, schema->name, schema); >> + break; >> + >> + case JSON_ARRAY: >> + { >> + struct json_array *array = json_array(json); >> + size_t i; >> + >> + for(i = 0; i < array->n; i++) { >> + err = ovsdb_schema_from_json(array->elems[i], &schema); >> + >> + if (err) { >> + goto error; >> + } >> + shash_add(schemata, schema->name, schema); >> + } >> + } >> + break; >> + >> + case JSON_NULL: >> + case JSON_FALSE: >> + case JSON_TRUE: >> + case JSON_INTEGER: >> + case JSON_REAL: >> + case JSON_STRING: >> + case JSON_N_TYPES: >> + default: >> + OVS_NOT_REACHED(); >> + } >> + >> + return NULL; >> + >> +error: >> + ovsdb_schemata_destroy(schemata); > > Same here, caller only by looking into err can find out whether this > function released shash in ovsdb_schemata_destroy(). >> Will apply the same API change to this functions as well. >> + >> + return err; >> +} >> diff --git a/ovsdb/ovsdb.h b/ovsdb/ovsdb.h >> index 215e046..e3f3b1e 100644 >> --- a/ovsdb/ovsdb.h >> +++ b/ovsdb/ovsdb.h >> @@ -1,4 +1,4 @@ >> -/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc. >> +/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2015 Nicira, Inc. >> * >> * Licensed under the Apache License, Version 2.0 (the "License"); >> * you may not use this file except in compliance with the License. >> @@ -51,6 +51,38 @@ struct ovsdb_error *ovsdb_schema_from_json(struct json >> *, >> OVS_WARN_UNUSED_RESULT; >> struct json *ovsdb_schema_to_json(const struct ovsdb_schema *); >> >> +/* Multiple schemas. */ >> +struct ovsdb_error *ovsdb_schemata_from_files(struct sset *files, >> + struct shash* schemata); >> +void ovsdb_schemata_destroy(struct shash *schemata); >> +struct ovsdb_error * ovsdb_schemata_from_files(struct sset *files, >> + struct shash *schemata) >> + OVS_WARN_UNUSED_RESULT; >> +struct json *ovsdb_schemata_to_json(const struct shash *schmata); >> +struct ovsdb_error * ovsdb_schemata_from_json(struct json *json, >> + struct shash *schemata) >> + OVS_WARN_UNUSED_RESULT; >> +struct ovsdb_error *ovsdb_schemata_join(const struct shash *schemata, >> + struct ovsdb_schema **schema) >> + OVS_WARN_UNUSED_RESULT; >> + >> +static inline bool >> +ovsdb_schemata_is_empty(const struct shash *schemata) >> +{ >> + return (!shash_count(schemata)); >> +} >> + >> +static inline bool >> +ovsdb_schemata_is_null_or_empty(const struct shash *schemata) >> +{ >> + return (!schemata || ovsdb_schemata_is_empty(schemata)); >> +} >> + >> +static inline bool >> +ovsdb_schemata_is_non_empty(const struct shash *schemata) >> +{ >> + return (schemata && !ovsdb_schemata_is_empty(schemata)); >> +} >> >> bool ovsdb_schema_equal(const struct ovsdb_schema *, >> const struct ovsdb_schema *); >> -- >> 1.9.1 >> >> _______________________________________________ >> dev mailing list >> dev@openvswitch.org >> http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev