]>
git.proxmox.com Git - mirror_ovs.git/blob - ovsdb/query.c
1 /* Copyright (c) 2009, 2010 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.
21 #include "condition.h"
26 ovsdb_query(struct ovsdb_table
*table
, const struct ovsdb_condition
*cnd
,
27 bool (*output_row
)(const struct ovsdb_row
*, void *aux
), void *aux
)
29 if (cnd
->n_clauses
> 0
30 && cnd
->clauses
[0].column
->index
== OVSDB_COL_UUID
31 && cnd
->clauses
[0].function
== OVSDB_F_EQ
) {
32 /* Optimize the case where the query has a clause of the form "uuid ==
33 * <some-uuid>", since we have an index on UUID. */
34 const struct ovsdb_row
*row
;
36 row
= ovsdb_table_get_row(table
, &cnd
->clauses
[0].arg
.keys
[0].uuid
);
37 if (row
&& row
->table
== table
&&
38 ovsdb_condition_match_every_clause(row
, cnd
)) {
43 const struct ovsdb_row
*row
, *next
;
45 HMAP_FOR_EACH_SAFE (row
, next
, hmap_node
, &table
->rows
) {
46 if (ovsdb_condition_match_every_clause(row
, cnd
) &&
47 !output_row(row
, aux
)) {
55 query_row_set_cb(const struct ovsdb_row
*row
, void *results_
)
57 struct ovsdb_row_set
*results
= results_
;
58 ovsdb_row_set_add_row(results
, row
);
63 ovsdb_query_row_set(struct ovsdb_table
*table
,
64 const struct ovsdb_condition
*condition
,
65 struct ovsdb_row_set
*results
)
67 ovsdb_query(table
, condition
, query_row_set_cb
, results
);
71 query_distinct_cb(const struct ovsdb_row
*row
, void *hash_
)
73 struct ovsdb_row_hash
*hash
= hash_
;
74 ovsdb_row_hash_insert(hash
, row
);
79 ovsdb_query_distinct(struct ovsdb_table
*table
,
80 const struct ovsdb_condition
*condition
,
81 const struct ovsdb_column_set
*columns
,
82 struct ovsdb_row_set
*results
)
84 if (!columns
|| ovsdb_column_set_contains(columns
, OVSDB_COL_UUID
)) {
85 /* All the result rows are guaranteed to be distinct anyway. */
86 ovsdb_query_row_set(table
, condition
, results
);
89 /* Use hash table to drop duplicates. */
90 struct ovsdb_row_hash_node
*node
;
91 struct ovsdb_row_hash hash
;
93 ovsdb_row_hash_init(&hash
, columns
);
94 ovsdb_query(table
, condition
, query_distinct_cb
, &hash
);
95 HMAP_FOR_EACH (node
, hmap_node
, &hash
.rows
) {
96 ovsdb_row_set_add_row(results
, node
->row
);
98 ovsdb_row_hash_destroy(&hash
, false);