1 /* Copyright (c) 2009, 2010, 2011 Nicira, Inc.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
17 #define OVSDB_TYPES_H 1
31 /* An atomic type: one that OVSDB regards as a single unit of data. */
32 enum ovsdb_atomic_type
{
33 OVSDB_TYPE_VOID
, /* No value. */
34 OVSDB_TYPE_INTEGER
, /* Signed 64-bit integer. */
35 OVSDB_TYPE_REAL
, /* IEEE 754 double-precision floating point. */
36 OVSDB_TYPE_BOOLEAN
, /* True or false. */
37 OVSDB_TYPE_STRING
, /* UTF-8 string. */
38 OVSDB_TYPE_UUID
, /* RFC 4122 UUID referencing a table row. */
42 static inline bool ovsdb_atomic_type_is_valid(enum ovsdb_atomic_type
);
43 bool ovsdb_atomic_type_from_string(const char *, enum ovsdb_atomic_type
*);
44 struct ovsdb_error
*ovsdb_atomic_type_from_json(enum ovsdb_atomic_type
*,
46 const char *ovsdb_atomic_type_to_string(enum ovsdb_atomic_type
);
47 struct json
*ovsdb_atomic_type_to_json(enum ovsdb_atomic_type
);
49 /* An atomic type plus optional constraints. */
52 OVSDB_REF_STRONG
, /* Target must exist. */
53 OVSDB_REF_WEAK
/* Delete reference if target disappears. */
56 struct ovsdb_integer_constraints
{
57 int64_t min
; /* minInteger or INT64_MIN. */
58 int64_t max
; /* maxInteger or INT64_MAX. */
61 struct ovsdb_real_constraints
{
62 double min
; /* minReal or -DBL_MAX. */
63 double max
; /* minReal or DBL_MAX. */
66 struct ovsdb_string_constraints
{
67 unsigned int minLen
; /* minLength or 0. */
68 unsigned int maxLen
; /* maxLength or UINT_MAX. */
71 struct ovsdb_uuid_constraints
{
72 char *refTableName
; /* Name of referenced table, or NULL. */
73 struct ovsdb_table
*refTable
; /* Referenced table, if available. */
74 enum ovsdb_ref_type refType
; /* Reference type. */
77 struct ovsdb_base_type
{
78 enum ovsdb_atomic_type type
;
80 /* If nonnull, a datum with keys of type 'type' that expresses all the
81 * valid values for this base_type. */
82 struct ovsdb_datum
*enum_
;
85 struct ovsdb_integer_constraints integer
;
86 struct ovsdb_real_constraints real
;
87 /* No constraints for Boolean types. */
88 struct ovsdb_string_constraints string
;
89 struct ovsdb_uuid_constraints uuid
;
93 #define OVSDB_BASE_VOID_INIT { .type = OVSDB_TYPE_VOID }
94 #define OVSDB_BASE_INTEGER_INIT { .type = OVSDB_TYPE_INTEGER, \
95 .integer = { INT64_MIN, INT64_MAX } }
96 #define OVSDB_BASE_REAL_INIT { .type = OVSDB_TYPE_REAL, \
97 .real = { -DBL_MAX, DBL_MAX } }
98 #define OVSDB_BASE_BOOLEAN_INIT { .type = OVSDB_TYPE_BOOLEAN }
99 #define OVSDB_BASE_STRING_INIT { .type = OVSDB_TYPE_STRING, \
100 .string = { 0, UINT_MAX } }
101 #define OVSDB_BASE_UUID_INIT { .type = OVSDB_TYPE_UUID, \
102 .uuid = { NULL, NULL, 0 } }
104 void ovsdb_base_type_init(struct ovsdb_base_type
*, enum ovsdb_atomic_type
);
105 void ovsdb_base_type_clone(struct ovsdb_base_type
*,
106 const struct ovsdb_base_type
*);
107 void ovsdb_base_type_destroy(struct ovsdb_base_type
*);
109 bool ovsdb_base_type_is_valid(const struct ovsdb_base_type
*);
110 bool ovsdb_base_type_has_constraints(const struct ovsdb_base_type
*);
111 void ovsdb_base_type_clear_constraints(struct ovsdb_base_type
*);
112 const struct ovsdb_type
*ovsdb_base_type_get_enum_type(enum ovsdb_atomic_type
);
114 struct ovsdb_error
*ovsdb_base_type_from_json(struct ovsdb_base_type
*,
116 OVS_WARN_UNUSED_RESULT
;
117 struct json
*ovsdb_base_type_to_json(const struct ovsdb_base_type
*);
119 static inline bool ovsdb_base_type_is_ref(const struct ovsdb_base_type
*);
120 static inline bool ovsdb_base_type_is_strong_ref(
121 const struct ovsdb_base_type
*);
122 static inline bool ovsdb_base_type_is_weak_ref(const struct ovsdb_base_type
*);
126 * Several rules constrain the valid types. See ovsdb_type_is_valid() (in
127 * ovsdb-types.c) for details.
129 * If 'value_type' is OVSDB_TYPE_VOID, 'n_min' is 1, and 'n_max' is 1, then the
130 * type is a single atomic 'key_type'.
132 * If 'value_type' is OVSDB_TYPE_VOID and 'n_min' or 'n_max' (or both) has a
133 * value other than 1, then the type is a set of 'key_type'. If 'n_min' is 0
134 * and 'n_max' is 1, then the type can also be considered an optional
137 * If 'value_type' is not OVSDB_TYPE_VOID, then the type is a map from
138 * 'key_type' to 'value_type'. If 'n_min' is 0 and 'n_max' is 1, then the type
139 * can also be considered an optional pair of 'key_type' and 'value_type'.
142 struct ovsdb_base_type key
;
143 struct ovsdb_base_type value
;
145 unsigned int n_max
; /* UINT_MAX stands in for "unlimited". */
148 #define OVSDB_TYPE_SCALAR_INITIALIZER(KEY) { KEY, OVSDB_BASE_VOID_INIT, 1, 1 }
150 extern const struct ovsdb_type ovsdb_type_integer
;
151 extern const struct ovsdb_type ovsdb_type_real
;
152 extern const struct ovsdb_type ovsdb_type_boolean
;
153 extern const struct ovsdb_type ovsdb_type_string
;
154 extern const struct ovsdb_type ovsdb_type_uuid
;
156 void ovsdb_type_clone(struct ovsdb_type
*, const struct ovsdb_type
*);
157 void ovsdb_type_destroy(struct ovsdb_type
*);
159 bool ovsdb_type_is_valid(const struct ovsdb_type
*);
161 static inline bool ovsdb_type_is_scalar(const struct ovsdb_type
*);
162 static inline bool ovsdb_type_is_optional(const struct ovsdb_type
*);
163 static inline bool ovsdb_type_is_optional_scalar(
164 const struct ovsdb_type
*);
165 static inline bool ovsdb_type_is_composite(const struct ovsdb_type
*);
166 static inline bool ovsdb_type_is_set(const struct ovsdb_type
*);
167 static inline bool ovsdb_type_is_map(const struct ovsdb_type
*);
169 char *ovsdb_type_to_english(const struct ovsdb_type
*);
171 struct ovsdb_error
*ovsdb_type_from_json(struct ovsdb_type
*,
173 OVS_WARN_UNUSED_RESULT
;
174 struct json
*ovsdb_type_to_json(const struct ovsdb_type
*);
176 /* Inline function implementations. */
179 ovsdb_atomic_type_is_valid(enum ovsdb_atomic_type atomic_type
)
181 return (int) atomic_type
>= 0 && atomic_type
< OVSDB_N_TYPES
;
185 ovsdb_base_type_is_ref(const struct ovsdb_base_type
*base
)
187 return base
->type
== OVSDB_TYPE_UUID
&& base
->uuid
.refTableName
;
191 ovsdb_base_type_is_strong_ref(const struct ovsdb_base_type
*base
)
193 return (ovsdb_base_type_is_ref(base
)
194 && base
->uuid
.refType
== OVSDB_REF_STRONG
);
198 ovsdb_base_type_is_weak_ref(const struct ovsdb_base_type
*base
)
200 return (ovsdb_base_type_is_ref(base
)
201 && base
->uuid
.refType
== OVSDB_REF_WEAK
);
204 static inline bool ovsdb_type_is_scalar(const struct ovsdb_type
*type
)
206 return (type
->value
.type
== OVSDB_TYPE_VOID
207 && type
->n_min
== 1 && type
->n_max
== 1);
210 static inline bool ovsdb_type_is_optional(const struct ovsdb_type
*type
)
212 return type
->n_min
== 0;
215 static inline bool ovsdb_type_is_optional_scalar(
216 const struct ovsdb_type
*type
)
218 return (type
->value
.type
== OVSDB_TYPE_VOID
219 && type
->n_min
== 0 && type
->n_max
== 1);
222 static inline bool ovsdb_type_is_composite(const struct ovsdb_type
*type
)
224 return type
->n_max
> 1;
227 static inline bool ovsdb_type_is_set(const struct ovsdb_type
*type
)
229 return (type
->value
.type
== OVSDB_TYPE_VOID
230 && (type
->n_min
!= 1 || type
->n_max
!= 1));
233 static inline bool ovsdb_type_is_map(const struct ovsdb_type
*type
)
235 return type
->value
.type
!= OVSDB_TYPE_VOID
;
242 #endif /* ovsdb-types.h */