From: <dg...@su...> - 2009-01-11 23:01:27
|
Author: dgollub Date: Mon Jan 12 00:00:46 2009 New Revision: 5120 URL: http://www.opensync.org/changeset/5120 Log: Refactor demerge process in enigne. Move demerge process into the PREPARE_WRITE engine command. Modified: trunk/opensync/engine/opensync_obj_engine.c trunk/opensync/engine/opensync_obj_engine_internals.h trunk/opensync/engine/opensync_sink_engine.c trunk/opensync/engine/opensync_sink_engine_internals.h Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Sun Jan 11 22:42:15 2009 (r5119) +++ trunk/opensync/engine/opensync_obj_engine.c Mon Jan 12 00:00:46 2009 (r5120) @@ -1073,7 +1073,7 @@ break; case OSYNC_ENGINE_COMMAND_PREPARE_WRITE: - /* TODO: PLACEHOLDER for demerge and conversion */ + osync_obj_engine_prepare_write(engine, error); osync_obj_engine_event(engine, OSYNC_ENGINE_EVENT_PREPARED_WRITE, *error); break; @@ -1124,26 +1124,6 @@ OSyncMappingEntryEngine *entry_engine = o->data; osync_assert(entry_engine); - - - /* Merger - Save the entire data and demerge */ - /* TODO: Review those conditionals! - * Candidates to drop are: - */ - if (osync_group_get_merger_enabled(osync_engine_get_group(engine->parent)) && - osync_member_get_capabilities(member) && /* Candidate to drop */ - osync_group_get_converter_enabled(osync_engine_get_group(engine->parent)) && /* Candidate to drop */ - entry_engine->change && - (osync_change_get_changetype(entry_engine->change) != OSYNC_CHANGE_TYPE_DELETED) && - osync_objformat_has_merger(osync_change_get_objformat(entry_engine->change)) ) - - - { - if (!osync_entry_engine_demerge(entry_engine, engine->archive, caps, error)) - goto error; - } - - /* Only commit change if the objtype sink is able/allowed to write. */ if (objtype_sink && osync_objtype_sink_get_write(objtype_sink) && osync_entry_engine_is_dirty(entry_engine)) { OSyncChange *change = entry_engine->change; @@ -1315,3 +1295,34 @@ return g_list_length(engine->mapping_engines); } + +osync_bool osync_obj_engine_prepare_write(OSyncObjEngine *engine, OSyncError **error) +{ + GList *p; + osync_bool merger_enabled, converter_enabled; + OSyncGroup *group; + + osync_assert(engine); + + group = osync_engine_get_group(engine->parent); + merger_enabled = osync_group_get_merger_enabled(group); + converter_enabled = osync_group_get_converter_enabled(group); + + if (!merger_enabled && !converter_enabled) + return TRUE; + + for (p = engine->sink_engines; p; p = p->next) { + OSyncSinkEngine *sinkengine = p->data; + + if (merger_enabled + && !osync_sink_engine_demerge(sinkengine, engine->archive, error)) + goto error; + + } + + return TRUE; + +error: + return FALSE; +} + Modified: trunk/opensync/engine/opensync_obj_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_obj_engine_internals.h Sun Jan 11 22:42:15 2009 (r5119) +++ trunk/opensync/engine/opensync_obj_engine_internals.h Mon Jan 12 00:00:46 2009 (r5120) @@ -106,5 +106,16 @@ */ unsigned int osync_obj_engine_num_mapping_engines(OSyncObjEngine *engine); -#endif /*OPENSYNC_OBJ_ENGINE_INTERNALS_H_*/ +/*! @brief Prepare the OSyncObjEngine for writing + * + * This function prepare the write process, by demerging and converting if + * required/configured. + * + * @param engine Pointer to OSyncObjEngine to prepare + * @param engine Pointer to error struct, which get set on any error + * @returns TRUE on success, FALSE otherwise + */ +osync_bool osync_obj_engine_prepare_write(OSyncObjEngine *engine, OSyncError **error); + +#endif /* OPENSYNC_OBJ_ENGINE_INTERNALS_H_ */ Modified: trunk/opensync/engine/opensync_sink_engine.c ============================================================================== --- trunk/opensync/engine/opensync_sink_engine.c Sun Jan 11 22:42:15 2009 (r5119) +++ trunk/opensync/engine/opensync_sink_engine.c Mon Jan 12 00:00:46 2009 (r5120) @@ -32,6 +32,7 @@ #include "opensync_mapping_entry_engine_internals.h" #include "client/opensync_client_proxy_internals.h" +#include "format/opensync_objformat_internals.h" /* osync_objformat_has_merger() */ OSyncSinkEngine *osync_sink_engine_new(int position, OSyncClientProxy *proxy, OSyncObjEngine *objengine, OSyncError **error) { @@ -130,3 +131,42 @@ return osync_client_proxy_get_member(engine->proxy); } +osync_bool osync_sink_engine_demerge(OSyncSinkEngine *engine, OSyncArchive *archive, OSyncError **error) +{ + OSyncList *o; + OSyncMember *member; + OSyncCapabilities *caps; + + osync_assert(engine); + osync_assert(archive); + + member = osync_client_proxy_get_member(engine->proxy); + osync_assert(member); + caps = osync_member_get_capabilities(member); + + if (!caps) + return TRUE; + + for (o = engine->entries; o; o = o->next) { + OSyncMappingEntryEngine *entry_engine = o->data; + osync_assert(entry_engine); + + if (entry_engine->change == NULL) + continue; + + if (osync_change_get_changetype(entry_engine->change) == OSYNC_CHANGE_TYPE_DELETED) + continue; + + if (!osync_objformat_has_merger(osync_change_get_objformat(entry_engine->change))) + continue; + + if (!osync_entry_engine_demerge(entry_engine, archive, caps, error)) + goto error; + + } + + return TRUE; +error: + return FALSE; +} + Modified: trunk/opensync/engine/opensync_sink_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_sink_engine_internals.h Sun Jan 11 22:42:15 2009 (r5119) +++ trunk/opensync/engine/opensync_sink_engine_internals.h Mon Jan 12 00:00:46 2009 (r5120) @@ -67,4 +67,18 @@ */ osync_bool osync_sink_engine_is_dummy(OSyncSinkEngine *engine); +/*! @brief Demerge all entries of OSyncSinkEngine + * + * If the Member/Client of the OSyncSinkEngine doesn't have capabilities + * this functions is NOOP and just returns with TRUE, without error. + * + * Changes with a current OSyncObjFormat, without merge/demerge get skipped. + * + * @param engine Pointer to an OSyncSinkEngine which should demerge + * @param archive Pointer to an OSyncArchive to store the dermerged information + * @param error Pointer to error struct, which get set on any error + * @returns TRUE on success, FALSE otherwise + */ +osync_bool osync_sink_engine_demerge(OSyncSinkEngine *engine, OSyncArchive *archive, OSyncError **error); + #endif /*OPENSYNC_SINK_ENGINE_INTERNALS_H_*/ |