From: <dg...@su...> - 2009-01-06 13:31:35
|
Author: dgollub Date: Tue Jan 6 14:31:14 2009 New Revision: 5042 URL: http://www.opensync.org/changeset/5042 Log: Started refactoring ObjEngine WRITE command. This is required for later to move all non-WRITE related tasks into a "PREPARE_WRITE" command. This is required for sepearting conversion and demerging from WRITE, to exchange entry-engines between ObjEngine on a mixed-objtype sync. Started with refactoring the demerging code in the engine. No fundamental (code)/logic changes. Modified: trunk/opensync/engine/opensync_mapping_entry_engine.c trunk/opensync/engine/opensync_mapping_entry_engine_internals.h trunk/opensync/engine/opensync_obj_engine.c Modified: trunk/opensync/engine/opensync_mapping_entry_engine.c ============================================================================== --- trunk/opensync/engine/opensync_mapping_entry_engine.c Tue Jan 6 10:06:25 2009 (r5041) +++ trunk/opensync/engine/opensync_mapping_entry_engine.c Tue Jan 6 14:31:14 2009 (r5042) @@ -26,7 +26,12 @@ #include "opensync-engine.h" #include "opensync-data.h" #include "opensync-mapping.h" +#include "opensync-format.h" +#include "archive/opensync_archive_internals.h" +#include "format/opensync_objformat_internals.h" + +#include "opensync_obj_engine.h" #include "opensync_obj_engine.h" #include "opensync_mapping_engine.h" @@ -35,7 +40,6 @@ #include "opensync_mapping_entry_engine_internals.h" #include "opensync_mapping_engine_internals.h" - OSyncMappingEntryEngine *osync_entry_engine_new(OSyncMappingEntry *entry, OSyncMappingEngine *mapping_engine, OSyncSinkEngine *sink_engine, OSyncObjEngine *objengine, OSyncError **error) { OSyncMappingEntryEngine *engine = NULL; @@ -153,3 +157,51 @@ engine->dirty = dirty; } +osync_bool osync_entry_engine_demerge(OSyncMappingEntryEngine *entry_engine, OSyncArchive *archive, OSyncCapabilities *caps, OSyncError **error) +{ + + char *buffer = NULL, *marshalbuf; + unsigned int size = 0, marshalsize; + const char *objtype = NULL; + OSyncMapping *mapping = NULL; + OSyncMarshal *marshal = NULL; + OSyncObjFormat *objformat = osync_change_get_objformat(entry_engine->change); + + osync_trace(TRACE_INTERNAL, "Entry %s Dirty: %i", osync_change_get_uid(entry_engine->change), osync_entry_engine_is_dirty(entry_engine)); + + osync_trace(TRACE_INTERNAL, "Save the entire data and demerge."); + objtype = osync_change_get_objtype(entry_engine->change); + mapping = entry_engine->mapping_engine->mapping; + + osync_data_get_data(osync_change_get_data(entry_engine->change), &buffer, &size); + + marshal = osync_marshal_new(error); + if (!marshal) + goto error; + + if (!osync_objformat_marshal(objformat, buffer, size, marshal, error)) + goto error_free_marshal; + + osync_marshal_get_buffer(marshal, &marshalbuf, &marshalsize); + + if (!osync_archive_save_data(archive, osync_mapping_get_id(mapping), objtype, marshalbuf, marshalsize, error)) { + osync_free(buffer); /* TODO: Is this a valid free? */ + goto error_free_marshal; + } + + if (!osync_objformat_demerge(objformat, &buffer, &size, caps, error)) + goto error_free_marshal; + + osync_trace(TRACE_SENSITIVE, "Post Demerge:\n%s\n", + osync_objformat_print(objformat, buffer, size)); + + osync_marshal_unref(marshal); + + return TRUE; + +error_free_marshal: + osync_marshal_unref(marshal); +error: + return FALSE; +} + Modified: trunk/opensync/engine/opensync_mapping_entry_engine_internals.h ============================================================================== --- trunk/opensync/engine/opensync_mapping_entry_engine_internals.h Tue Jan 6 10:06:25 2009 (r5041) +++ trunk/opensync/engine/opensync_mapping_entry_engine_internals.h Tue Jan 6 14:31:14 2009 (r5042) @@ -107,6 +107,20 @@ */ void osync_entry_engine_set_dirty(OSyncMappingEntryEngine *engine, osync_bool dirty); + +/*! @brief Demerge the entry in the OSyncMappingEntryEngine + * + * The demerge includes storing the "entire" entry in the Archive. The demerging is done + * based on the supplied OSyncCapabilities. + * + * @param engine Pointer to an OSyncMappingEntryEngine + * @param archive Pointer to the Archive to store the "entire" entry before demerging + * @param caps Pointer to Capabilities to use for demerging + * @param error Pointer to error struct, which get set on any error + * @returns TRUE on successful demerge, FALSE otherwise + */ +osync_bool osync_entry_engine_demerge(OSyncMappingEntryEngine *engine, OSyncArchive *archive, OSyncCapabilities *caps, OSyncError **error); + /*@}*/ #endif /* OPENSYNC_MAPPING_ENTRY_ENGINE_INTERNALS_H_ */ Modified: trunk/opensync/engine/opensync_obj_engine.c ============================================================================== --- trunk/opensync/engine/opensync_obj_engine.c Tue Jan 6 10:06:25 2009 (r5041) +++ trunk/opensync/engine/opensync_obj_engine.c Tue Jan 6 14:31:14 2009 (r5042) @@ -1083,6 +1083,7 @@ long long int memberid = 0; OSyncObjTypeSink *objtype_sink = NULL; OSyncFormatConverterPath *path = NULL; + OSyncCapabilities *caps; sinkengine = p->data; @@ -1097,6 +1098,7 @@ member = osync_client_proxy_get_member(sinkengine->proxy); memberid = osync_member_get_id(member); + caps = osync_member_get_capabilities(member); objtype_sink = osync_member_find_objtype_sink(member, engine->objtype); /* If sink could not be found use "data" sink if available */ @@ -1108,54 +1110,23 @@ 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) && - osync_group_get_converter_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)) ) { - char *buffer = NULL, *marshalbuf; - unsigned int size = 0, marshalsize; - const char *objtype = NULL; - OSyncMapping *mapping = NULL; - OSyncMarshal *marshal = NULL; - OSyncCapabilities *caps = osync_member_get_capabilities(member); - OSyncObjFormat *objformat = osync_change_get_objformat(entry_engine->change); - - osync_trace(TRACE_INTERNAL, "Entry %s for member %lli: Dirty: %i", osync_change_get_uid(entry_engine->change), memberid, osync_entry_engine_is_dirty(entry_engine)); - - osync_trace(TRACE_INTERNAL, "Save the entire data and demerge."); - objtype = osync_change_get_objtype(entry_engine->change); - mapping = entry_engine->mapping_engine->mapping; - - osync_data_get_data(osync_change_get_data(entry_engine->change), &buffer, &size); - - marshal = osync_marshal_new(error); - if (!marshal) - goto error; - - if (!osync_objformat_marshal(objformat, buffer, size, marshal, error)) + if (!osync_entry_engine_demerge(entry_engine, engine->archive, caps, error)) goto error; - - osync_marshal_get_buffer(marshal, &marshalbuf, &marshalsize); - - if (!osync_archive_save_data(engine->archive, osync_mapping_get_id(mapping), objtype, marshalbuf, marshalsize, error)) { - osync_marshal_unref(marshal); - osync_free(buffer); - goto error; - } - - osync_marshal_unref(marshal); - - if (!osync_objformat_demerge(objformat, &buffer, &size, caps, error)) - goto error; - - osync_trace(TRACE_SENSITIVE, "Post Demerge:\n%s\n", - osync_objformat_print(objformat, buffer, size)); } |