aboutsummaryrefslogtreecommitdiff
path: root/lib/ovsdb-data.h
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2010-01-25 10:08:57 -0800
committerBen Pfaff <blp@nicira.com>2010-01-26 09:49:30 -0800
commit2f47998baea215b996af0be4d1653032005e3ac4 (patch)
tree54c365a5e3ddb8015547b39c13e90ac0a52eae00 /lib/ovsdb-data.h
parent979821c0a6b0c8a9f941a2e13c49feffe2391ab8 (diff)
ovsdb-data: Add some more functions for dealing with "struct ovsdb_datum".
This commit refactors the functions for working with "struct ovsdb_datum", adding and exposing some more operations for ovs-vsctl to use in an upcoming commit.
Diffstat (limited to 'lib/ovsdb-data.h')
-rw-r--r--lib/ovsdb-data.h53
1 files changed, 42 insertions, 11 deletions
diff --git a/lib/ovsdb-data.h b/lib/ovsdb-data.h
index 6ee5f9ac..9cada2f4 100644
--- a/lib/ovsdb-data.h
+++ b/lib/ovsdb-data.h
@@ -75,18 +75,23 @@ struct json *ovsdb_atom_to_json(const union ovsdb_atom *,
/* An instance of an OVSDB type (given by struct ovsdb_type).
*
- * 'n' is constrained by the ovsdb_type's 'n_min' and 'n_max'.
+ * - The 'keys' must be unique and in sorted order. Most functions that modify
+ * an ovsdb_datum maintain these invariants. Functions that don't maintain
+ * the invariants have names that end in "_unsafe". Use ovsdb_datum_sort()
+ * to check and restore these invariants.
*
- * If 'n' is nonzero, then 'keys' points to an array of 'n' atoms of the type
- * specified by the ovsdb_type's 'key_type'. (Otherwise, 'keys' should be
- * null.)
+ * - 'n' is constrained by the ovsdb_type's 'n_min' and 'n_max'.
*
- * If 'n' is nonzero and the ovsdb_type's 'value_type' is not OVSDB_TYPE_VOID,
- * then 'values' points to an array of 'n' atoms of the type specified by the
- * 'value_type'. (Otherwise, 'values' should be null.)
+ * If 'n' is nonzero, then 'keys' points to an array of 'n' atoms of the type
+ * specified by the ovsdb_type's 'key_type'. (Otherwise, 'keys' should be
+ * null.)
*
- * Thus, for 'n' > 0, 'keys' will always be nonnull and 'values' will be
- * nonnull only for "map" types.
+ * If 'n' is nonzero and the ovsdb_type's 'value_type' is not
+ * OVSDB_TYPE_VOID, then 'values' points to an array of 'n' atoms of the type
+ * specified by the 'value_type'. (Otherwise, 'values' should be null.)
+ *
+ * Thus, for 'n' > 0, 'keys' will always be nonnull and 'values' will be
+ * nonnull only for "map" types.
*/
struct ovsdb_datum {
unsigned int n; /* Number of 'keys' and 'values'. */
@@ -94,6 +99,8 @@ struct ovsdb_datum {
union ovsdb_atom *values; /* Each of the ovsdb_type's 'value_type'. */
};
+/* Basics. */
+void ovsdb_datum_init_empty(struct ovsdb_datum *);
void ovsdb_datum_init_default(struct ovsdb_datum *, const struct ovsdb_type *);
bool ovsdb_datum_is_default(const struct ovsdb_datum *,
const struct ovsdb_type *);
@@ -101,9 +108,12 @@ void ovsdb_datum_clone(struct ovsdb_datum *, const struct ovsdb_datum *,
const struct ovsdb_type *);
void ovsdb_datum_destroy(struct ovsdb_datum *, const struct ovsdb_type *);
void ovsdb_datum_swap(struct ovsdb_datum *, struct ovsdb_datum *);
+
+/* Checking and maintaining invariants. */
struct ovsdb_error *ovsdb_datum_sort(struct ovsdb_datum *,
const struct ovsdb_type *);
+/* Type conversion. */
struct ovsdb_error *ovsdb_datum_from_json(struct ovsdb_datum *,
const struct ovsdb_type *,
const struct json *,
@@ -120,21 +130,42 @@ int ovsdb_datum_compare_3way(const struct ovsdb_datum *,
bool ovsdb_datum_equals(const struct ovsdb_datum *,
const struct ovsdb_datum *,
const struct ovsdb_type *);
+
+/* Search. */
+unsigned int ovsdb_datum_find_key(const struct ovsdb_datum *,
+ const union ovsdb_atom *key,
+ enum ovsdb_atomic_type key_type);
+unsigned int ovsdb_datum_find_key_value(const struct ovsdb_datum *,
+ const union ovsdb_atom *key,
+ enum ovsdb_atomic_type key_type,
+ const union ovsdb_atom *value,
+ enum ovsdb_atomic_type value_type);
+
+/* Set operations. */
bool ovsdb_datum_includes_all(const struct ovsdb_datum *,
const struct ovsdb_datum *,
const struct ovsdb_type *);
bool ovsdb_datum_excludes_all(const struct ovsdb_datum *,
const struct ovsdb_datum *,
const struct ovsdb_type *);
-
void ovsdb_datum_union(struct ovsdb_datum *,
const struct ovsdb_datum *,
- const struct ovsdb_type *);
+ const struct ovsdb_type *,
+ bool replace);
void ovsdb_datum_subtract(struct ovsdb_datum *a,
const struct ovsdb_type *a_type,
const struct ovsdb_datum *b,
const struct ovsdb_type *b_type);
+/* Raw operations that may not maintain the invariants. */
+void ovsdb_datum_remove_unsafe(struct ovsdb_datum *, size_t idx,
+ const struct ovsdb_type *);
+void ovsdb_datum_add_unsafe(struct ovsdb_datum *,
+ const union ovsdb_atom *key,
+ const union ovsdb_atom *value,
+ const struct ovsdb_type *);
+
+/* Type checking. */
static inline bool
ovsdb_datum_conforms_to_type(const struct ovsdb_datum *datum,
const struct ovsdb_type *type)