X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ovsdb%2Fcondition.c;h=8e67c889853b889e4e8aa8afd25d5cf27f9389d9;hb=c5cf10598f8c9f4428291e9df3ecd72a05fb1ccf;hp=abd793642d520fedbc1403725a96b3f2acba2333;hpb=bd76d25d8b3b7d11c5a326e91d784ad2cdeecd45;p=sliver-openvswitch.git diff --git a/ovsdb/condition.c b/ovsdb/condition.c index abd793642..8e67c8898 100644 --- a/ovsdb/condition.c +++ b/ovsdb/condition.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010 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; @@ -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;