X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ovsdb%2Fcondition.c;h=8e67c889853b889e4e8aa8afd25d5cf27f9389d9;hb=HEAD;hp=59f742c952be91a90600e831819520ee32b7c726;hpb=c69ee87c10818267f991236201150b1fa51ae519;p=sliver-openvswitch.git diff --git a/ovsdb/condition.c b/ovsdb/condition.c index 59f742c95..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. @@ -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;