From: <dg...@su...> - 2009-01-19 00:21:48
|
Author: dgollub Date: Mon Jan 19 01:20:46 2009 New Revision: 5187 URL: http://www.opensync.org/changeset/5187 Log: Move/reassign changes/entries with different objtype then the ObjEngine, to the native ObjEngine. This is required that entries get written via the native ObjEngine and via the inteded plugin sink function. This allows mixed-objtype syncing. Modified: trunk/opensync/engine/opensync_engine.c trunk/opensync/engine/opensync_engine_internals.h trunk/opensync/engine/opensync_obj_engine.c trunk/opensync/engine/opensync_obj_engine_internals.h Modified: trunk/opensync/engine/opensync_engine.c ============================================================================== --- trunk/opensync/engine/opensync_engine.c Mon Jan 19 00:40:31 2009 (r5186) +++ trunk/opensync/engine/opensync_engine.c Mon Jan 19 01:20:46 2009 (r5187) @@ -927,6 +927,64 @@ } +osync_bool osync_engine_handle_mixed_objtypes(OSyncEngine *engine, OSyncError **error) +{ + OSyncList *o, *s, *e; + + for (o = engine->object_engines; o; o = o->next) { + OSyncObjEngine *objengine = o->data; + const char *objtype = objengine->objtype; + + osync_trace(TRACE_INTERNAL, "ObjEngine: %s", objtype); + + for (s = objengine->dummy_sink_engines; s; s = s->next) { + OSyncSinkEngine *sinkengine = s->data; + + for (e = sinkengine->entries; e; e = e->next) { + OSyncMappingEntryEngine *mapping_entry_engine = e->data; + OSyncChange *change; + OSyncObjFormat *objformat; + const char *current_objtype; + OSyncObjEngine *new_objengine; + OSyncSinkEngine *new_sinkengine; + + change = osync_entry_engine_get_change(mapping_entry_engine); + objformat = osync_change_get_objformat(change); + osync_assert(objformat); + current_objtype = osync_objformat_get_objtype(objformat); + + /* ... otherwise we need to reassign the mappin entry engine + * to different objengine + */ + new_objengine = osync_engine_find_objengine(engine, current_objtype); + if (!new_objengine) { + osync_error_set(error, OSYNC_ERROR_GENERIC, + "Couldn't find Object Type Engine for Object Type \"%s\" " + "while preparing for write phase.", __NULLSTR(current_objtype)); + goto error; + } + + new_sinkengine = osync_obj_engine_find_proxy_sinkengine(new_objengine, sinkengine->proxy); + if (!new_sinkengine) { + osync_error_set(error, OSYNC_ERROR_GENERIC, + "Couldn't find Sink Engine for Object Type \"%s\" " + "while preparing for write phase.", __NULLSTR(current_objtype)); + goto error; + } + + sinkengine->entries = osync_list_remove(sinkengine->entries, mapping_entry_engine); + new_sinkengine->entries = osync_list_append(new_sinkengine->entries, mapping_entry_engine); + + } + } + } + + return TRUE; + +error: + return FALSE; +} + static void _osync_engine_generate_end_conflicts_event(OSyncEngine *engine) { @@ -1041,23 +1099,36 @@ static void _osync_engine_generate_prepared_write_event(OSyncEngine *engine) { + OSyncError *locerror = NULL; + if (osync_bitcount(engine->obj_errors | engine->obj_prepared_write) == osync_list_length(engine->object_engines)) { if (osync_bitcount(engine->obj_errors)) { - OSyncError *locerror = NULL; osync_error_set(&locerror, OSYNC_ERROR_GENERIC, "At least one object engine failed while preparing the write event. Aborting"); - osync_trace(TRACE_ERROR, "%s", osync_error_print(&locerror)); - osync_engine_set_error(engine, locerror); - osync_status_update_engine(engine, OSYNC_ENGINE_EVENT_ERROR, locerror); - osync_engine_event(engine, OSYNC_ENGINE_EVENT_ERROR); - //osync_error_unref(&locerror); + goto error; } else { osync_status_update_engine(engine, OSYNC_ENGINE_EVENT_PREPARED_WRITE, NULL); - osync_engine_event(engine, OSYNC_ENGINE_EVENT_PREPARED_WRITE); + if (!osync_engine_handle_mixed_objtypes(engine, &locerror)) + goto error; + + /* This is only for debugging purposes */ + osync_engine_trace_multiply_summary(engine); + if (engine->multiply_callback) + engine->multiply_callback(engine, engine->multiply_userdata); + else + osync_engine_event(engine, OSYNC_ENGINE_EVENT_PREPARED_WRITE); } } else osync_trace(TRACE_INTERNAL, "Not yet: %i", osync_bitcount(engine->obj_errors | engine->obj_prepared_write)); + return; + +error: + osync_trace(TRACE_ERROR, "%s", osync_error_print(&locerror)); + osync_engine_set_error(engine, locerror); + osync_status_update_engine(engine, OSYNC_ENGINE_EVENT_ERROR, locerror); + osync_engine_event(engine, OSYNC_ENGINE_EVENT_ERROR); + //osync_error_unref(&locerror); } static void _osync_engine_generate_written_event(OSyncEngine *engine) Modified: trunk/opensync/engine/opensync_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_engine_internals.h Mon Jan 19 00:40:31 2009 (r5186) +++ trunk/opensync/engine/opensync_engine_internals.h Mon Jan 19 01:20:46 2009 (r5187) @@ -117,6 +117,19 @@ */ OSYNC_TEST_EXPORT void osync_engine_trace_multiply_summary(OSyncEngine *engine); + +/** @brief Reassign entries with a different objtype then the ObjEngine, to the + * native ObjEngine. + * + * TODO: This needs serious profiling. + * + * @param engine Pointer to engine + * @param error Pointer to error-struct which get set on any error + * @returns TRUE on success, or FALSE on any error + * + */ +osync_bool osync_engine_handle_mixed_objtypes(OSyncEngine *engine, OSyncError **error); + /*@}*/ #endif /*OPENSYNC_ENGINE_INTERNALS_H_*/ Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Mon Jan 19 00:40:31 2009 (r5186) +++ trunk/opensync/engine/opensync_obj_engine.c Mon Jan 19 01:20:46 2009 (r5187) @@ -362,7 +362,6 @@ osync_bool osync_obj_engine_receive_change(OSyncObjEngine *objengine, OSyncClientProxy *proxy, OSyncChange *change, OSyncError **error) { OSyncSinkEngine *sinkengine = NULL; - OSyncList *s = NULL; OSyncList *e = NULL; osync_assert(objengine); @@ -370,12 +369,7 @@ osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, objengine, proxy, change, error); /* Find the sinkengine for the proxy */ - for (s = objengine->sink_engines; s; s = s->next) { - sinkengine = s->data; - if (sinkengine->proxy == proxy) - break; - sinkengine = NULL; - } + sinkengine = osync_obj_engine_find_proxy_sinkengine(objengine, proxy); if (!sinkengine) { osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to find sinkengine"); @@ -1184,6 +1178,23 @@ osync_error_ref(&error); } +OSyncSinkEngine *osync_obj_engine_find_proxy_sinkengine(OSyncObjEngine *engine, OSyncClientProxy *proxy) +{ + OSyncList *s; + OSyncSinkEngine *sinkengine; + osync_return_val_if_fail(engine, NULL); + osync_return_val_if_fail(proxy, NULL); + + for (s = engine->sink_engines; s; s = s->next) { + sinkengine = s->data; + if (sinkengine->proxy == proxy) + break; + sinkengine = NULL; + } + + return sinkengine; +} + OSyncSinkEngine *osync_obj_engine_nth_sinkengine(OSyncObjEngine *engine, unsigned int nth) { osync_return_val_if_fail(engine, NULL); Modified: trunk/opensync/engine/opensync_obj_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_obj_engine_internals.h Mon Jan 19 00:40:31 2009 (r5186) +++ trunk/opensync/engine/opensync_obj_engine_internals.h Mon Jan 19 01:20:46 2009 (r5187) @@ -113,7 +113,7 @@ * related to the OSyncObjEngine * * @param engine Pointer to an OSyncObjEngine which should start writing - @param error Pointer to error struct, which get set on any error + * @param error Pointer to error struct, which get set on any error * @returns TRUE on success, FALSE otherwise */ osync_bool osync_obj_engine_write(OSyncObjEngine *engine, OSyncError **error); @@ -141,5 +141,13 @@ */ void osync_obj_engine_written_callback(OSyncClientProxy *proxy, void *userdata, OSyncError *error); +/*! @brief Find OSyncSinkEngine for a specific OSyncClientProxy + * + * @param engine Pointer to OSyncObjEngine to prepare + * @param proxy Pointer to an OSyncClientProxy object + * @returns Pointer of OSyncSinkEngine of the associated proxy, otherwise NULL + */ +OSyncSinkEngine *osync_obj_engine_find_proxy_sinkengine(OSyncObjEngine *engine, OSyncClientProxy *proxy); + #endif /* OPENSYNC_OBJ_ENGINE_INTERNALS_H_ */ |