error = ovsdb_datum_from_json(&datum, &column->type, node->data, NULL);
if (!error) {
unsigned int column_idx = column - table->class->columns;
- ovsdb_datum_swap(&row->old[column_idx], &datum);
- ovsdb_datum_destroy(&datum, &column->type);
- if (table->modes[column_idx] == OVSDB_IDL_MODE_RW) {
- changed = true;
+ struct ovsdb_datum *old = &row->old[column_idx];
+
+ if (!ovsdb_datum_equals(old, &datum, &column->type)) {
+ ovsdb_datum_swap(old, &datum);
+ if (table->modes[column_idx] == OVSDB_IDL_MODE_RW) {
+ changed = true;
+ }
+ } else {
+ /* Didn't really change but the OVSDB monitor protocol always
+ * includes every value in a row. */
}
+
+ ovsdb_datum_destroy(&datum, &column->type);
} else {
char *s = ovsdb_error_to_string(error);
VLOG_WARN_RL(&syntax_rl, "error parsing column %s in row "UUID_FMT
/* Create connection to database. */
idl = ovsdb_idl_create(remote, &ovsrec_idl_class);
+ ovsdb_idl_set_write_only(idl, &ovsrec_open_vswitch_col_cur_cfg);
+ ovsdb_idl_set_write_only(idl, &ovsrec_open_vswitch_col_statistics);
+ ovsdb_idl_omit(idl, &ovsrec_open_vswitch_col_external_ids);
+
+ ovsdb_idl_omit(idl, &ovsrec_bridge_col_external_ids);
+
+ ovsdb_idl_omit(idl, &ovsrec_port_col_external_ids);
+ ovsdb_idl_omit(idl, &ovsrec_port_col_fake_bridge);
+
+ ovsdb_idl_set_write_only(idl, &ovsrec_interface_col_ofport);
+ ovsdb_idl_set_write_only(idl, &ovsrec_interface_col_statistics);
+ ovsdb_idl_omit(idl, &ovsrec_interface_col_external_ids);
+
/* Register unixctl commands. */
unixctl_command_register("fdb/show", bridge_unixctl_fdb_show, NULL);
unixctl_command_register("bridge/dump-flows", bridge_unixctl_dump_flows,