]>
Commit | Line | Data |
---|---|---|
e0edde6f | 1 | /* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. |
f85f8ebb BP |
2 | * |
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: | |
6 | * | |
7 | * http://www.apache.org/licenses/LICENSE-2.0 | |
8 | * | |
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. | |
14 | */ | |
15 | ||
16 | #ifndef OVSDB_ROW_H | |
17 | #define OVSDB_ROW_H 1 | |
18 | ||
19 | #include <stddef.h> | |
20 | #include <stdint.h> | |
21 | #include "column.h" | |
22 | #include "hmap.h" | |
7360012b | 23 | #include "list.h" |
f85f8ebb BP |
24 | #include "ovsdb-data.h" |
25 | ||
26 | struct ovsdb_column_set; | |
27 | ||
7360012b BP |
28 | /* A weak reference. |
29 | * | |
30 | * When a column in row A contains a weak reference to UUID of a row B this | |
31 | * constitutes a weak reference from A (the source) to B (the destination). | |
32 | * | |
33 | * Rows A and B may be in the same table or different tables. | |
34 | * | |
35 | * Weak references from a row to itself are allowed, but no "struct | |
36 | * ovsdb_weak_ref" structures are created for them. | |
37 | */ | |
38 | struct ovsdb_weak_ref { | |
ca6ba700 TG |
39 | struct ovs_list src_node; /* In src->src_refs list. */ |
40 | struct ovs_list dst_node; /* In destination row's dst_refs list. */ | |
7360012b BP |
41 | struct ovsdb_row *src; /* Source row. */ |
42 | }; | |
43 | ||
f85f8ebb BP |
44 | /* A row in a database table. */ |
45 | struct ovsdb_row { | |
7360012b | 46 | struct hmap_node hmap_node; /* Element in ovsdb_table's 'rows' hmap. */ |
6e492d81 | 47 | struct ovsdb_table *table; /* Table to which this belongs. */ |
f85f8ebb | 48 | struct ovsdb_txn_row *txn_row; /* Transaction that row is in, if any. */ |
0d0f05b9 | 49 | |
7360012b | 50 | /* Weak references. */ |
ca6ba700 TG |
51 | struct ovs_list src_refs; /* Weak references from this row. */ |
52 | struct ovs_list dst_refs; /* Weak references to this row. */ | |
7360012b BP |
53 | |
54 | /* Number of strong refs to this row from other rows, in this table or | |
55 | * other tables, through 'uuid' columns that have a 'refTable' constraint | |
56 | * pointing to this table and a 'refType' of "strong". A row with nonzero | |
57 | * 'n_refs' cannot be deleted. Updated and checked only at transaction | |
58 | * commit. */ | |
0d0f05b9 BP |
59 | size_t n_refs; |
60 | ||
6910a6e6 BP |
61 | /* One datum for each column (shash_count(&table->schema->columns) |
62 | * elements). */ | |
f85f8ebb | 63 | struct ovsdb_datum fields[]; |
6910a6e6 BP |
64 | |
65 | /* Followed by table->schema->n_indexes "struct hmap_node"s. In rows that | |
66 | * have have been committed as part of the database, the hmap_node with | |
67 | * index 'i' is contained in hmap table->indexes[i]. */ | |
f85f8ebb BP |
68 | }; |
69 | ||
70 | struct ovsdb_row *ovsdb_row_create(const struct ovsdb_table *); | |
71 | struct ovsdb_row *ovsdb_row_clone(const struct ovsdb_row *); | |
72 | void ovsdb_row_destroy(struct ovsdb_row *); | |
73 | ||
74 | uint32_t ovsdb_row_hash_columns(const struct ovsdb_row *, | |
75 | const struct ovsdb_column_set *, | |
76 | uint32_t basis); | |
77 | bool ovsdb_row_equal_columns(const struct ovsdb_row *, | |
78 | const struct ovsdb_row *, | |
79 | const struct ovsdb_column_set *); | |
80 | int ovsdb_row_compare_columns_3way(const struct ovsdb_row *, | |
81 | const struct ovsdb_row *, | |
82 | const struct ovsdb_column_set *); | |
83 | void ovsdb_row_update_columns(struct ovsdb_row *, const struct ovsdb_row *, | |
84 | const struct ovsdb_column_set *); | |
25d49835 BP |
85 | void ovsdb_row_columns_to_string(const struct ovsdb_row *, |
86 | const struct ovsdb_column_set *, struct ds *); | |
f85f8ebb BP |
87 | struct ovsdb_error *ovsdb_row_from_json(struct ovsdb_row *, |
88 | const struct json *, | |
fbf925e4 | 89 | struct ovsdb_symbol_table *, |
f85f8ebb | 90 | struct ovsdb_column_set *included) |
cab50449 | 91 | OVS_WARN_UNUSED_RESULT; |
f85f8ebb BP |
92 | struct json *ovsdb_row_to_json(const struct ovsdb_row *, |
93 | const struct ovsdb_column_set *include); | |
94 | ||
95 | static inline const struct uuid * | |
96 | ovsdb_row_get_uuid(const struct ovsdb_row *row) | |
97 | { | |
98 | return &row->fields[OVSDB_COL_UUID].keys[0].uuid; | |
99 | } | |
100 | ||
101 | static inline struct uuid * | |
102 | ovsdb_row_get_uuid_rw(struct ovsdb_row *row) | |
103 | { | |
104 | return &row->fields[OVSDB_COL_UUID].keys[0].uuid; | |
105 | } | |
106 | ||
107 | static inline const struct uuid * | |
108 | ovsdb_row_get_version(const struct ovsdb_row *row) | |
109 | { | |
110 | return &row->fields[OVSDB_COL_VERSION].keys[0].uuid; | |
111 | } | |
112 | ||
113 | static inline struct uuid * | |
114 | ovsdb_row_get_version_rw(struct ovsdb_row *row) | |
115 | { | |
116 | return &row->fields[OVSDB_COL_VERSION].keys[0].uuid; | |
117 | } | |
118 | ||
119 | static inline uint32_t | |
120 | ovsdb_row_hash(const struct ovsdb_row *row) | |
121 | { | |
122 | return uuid_hash(ovsdb_row_get_uuid(row)); | |
123 | } | |
124 | \f | |
125 | /* An unordered collection of rows. */ | |
126 | struct ovsdb_row_set { | |
127 | const struct ovsdb_row **rows; | |
128 | size_t n_rows, allocated_rows; | |
129 | }; | |
130 | ||
131 | #define OVSDB_ROW_SET_INITIALIZER { NULL, 0, 0 } | |
132 | ||
133 | void ovsdb_row_set_init(struct ovsdb_row_set *); | |
134 | void ovsdb_row_set_destroy(struct ovsdb_row_set *); | |
135 | void ovsdb_row_set_add_row(struct ovsdb_row_set *, const struct ovsdb_row *); | |
136 | ||
137 | struct json *ovsdb_row_set_to_json(const struct ovsdb_row_set *, | |
138 | const struct ovsdb_column_set *); | |
139 | ||
140 | void ovsdb_row_set_sort(struct ovsdb_row_set *, | |
141 | const struct ovsdb_column_set *); | |
142 | \f | |
143 | /* A hash table of rows. A specified set of columns is used for hashing and | |
144 | * comparing rows. | |
145 | * | |
146 | * The row hash doesn't necessarily own its rows. They may be owned by, for | |
147 | * example, an ovsdb_table. */ | |
148 | struct ovsdb_row_hash { | |
149 | struct hmap rows; | |
150 | struct ovsdb_column_set columns; | |
151 | }; | |
152 | ||
153 | #define OVSDB_ROW_HASH_INITIALIZER(RH) \ | |
154 | { HMAP_INITIALIZER(&(RH).rows), OVSDB_COLUMN_SET_INITIALIZER } | |
155 | ||
156 | struct ovsdb_row_hash_node { | |
157 | struct hmap_node hmap_node; | |
158 | const struct ovsdb_row *row; | |
159 | }; | |
160 | ||
161 | void ovsdb_row_hash_init(struct ovsdb_row_hash *, | |
162 | const struct ovsdb_column_set *); | |
163 | void ovsdb_row_hash_destroy(struct ovsdb_row_hash *, bool destroy_rows); | |
164 | size_t ovsdb_row_hash_count(const struct ovsdb_row_hash *); | |
165 | bool ovsdb_row_hash_contains(const struct ovsdb_row_hash *, | |
166 | const struct ovsdb_row *); | |
167 | bool ovsdb_row_hash_contains_all(const struct ovsdb_row_hash *, | |
168 | const struct ovsdb_row_hash *); | |
169 | bool ovsdb_row_hash_insert(struct ovsdb_row_hash *, const struct ovsdb_row *); | |
170 | bool ovsdb_row_hash_contains__(const struct ovsdb_row_hash *, | |
171 | const struct ovsdb_row *, size_t hash); | |
172 | bool ovsdb_row_hash_insert__(struct ovsdb_row_hash *, | |
173 | const struct ovsdb_row *, size_t hash); | |
174 | ||
175 | #endif /* ovsdb/row.h */ |