X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=ovsdb%2Frow.c;h=e25f857aeed85b43a3aa21fb30e7aca0dd27a6c4;hb=299915eadc559f12d145945436289931a74621b8;hp=1b8194201df4b7d9d66aee126fa5ed866a135763;hpb=a4af00400a835eb87569ba40e21874c05e872c0f;p=sliver-openvswitch.git diff --git a/ovsdb/row.c b/ovsdb/row.c index 1b8194201..e25f857ae 100644 --- a/ovsdb/row.c +++ b/ovsdb/row.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009 Nicira Networks +/* Copyright (c) 2009, 2010, 2011 Nicira Networks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ #include #include +#include "dynamic-string.h" #include "json.h" #include "ovsdb-error.h" #include "shash.h" @@ -30,11 +31,16 @@ static struct ovsdb_row * allocate_row(const struct ovsdb_table *table) { size_t n_fields = shash_count(&table->schema->columns); + size_t n_indexes = table->schema->n_indexes; size_t row_size = (offsetof(struct ovsdb_row, fields) - + sizeof(struct ovsdb_datum) * n_fields); + + sizeof(struct ovsdb_datum) * n_fields + + sizeof(struct hmap_node) * n_indexes); struct ovsdb_row *row = xmalloc(row_size); row->table = (struct ovsdb_table *) table; row->txn_row = NULL; + list_init(&row->src_refs); + list_init(&row->dst_refs); + row->n_refs = 0; return row; } @@ -76,8 +82,21 @@ ovsdb_row_destroy(struct ovsdb_row *row) { if (row) { const struct ovsdb_table *table = row->table; + struct ovsdb_weak_ref *weak, *next; const struct shash_node *node; + LIST_FOR_EACH_SAFE (weak, next, dst_node, &row->dst_refs) { + list_remove(&weak->src_node); + list_remove(&weak->dst_node); + free(weak); + } + + LIST_FOR_EACH_SAFE (weak, next, src_node, &row->src_refs) { + list_remove(&weak->src_node); + list_remove(&weak->dst_node); + free(weak); + } + SHASH_FOR_EACH (node, &table->schema->columns) { const struct ovsdb_column *column = node->data; ovsdb_datum_destroy(&row->fields[column->index], &column->type); @@ -157,9 +176,26 @@ ovsdb_row_update_columns(struct ovsdb_row *dst, } } +/* Appends the string form of the value in 'row' of each of the columns in + * 'columns' to 'out', e.g. "1, \"xyz\", and [1, 2, 3]". */ +void +ovsdb_row_columns_to_string(const struct ovsdb_row *row, + const struct ovsdb_column_set *columns, + struct ds *out) +{ + size_t i; + + for (i = 0; i < columns->n_columns; i++) { + const struct ovsdb_column *column = columns->columns[i]; + + ds_put_cstr(out, english_list_delimiter(i, columns->n_columns)); + ovsdb_datum_to_string(&row->fields[column->index], &column->type, out); + } +} + struct ovsdb_error * ovsdb_row_from_json(struct ovsdb_row *row, const struct json *json, - const struct ovsdb_symbol_table *symtab, + struct ovsdb_symbol_table *symtab, struct ovsdb_column_set *included) { struct ovsdb_table_schema *schema = row->table->schema; @@ -308,8 +344,7 @@ ovsdb_row_hash_destroy(struct ovsdb_row_hash *rh, bool destroy_rows) { struct ovsdb_row_hash_node *node, *next; - HMAP_FOR_EACH_SAFE (node, next, struct ovsdb_row_hash_node, hmap_node, - &rh->rows) { + HMAP_FOR_EACH_SAFE (node, next, hmap_node, &rh->rows) { hmap_remove(&rh->rows, &node->hmap_node); if (destroy_rows) { ovsdb_row_destroy((struct ovsdb_row *) node->row); @@ -342,7 +377,7 @@ ovsdb_row_hash_contains_all(const struct ovsdb_row_hash *a, struct ovsdb_row_hash_node *node; assert(ovsdb_column_set_equals(&a->columns, &b->columns)); - HMAP_FOR_EACH (node, struct ovsdb_row_hash_node, hmap_node, &b->rows) { + HMAP_FOR_EACH (node, hmap_node, &b->rows) { if (!ovsdb_row_hash_contains__(a, node->row, node->hmap_node.hash)) { return false; } @@ -362,8 +397,7 @@ ovsdb_row_hash_contains__(const struct ovsdb_row_hash *rh, const struct ovsdb_row *row, size_t hash) { struct ovsdb_row_hash_node *node; - HMAP_FOR_EACH_WITH_HASH (node, struct ovsdb_row_hash_node, hmap_node, - hash, &rh->rows) { + HMAP_FOR_EACH_WITH_HASH (node, hmap_node, hash, &rh->rows) { if (ovsdb_row_equal_columns(row, node->row, &rh->columns)) { return true; }