X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ovsdb%2Fcondition.c;h=8e67c889853b889e4e8aa8afd25d5cf27f9389d9;hb=c5cf10598f8c9f4428291e9df3ecd72a05fb1ccf;hp=f3f43003a232fe317388a2ce650e3cbaf763aaba;hpb=e9f8f9367e9e654b9582279608af86ea3744a2a0;p=sliver-openvswitch.git diff --git a/ovsdb/condition.c b/ovsdb/condition.c index f3f43003a..8e67c8898 100644 --- a/ovsdb/condition.c +++ b/ovsdb/condition.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009 Nicira Networks +/* Copyright (c) 2009, 2010, 2011 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,7 +55,7 @@ ovsdb_function_to_string(enum ovsdb_function function) static WARN_UNUSED_RESULT struct ovsdb_error * ovsdb_clause_from_json(const struct ovsdb_table_schema *ts, const struct json *json, - const struct ovsdb_symbol_table *symtab, + struct ovsdb_symbol_table *symtab, struct ovsdb_clause *clause) { const struct json_array *array; @@ -97,8 +97,8 @@ ovsdb_clause_from_json(const struct ovsdb_table_schema *ts, * n_max == 1? (They would always be "false" if the value was * missing.) */ if (!ovsdb_type_is_scalar(&type) - || (type.key_type != OVSDB_TYPE_INTEGER - && type.key_type != OVSDB_TYPE_REAL)) { + || (type.key.type != OVSDB_TYPE_INTEGER + && type.key.type != OVSDB_TYPE_REAL)) { char *s = ovsdb_type_to_english(&type); error = ovsdb_syntax_error( json, NULL, "Type mismatch: \"%s\" operator may not be " @@ -167,7 +167,7 @@ compare_clauses_3way(const void *a_, const void *b_) struct ovsdb_error * ovsdb_condition_from_json(const struct ovsdb_table_schema *ts, const struct json *json, - const struct ovsdb_symbol_table *symtab, + struct ovsdb_symbol_table *symtab, struct ovsdb_condition *cnd) { const struct json_array *array = json_array(json); @@ -217,6 +217,54 @@ ovsdb_condition_to_json(const struct ovsdb_condition *cnd) return json_array_create(clauses, cnd->n_clauses); } +static bool +ovsdb_clause_evaluate(const struct ovsdb_row *row, + const struct ovsdb_clause *c) +{ + const struct ovsdb_datum *field = &row->fields[c->column->index]; + const struct ovsdb_datum *arg = &c->arg; + const struct ovsdb_type *type = &c->column->type; + + if (ovsdb_type_is_scalar(type)) { + int cmp = ovsdb_atom_compare_3way(&field->keys[0], &arg->keys[0], + type->key.type); + switch (c->function) { + case OVSDB_F_LT: + return cmp < 0; + case OVSDB_F_LE: + return cmp <= 0; + case OVSDB_F_EQ: + case OVSDB_F_INCLUDES: + return cmp == 0; + case OVSDB_F_NE: + case OVSDB_F_EXCLUDES: + return cmp != 0; + case OVSDB_F_GE: + return cmp >= 0; + case OVSDB_F_GT: + return cmp > 0; + } + } else { + switch (c->function) { + case OVSDB_F_EQ: + return ovsdb_datum_equals(field, arg, type); + case OVSDB_F_NE: + return !ovsdb_datum_equals(field, arg, type); + case OVSDB_F_INCLUDES: + return ovsdb_datum_includes_all(arg, field, type); + case OVSDB_F_EXCLUDES: + return ovsdb_datum_excludes_all(arg, field, type); + case OVSDB_F_LT: + case OVSDB_F_LE: + case OVSDB_F_GE: + case OVSDB_F_GT: + OVS_NOT_REACHED(); + } + } + + OVS_NOT_REACHED(); +} + bool ovsdb_condition_evaluate(const struct ovsdb_row *row, const struct ovsdb_condition *cnd) @@ -224,48 +272,9 @@ ovsdb_condition_evaluate(const struct ovsdb_row *row, size_t i; for (i = 0; i < cnd->n_clauses; i++) { - const struct ovsdb_clause *c = &cnd->clauses[i]; - const struct ovsdb_datum *field = &row->fields[c->column->index]; - const struct ovsdb_datum *arg = &cnd->clauses[i].arg; - const struct ovsdb_type *type = &c->column->type; - - if (ovsdb_type_is_scalar(type)) { - int cmp = ovsdb_atom_compare_3way(&field->keys[0], &arg->keys[0], - type->key_type); - switch (c->function) { - case OVSDB_F_LT: - return cmp < 0; - case OVSDB_F_LE: - return cmp <= 0; - case OVSDB_F_EQ: - case OVSDB_F_INCLUDES: - return cmp == 0; - case OVSDB_F_NE: - case OVSDB_F_EXCLUDES: - return cmp != 0; - case OVSDB_F_GE: - return cmp >= 0; - case OVSDB_F_GT: - return cmp > 0; - } - } else { - switch (c->function) { - case OVSDB_F_EQ: - return ovsdb_datum_equals(field, arg, type); - case OVSDB_F_NE: - return !ovsdb_datum_equals(field, arg, type); - case OVSDB_F_INCLUDES: - return ovsdb_datum_includes_all(arg, field, type); - case OVSDB_F_EXCLUDES: - return ovsdb_datum_excludes_all(arg, field, type); - case OVSDB_F_LT: - case OVSDB_F_LE: - case OVSDB_F_GE: - case OVSDB_F_GT: - NOT_REACHED(); - } + if (!ovsdb_clause_evaluate(row, &cnd->clauses[i])) { + return false; } - NOT_REACHED(); } return true;