Ticket #492: customized_entry.diff
| File customized_entry.diff, 6.2 kB (added by dgollub, 10 months ago) |
|---|
-
opensync/group/opensync_group.h
old new 35 35 OSYNC_CONFLICT_RESOLUTION_DUPLICATE, 36 36 OSYNC_CONFLICT_RESOLUTION_IGNORE, 37 37 OSYNC_CONFLICT_RESOLUTION_NEWER, 38 OSYNC_CONFLICT_RESOLUTION_SELECT 38 OSYNC_CONFLICT_RESOLUTION_SELECT, 39 OSYNC_CONFLICT_RESOLUTION_CUSTOM 39 40 } OSyncConflictResolution; 40 41 41 42 OSYNC_EXPORT OSyncGroup *osync_group_new(OSyncError **error); -
opensync/engine/opensync_obj_engine.h
old new 53 53 osync_bool osync_mapping_engine_solve(OSyncMappingEngine *engine, OSyncChange *change, OSyncError **error); 54 54 osync_bool osync_mapping_engine_ignore(OSyncMappingEngine *engine, OSyncError **error); 55 55 osync_bool osync_mapping_engine_use_latest(OSyncMappingEngine *engine, OSyncError **error); 56 osync_bool osync_mapping_engine_customized(OSyncMappingEngine *engine, OSyncChange *customized_change, OSyncError **error); 56 57 osync_bool osync_mapping_engine_duplicate(OSyncMappingEngine *existingMapping, OSyncError **error); 57 58 58 59 #endif /*OPENSYNC_OBJ_ENGINE_H_*/ -
opensync/engine/opensync_engine.c
old new 389 389 return TRUE; 390 390 } 391 391 392 osync_bool osync_engine_mapping_customized(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncData *data, OSyncError **error) 393 { 394 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, mapping_engine, error); 395 396 OSyncEngineCommand *cmd = osync_try_malloc0(sizeof(OSyncEngineCommand), error); 397 if (!cmd) { 398 osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 399 return FALSE; 400 } 401 402 OSyncChange *customized_change = osync_change_new(error); 403 if (!customized_change) { 404 osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 405 return FALSE; 406 } 407 408 osync_change_set_data(customized_change, data); 409 410 cmd->cmd = OSYNC_ENGINE_COMMAND_SOLVE; 411 cmd->mapping_engine = mapping_engine; 412 /* We recycle the master struct member which prefectly fits our needs as OSyncChange. */ 413 cmd->master = customized_change; 414 cmd->solve_type = OSYNC_ENGINE_SOLVE_CUSTOM; 415 416 g_async_queue_push(engine->command_queue, cmd); 417 418 osync_trace(TRACE_EXIT, "%s", __func__); 419 return TRUE; 420 } 421 392 422 /*! @brief This will create a new engine for the given group 393 423 * 394 424 * This will create a new engine for the given group … … 1214 1244 if (!osync_mapping_engine_use_latest(command->mapping_engine, &engine->error)) 1215 1245 goto error; 1216 1246 break; 1247 case OSYNC_ENGINE_SOLVE_CUSTOM: 1248 if (!osync_mapping_engine_customized(command->mapping_engine, command->master, &engine->error)) 1249 goto error; 1250 break; 1217 1251 } 1218 1252 break; 1219 1253 case OSYNC_ENGINE_COMMAND_DISCOVER: -
opensync/engine/opensync_engine_internals.h
old new 25 25 OSYNC_ENGINE_SOLVE_DUPLICATE, 26 26 OSYNC_ENGINE_SOLVE_CHOOSE, 27 27 OSYNC_ENGINE_SOLVE_IGNORE, 28 OSYNC_ENGINE_SOLVE_USE_LATEST 28 OSYNC_ENGINE_SOLVE_USE_LATEST, 29 OSYNC_ENGINE_SOLVE_CUSTOM 29 30 } OSyncEngineSolveType; 30 31 31 32 typedef struct OSyncEngineCommand { -
opensync/engine/opensync_engine.h
old new 187 187 osync_bool osync_engine_mapping_duplicate(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncError **error); 188 188 osync_bool osync_engine_mapping_ignore_conflict(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncError **error); 189 189 osync_bool osync_engine_mapping_use_latest(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncError **error); 190 osync_bool osync_engine_mapping_customized(OSyncEngine *engine, OSyncMappingEngine *mapping_engine, OSyncData *data, OSyncError **error); 190 191 191 192 #endif /*OPENSYNC_ENGINE_H_*/ -
opensync/engine/opensync_obj_engine.c
old new 768 768 return FALSE; 769 769 } 770 770 771 osync_bool osync_mapping_engine_customized(OSyncMappingEngine *engine, OSyncChange *customized_change, OSyncError **error) 772 { 773 osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, engine, error); 774 775 GList *e = engine->entries; 776 for (; e; e = e->next) { 777 OSyncMappingEntryEngine *existingEntry = e->data; 778 OSyncChange *existingChange = osync_entry_engine_get_change(existingEntry); 779 OSyncData *customized_data = osync_change_get_data(customized_change); 780 781 OSyncData *cloned_data = osync_data_clone(customized_data, error); 782 if (!cloned_data) 783 goto error; 784 785 osync_change_set_data(existingChange, cloned_data); 786 787 osync_entry_engine_set_dirty(existingEntry, TRUE); 788 789 /* Set the last entry as the master */ 790 osync_mapping_engine_set_master(engine, existingEntry); 791 792 } 793 794 engine->conflict = FALSE; 795 osync_status_update_mapping(engine->parent->parent, engine, OSYNC_MAPPING_EVENT_SOLVED, NULL); 796 engine->parent->conflicts = g_list_remove(engine->parent->conflicts, engine); 797 798 if (osync_engine_check_get_changes(engine->parent->parent) && BitCount(engine->parent->sink_errors | engine->parent->sink_get_changes) == g_list_length(engine->parent->sink_engines)) { 799 OSyncError *error = NULL; 800 if (!osync_obj_engine_command(engine->parent, OSYNC_ENGINE_COMMAND_WRITE, &error)) 801 goto error; 802 } else 803 osync_trace(TRACE_INTERNAL, "Not triggering write. didnt receive all reads yet"); 804 805 osync_trace(TRACE_EXIT, "%s", __func__); 806 return TRUE; 807 808 error: 809 osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error)); 810 return FALSE; 811 } 812 771 813 static OSyncMappingEngine *_create_mapping_engine(OSyncObjEngine *engine, OSyncError **error) 772 814 { 773 815 /* If there is none, create one */
