ovsdb: add conditions utilities to support monitor_cond
[cascardo/ovs.git] / ovsdb / condition.h
index 620757f..443c8ee 100644 (file)
 #include <stddef.h>
 #include "compiler.h"
 #include "ovsdb-data.h"
+#include "bitmap.h"
 
 struct json;
 struct ovsdb_table_schema;
 struct ovsdb_row;
 
-/* These list is ordered in ascending order of the fraction of tables row that
- * they are (heuristically) expected to leave in query results. */
+/* These list is ordered first with boolean functions and then in
+ * ascending order of the fraction of tables row that they are
+ * (heuristically) expected to leave in query results. */
 #define OVSDB_FUNCTIONS                         \
+    OVSDB_FUNCTION(OVSDB_F_FALSE, "false")            \
+    OVSDB_FUNCTION(OVSDB_F_TRUE, "true")              \
     OVSDB_FUNCTION(OVSDB_F_EQ, "==")                  \
     OVSDB_FUNCTION(OVSDB_F_INCLUDES, "includes")      \
     OVSDB_FUNCTION(OVSDB_F_LE, "<=")                  \
@@ -40,6 +44,7 @@ enum ovsdb_function {
 #define OVSDB_FUNCTION(ENUM, NAME) ENUM,
     OVSDB_FUNCTIONS
 #undef OVSDB_FUNCTION
+    OVSDB_F_LAST = OVSDB_F_NE
 };
 
 struct ovsdb_error *ovsdb_function_from_string(const char *,
@@ -50,6 +55,7 @@ const char *ovsdb_function_to_string(enum ovsdb_function);
 struct ovsdb_clause {
     enum ovsdb_function function;
     const struct ovsdb_column *column;
+    unsigned int index;
     struct ovsdb_datum arg;
 };
 
@@ -58,15 +64,38 @@ struct ovsdb_condition {
     size_t n_clauses;
 };
 
-#define OVSDB_CONDITION_INITIALIZER { NULL, 0 }
+#define OVSDB_CONDITION_INITIALIZER { NULL, 0}
 
+void ovsdb_condition_init(struct ovsdb_condition *);
+bool ovsdb_condition_empty(const struct ovsdb_condition *);
 struct ovsdb_error *ovsdb_condition_from_json(
     const struct ovsdb_table_schema *,
     const struct json *, struct ovsdb_symbol_table *,
     struct ovsdb_condition *) OVS_WARN_UNUSED_RESULT;
 struct json *ovsdb_condition_to_json(const struct ovsdb_condition *);
 void ovsdb_condition_destroy(struct ovsdb_condition *);
-bool ovsdb_condition_evaluate(const struct ovsdb_row *,
-                              const struct ovsdb_condition *);
+bool ovsdb_condition_match_every_clause(const struct ovsdb_row *,
+                                        const struct ovsdb_condition *);
+bool ovsdb_condition_match_any_clause(const struct ovsdb_datum *,
+                                      const struct ovsdb_condition *,
+                                      unsigned int index_map[]);
+int ovsdb_condition_cmp_3way(const struct ovsdb_condition *a,
+                             const struct ovsdb_condition *b);
+void ovsdb_condition_clone(struct ovsdb_condition *to,
+                           const struct ovsdb_condition *from);
+bool ovsdb_condition_is_true(const struct ovsdb_condition *cond);
+bool ovsdb_condition_is_false(const struct ovsdb_condition *cond);
+const struct ovsdb_column **
+ovsdb_condition_get_columns(const struct ovsdb_condition *cond,
+                            size_t *n_columns);
+
+static inline bool
+ovsdb_condition_empty_or_match_any(const struct ovsdb_datum *row_datum,
+                                   const struct ovsdb_condition *cnd,
+                                   unsigned int index_map[])
+{
+    return (ovsdb_condition_empty(cnd) ||
+            ovsdb_condition_match_any_clause(row_datum, cnd, index_map));
+}
 
 #endif /* ovsdb/condition.h */