From: <dg...@su...> - 2009-01-12 00:11:52
|
Author: dgollub Date: Mon Jan 12 01:11:07 2009 New Revision: 5122 URL: http://www.opensync.org/changeset/5122 Log: Refactor and cleanup engine write 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 Mon Jan 12 00:26:28 2009 (r5121) +++ trunk/opensync/engine/opensync_obj_engine.c Mon Jan 12 01:11:07 2009 (r5122) @@ -477,7 +477,7 @@ osync_trace(TRACE_EXIT, "%s", __func__); } -static void _osync_obj_engine_commit_change_callback(OSyncClientProxy *proxy, void *userdata, const char *uid, OSyncError *error) +void osync_obj_engine_commit_change_callback(OSyncClientProxy *proxy, void *userdata, const char *uid, OSyncError *error) { OSyncMappingEntryEngine *entry_engine = userdata; OSyncObjEngine *engine = entry_engine->objengine; @@ -538,7 +538,7 @@ osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error)); } -static void _osync_obj_engine_written_callback(OSyncClientProxy *proxy, void *userdata, OSyncError *error) +void osync_obj_engine_written_callback(OSyncClientProxy *proxy, void *userdata, OSyncError *error) { OSyncSinkEngine *sinkengine = userdata; OSyncObjEngine *engine = sinkengine->engine; @@ -1090,74 +1090,13 @@ engine->written = TRUE; - osync_trace(TRACE_INTERNAL, "Starting to write"); - for (p = engine->sink_engines; p; p = p->next) { - OSyncMember *member = NULL; - long long int memberid = 0; - OSyncObjTypeSink *objtype_sink = NULL; - OSyncCapabilities *caps; - - sinkengine = p->data; - /* FIXME: for "clean" mixed-objtype syncing - all peers should report - * via their native OSyncObjEngine. This temp. solution uses not the - * ObjTypeSink to write/commit changes. Later the "native" ObjEngine - * should be used. - - if (osync_sink_engine_is_dummy(sinkengine)) - continue; - */ - - 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 */ - /* TODO: Get rid of hardcoded-"data". Make this indepdendent of "data" */ - if (!objtype_sink) - objtype_sink = osync_member_find_objtype_sink(member, "data"); - /* TODO: Review if objtype_sink = NULL is valid at all. */ + osync_trace(TRACE_INTERNAL, "Starting to write"); + if (!osync_obj_engine_write(engine, error)) + goto error; - for (o = sinkengine->entries; o; o = o->next) { - OSyncMappingEntryEngine *entry_engine = o->data; - osync_assert(entry_engine); + /* TODO: Reviewe error handling here! */ - /* 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; - osync_assert(entry_engine->change); - - osync_trace(TRACE_INTERNAL, "Writing change %s, changetype %i, format %s , objtype %s from member %lli", - osync_change_get_uid(change), - osync_change_get_changetype(change), - osync_objformat_get_name(osync_change_get_objformat(change)), - osync_change_get_objtype(change), - osync_member_get_id(osync_client_proxy_get_member(sinkengine->proxy))); - - if (!osync_client_proxy_commit_change(sinkengine->proxy, _osync_obj_engine_commit_change_callback, entry_engine, osync_entry_engine_get_change(entry_engine), error)) - goto error; - } else if (entry_engine->change) { - OSyncMapping *mapping = entry_engine->mapping_engine->mapping; - OSyncMember *member = osync_client_proxy_get_member(sinkengine->proxy); - OSyncMappingEntry *entry = entry_engine->entry; - const char *objtype = osync_change_get_objtype(entry_engine->change); - - if (engine->archive) { - if (osync_change_get_changetype(entry_engine->change) == OSYNC_CHANGE_TYPE_DELETED) { - if (!osync_archive_delete_change(engine->archive, osync_mapping_entry_get_id(entry), objtype, error)) - goto error; - } else { - if (!osync_archive_save_change(engine->archive, osync_mapping_entry_get_id(entry), osync_change_get_uid(entry_engine->change), objtype, osync_mapping_get_id(mapping), osync_member_get_id(member), error)) - goto error; - } - } - } - } - - if (!osync_client_proxy_committed_all(sinkengine->proxy, _osync_obj_engine_written_callback, sinkengine, engine->objtype, error)) - goto error; - } break; case OSYNC_ENGINE_COMMAND_SYNC_DONE: for (p = engine->sink_engines; p; p = p->next) { @@ -1313,6 +1252,52 @@ } return TRUE; + +error: + return FALSE; +} + +osync_bool osync_obj_engine_write(OSyncObjEngine *engine, OSyncError **error) +{ + GList *p; + OSyncMember *member; + OSyncObjTypeSink *objtype_sink; + + osync_assert(engine); + + for (p = engine->sink_engines; p; p = p->next) { + OSyncSinkEngine *sinkengine = p->data; + + /* FIXME: for "clean" mixed-objtype syncing - all peers should report + * via their native OSyncObjEngine. This temp. solution uses not the + * ObjTypeSink to write/commit changes. Later the "native" ObjEngine + * should be used. + + if (osync_sink_engine_is_dummy(sinkengine)) + continue; + */ + + member = osync_client_proxy_get_member(sinkengine->proxy); + objtype_sink = osync_member_find_objtype_sink(member, engine->objtype); + + + + /* If sink could not be found use "data" sink if available */ + /* TODO: Get rid of hardcoded-"data". Make this indepdendent of "data" */ + if (!objtype_sink) + objtype_sink = osync_member_find_objtype_sink(member, "data"); + /* TODO: Review if objtype_sink = NULL is valid at all. */ + osync_assert(objtype_sink); + + /* Only commit change if the objtype sink is able/allowed to write. */ + if (!osync_objtype_sink_get_write(objtype_sink)) + continue; + + if (!osync_sink_engine_write(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 Mon Jan 12 00:26:28 2009 (r5121) +++ trunk/opensync/engine/opensync_obj_engine_internals.h Mon Jan 12 01:11:07 2009 (r5122) @@ -117,5 +117,39 @@ */ osync_bool osync_obj_engine_prepare_write(OSyncObjEngine *engine, OSyncError **error); +/*! @brief Start write/commit for OSyncObjEngine + * + * This function writes/commits the entries of all OSyncSinkEngine, which are + * 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 + * @returns TRUE on success, FALSE otherwise + */ +osync_bool osync_obj_engine_write(OSyncObjEngine *engine, OSyncError **error); + +/*! @brief Commit Callback function for OSyncClientProxy + * + * This is the commit callback function of the OSyncObjEngine gets called + * by OSyncClientProxy for each change which got committed. + * + * @param proxy Pointer to an OSyncClientProxy object + * @param userdata Pointer to user data, which got set in the commit-proxy call + * @param uid The UID of the commit + * @param error Pointer to error struct, which has an error set + */ +void osync_obj_engine_commit_change_callback(OSyncClientProxy *proxy, void *userdata, const char *uid, OSyncError *error); + +/*! @brief Written Callback function for OSyncClientProxy + * + * This is the written callback function of the OSyncObjEngine gets called + * by OSyncClientProxy once all changes got committed. + * + * @param proxy Pointer to an OSyncClientProxy object + * @param userdata Pointer to user data, which got set in the written-proxy call + * @param error Pointer to error struct, which has an error set + */ +void osync_obj_engine_written_callback(OSyncClientProxy *proxy, void *userdata, OSyncError *error); + #endif /* OPENSYNC_OBJ_ENGINE_INTERNALS_H_ */ Modified: trunk/opensync/engine/opensync_sink_engine.c ============================================================================== --- trunk/opensync/engine/opensync_sink_engine.c Mon Jan 12 00:26:28 2009 (r5121) +++ trunk/opensync/engine/opensync_sink_engine.c Mon Jan 12 01:11:07 2009 (r5122) @@ -31,7 +31,9 @@ #include "opensync_obj_engine_internals.h" #include "opensync_sink_engine_internals.h" #include "opensync_mapping_entry_engine_internals.h" +#include "opensync_mapping_engine_internals.h" +#include "archive/opensync_archive_internals.h" #include "client/opensync_client_proxy_internals.h" #include "format/opensync_objformat_internals.h" /* osync_objformat_has_merger() */ @@ -216,3 +218,66 @@ return FALSE; } +osync_bool osync_sink_engine_write(OSyncSinkEngine *engine, OSyncArchive *archive, OSyncError **error) +{ + OSyncList *o; + const char *objtype; + OSyncMember *member; + + osync_assert(engine); + osync_assert(archive); + + objtype = osync_obj_engine_get_objtype(engine->engine); + member = osync_client_proxy_get_member(engine->proxy); + + for (o = engine->entries; o; o = o->next) { + OSyncMappingEntryEngine *entry_engine = o->data; + osync_assert(entry_engine); + + if (osync_entry_engine_is_dirty(entry_engine)) { + OSyncChange *change = osync_entry_engine_get_change(entry_engine); + osync_assert(change); + + osync_trace(TRACE_INTERNAL, "Writing change %s, changetype %i, format %s , objtype %s from member %lli", + osync_change_get_uid(change), + osync_change_get_changetype(change), + osync_objformat_get_name(osync_change_get_objformat(change)), + osync_change_get_objtype(change), + osync_member_get_id(member)); + + if (!osync_client_proxy_commit_change(engine->proxy, + osync_obj_engine_commit_change_callback, + entry_engine, change, error)) + goto error; + + } else if (entry_engine->change) { + OSyncMapping *mapping = entry_engine->mapping_engine->mapping; + OSyncMappingEntry *entry = entry_engine->entry; + + /* FIXME: Don't mix up in this function objtypes */ + /* osync_assert_msg(!strcmp(objtype, osync_change_get_objtype(entry_engine->change), "Mixed-objtype in final write!")); */ + const char *objtype = osync_change_get_objtype(entry_engine->change); + + if (osync_change_get_changetype(entry_engine->change) == OSYNC_CHANGE_TYPE_DELETED) { + if (!osync_archive_delete_change(archive, osync_mapping_entry_get_id(entry), objtype, error)) + goto error; + } else { + if (!osync_archive_save_change(archive, + osync_mapping_entry_get_id(entry), + osync_change_get_uid(entry_engine->change), + objtype, osync_mapping_get_id(mapping), + osync_member_get_id(member), error)) + goto error; + } + } + } + + if (!osync_client_proxy_committed_all(engine->proxy, osync_obj_engine_written_callback, engine, objtype, 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 Mon Jan 12 00:26:28 2009 (r5121) +++ trunk/opensync/engine/opensync_sink_engine_internals.h Mon Jan 12 01:11:07 2009 (r5122) @@ -87,10 +87,21 @@ * preferd/requested format (destination). * * @param engine Pointer to an OSyncSinkEngine which should convert - * @param archive Pointer to an OSyncFormatEnv for plugins to use + * @param formatenv Pointer to an OSyncFormatEnv for plugins to use * @param error Pointer to error struct, which get set on any error * @returns TRUE on success, FALSE otherwise */ osync_bool osync_sink_engine_convert_to_dest(OSyncSinkEngine *engine, OSyncFormatEnv *formatenv, OSyncError **error); +/*! @brief Write/commit all entries of OSyncSinkEngine to the client/peer + * + * This function writes/commits all entries of the OSyncSinkEngine to the member. + * + * @param engine Pointer to an OSyncSinkEngine which should write + * @param archive Pointer to an OSyncArchive to update the mappings + * @param error Pointer to error struct, which get set on any error + * @returns TRUE on success, FALSE otherwise + */ +osync_bool osync_sink_engine_write(OSyncSinkEngine *engine, OSyncArchive *archive, OSyncError **error); + #endif /*OPENSYNC_SINK_ENGINE_INTERNALS_H_*/ |