struct ovsdb_monitor_column {
const struct ovsdb_column *column;
enum ovsdb_monitor_selection select;
+ bool monitored;
};
/* A row that has changed in a monitored table. */
/* Columns being monitored. */
struct ovsdb_monitor_column *columns;
size_t n_columns;
+ size_t n_monitored_columns;
+ size_t allocated_columns;
/* Columns in ovsdb_monitor_row have different indexes then in
* ovsdb_row. This field maps between column->index to the index in the
const struct ovsdb_monitor_column *a = a_;
const struct ovsdb_monitor_column *b = b_;
+ /* put all monitored columns at the begining */
+ if (a->monitored != b->monitored) {
+ return a->monitored ? -1 : 1;
+ }
+
return a->column < b->column ? -1 : a->column > b->column;
}
const struct ovsdb_table *table,
const struct ovsdb_column *column,
enum ovsdb_monitor_selection select,
- size_t *allocated_columns)
+ bool monitored)
{
struct ovsdb_monitor_table *mt;
struct ovsdb_monitor_column *c;
return column->name;
}
- if (mt->n_columns >= *allocated_columns) {
- mt->columns = x2nrealloc(mt->columns, allocated_columns,
+ if (mt->n_columns >= mt->allocated_columns) {
+ mt->columns = x2nrealloc(mt->columns, &mt->allocated_columns,
sizeof *mt->columns);
}
c = &mt->columns[mt->n_columns++];
c->column = column;
c->select = select;
+ c->monitored = monitored;
+ if (monitored) {
+ mt->n_monitored_columns++;
+ }
return NULL;
}
new_json = json_object_create();
json_object_put(row_json, "new", new_json);
}
- for (i = 0; i < mt->n_columns; i++) {
+ for (i = 0; i < mt->n_monitored_columns; i++) {
const struct ovsdb_monitor_column *c = &mt->columns[i];
- if (!(type & c->select)) {
+ if (!c->monitored || !(type & c->select)) {
/* We don't care about this type of change for this
* particular column (but we will care about it for some
* other column). */
diff_json = json_object_create();
const char *op;
- for (i = 0; i < mt->n_columns; i++) {
+ for (i = 0; i < mt->n_monitored_columns; i++) {
const struct ovsdb_monitor_column *c = &mt->columns[i];
- if (!(type & c->select)) {
+ if (!c->monitored || !(type & c->select)) {
/* We don't care about this type of change for this
* particular column (but we will care about it for some
* other column). */
{
size_t i;
+ ovs_assert(b->n_columns == b->n_monitored_columns);
+
if ((a->table != b->table) ||
(a->select != b->select) ||
- (a->n_columns != b->n_columns)) {
+ (a->n_monitored_columns != b->n_monitored_columns)) {
return false;
}
- for (i = 0; i < a->n_columns; i++) {
+ /* Compare only monitored columns that must be sorted already */
+ for (i = 0; i < a->n_monitored_columns; i++) {
if ((a->columns[i].column != b->columns[i].column) ||
(a->columns[i].select != b->columns[i].select)) {
return false;
}
}
-
return true;
}