From: <svn...@op...> - 2009-03-25 18:53:12
|
Author: dgollub Date: Wed Mar 25 19:52:52 2009 New Revision: 5315 URL: http://www.opensync.org/changeset/5315 Log: Final fix of mapping_engine for similiar&same conflicts. The change/entry_engine of the "similar" entry got overwritten by the "same" entry. So the similar&same was never fixed to 100% This fixes tescases: mapping_engine_same_similar_conflict mapping_engine_same_similar_conflict_multi (This was not a $ARCH problem as stated before) fixes #883 Modified: trunk/opensync/engine/opensync_obj_engine.c Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Wed Mar 25 18:14:22 2009 (r5314) +++ trunk/opensync/engine/opensync_obj_engine.c Wed Mar 25 19:52:52 2009 (r5315) @@ -259,6 +259,7 @@ OSyncList *unmapped_mappings = NULL; OSyncConvCmpResult result = 0; OSyncMappingEntryEngine *entry_engine = NULL; + OSyncChange *old_change; osync_trace(TRACE_ENTRY, "%s(%p)", __func__, engine); //osync_trace_disable(); @@ -298,10 +299,33 @@ mapping_engine->conflict = TRUE; } else if (result == OSYNC_CONV_DATA_SAME) { unmapped_mappings = osync_list_remove(unmapped_mappings, mapping_engine); + mapping_engine->conflict = FALSE; } + /* Update the entry which belongs to our sinkengine with the the change */ entry_engine = osync_mapping_engine_get_entry(mapping_engine, sinkengine); osync_assert(entry_engine); + + /* Don't overwrite unprefered entry_engines (e.g. SIMILAR). + * + * Secenario: First a mapping with SIMILAR get created. Later a mapping + * with SAME compare result gets detected. The SAME mapping engine get prefered. + * + * The old change gets moved into a new mapping_engine. + */ + if ((old_change = osync_entry_engine_get_change(entry_engine))) { + OSyncMappingEngine *old_mapping_engine = NULL; + OSyncMappingEntryEngine *old_entry_engine = NULL; + old_mapping_engine = _osync_obj_engine_create_mapping_engine(engine, error); + if (!old_mapping_engine) + goto error; + + new_mappings = osync_list_append(new_mappings, old_mapping_engine); + unmapped_mappings = osync_list_append(unmapped_mappings, old_mapping_engine); + + old_entry_engine = osync_mapping_engine_get_entry(old_mapping_engine, sinkengine); + osync_entry_engine_update(old_entry_engine, old_change); + } osync_entry_engine_update(entry_engine, change); sinkengine->unmapped = osync_list_remove(sinkengine->unmapped, sinkengine->unmapped->data); |