|
From: <svn...@op...> - 2009-11-05 19:56:17
|
Author: dgollub Date: Thu Nov 5 20:55:58 2009 New Revision: 5941 URL: http://www.opensync.org/changeset/5941 Log: Return commit context immdetially. Use osync_context_report_uid_update() in sink sync_done() phase to report UID changes. This is required since SyncML is working async and report mappings changes, with the <Map> command, once all changes got commmit. So we do this in sync_done() Tested only DataSync-Server plugin. DataSync-Client untested. TODO: How to handle commit errors without commit context in syncml-plugin? refs #1161 Modified: plugins/syncml/src/syncml_callbacks.c plugins/syncml/src/syncml_common.c plugins/syncml/src/syncml_common.h plugins/syncml/src/syncml_ds_client.c plugins/syncml/src/syncml_ds_server.c Modified: plugins/syncml/src/syncml_callbacks.c ============================================================================== --- plugins/syncml/src/syncml_callbacks.c Thu Nov 5 20:16:33 2009 (r5940) +++ plugins/syncml/src/syncml_callbacks.c Thu Nov 5 20:55:58 2009 (r5941) @@ -400,12 +400,12 @@ &error, OSYNC_ERROR_GENERIC, "Unable to commit change. Error %i", code); - report_error_on_context(&(ctx->context), &error, TRUE); + //report_error_on_context(&(ctx->context), &error, TRUE); + // TODO port .... result = FALSE; } else { if (newuid) - osync_change_set_uid(ctx->change, newuid); - report_success_on_context(&(ctx->context)); + g_hash_table_insert(ctx->database->uid_updates, g_strdup(osync_change_get_uid(ctx->change)), g_strdup(newuid)); } // cleanup Modified: plugins/syncml/src/syncml_common.c ============================================================================== --- plugins/syncml/src/syncml_common.c Thu Nov 5 20:16:33 2009 (r5940) +++ plugins/syncml/src/syncml_common.c Thu Nov 5 20:55:58 2009 (r5941) @@ -59,6 +59,11 @@ } osync_trace(TRACE_INTERNAL, "%s - configuration cleaned", __func__); + if (database->uid_updates) { + g_hash_table_destroy(database->uid_updates); + database->uid_updates = NULL; + } + // cleanup contexts // if something is present here then it must be failed // because this is a software bug @@ -145,6 +150,8 @@ database->syncChanges = NULL; database->syncContexts = NULL; + database->uid_updates = g_hash_table_new(g_str_hash, g_str_equal); + database->url = osync_plugin_resource_get_name(res); if (!database->url) { osync_error_set(error, OSYNC_ERROR_GENERIC, "Database name not set"); @@ -870,3 +877,26 @@ return NULL; } +static void report_uid_updates(gpointer key, gpointer value, gpointer user_data) +{ + OSyncContext *ctx = (OSyncContext *) user_data; + + const char *olduid = (const char *) key; + const char *newuid = (const char *) value; + + osync_context_report_uid_update(ctx, olduid, newuid); +} + +void sink_sync_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +{ + osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, ctx, data); + SmlDatabase *database = (SmlDatabase *)data; + g_assert(database); + + g_hash_table_foreach(database->uid_updates, report_uid_updates, ctx); + + osync_context_report_success(ctx); + + osync_trace(TRACE_EXIT, "%s", __func__, ctx); +} + Modified: plugins/syncml/src/syncml_common.h ============================================================================== --- plugins/syncml/src/syncml_common.h Thu Nov 5 20:16:33 2009 (r5940) +++ plugins/syncml/src/syncml_common.h Thu Nov 5 20:55:58 2009 (r5941) @@ -128,6 +128,8 @@ OSyncContext *getChangesCtx; OSyncContext *commitCtx; + GHashTable *uid_updates; + GMutex *alert_type_mutex; GCond *alert_type_cond; @@ -135,7 +137,6 @@ } SmlDatabase; struct commitContext { - OSyncContext *context; OSyncChange *change; SmlDatabase *database; }; @@ -187,4 +188,7 @@ SmlChangeType _get_changetype(OSyncChange *change); + +void sink_sync_done(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data); + #endif //_SYNCML_COMMON_H Modified: plugins/syncml/src/syncml_ds_client.c ============================================================================== --- plugins/syncml/src/syncml_ds_client.c Thu Nov 5 20:16:33 2009 (r5940) +++ plugins/syncml/src/syncml_ds_client.c Thu Nov 5 20:55:58 2009 (r5941) @@ -45,6 +45,7 @@ osync_objtype_sink_set_get_changes_func(sink, ds_client_get_changeinfo); osync_objtype_sink_set_commit_func(sink, ds_client_commit); osync_objtype_sink_set_committed_all_func(sink, ds_client_committed_all); + osync_objtype_sink_set_sync_done_func(sink, sink_sync_done); /* Request a state database from the framework. */ osync_objtype_sink_enable_state_db(sink, TRUE); @@ -142,11 +143,9 @@ if (!tracer) goto oserror; tracer->change = change; - tracer->context = ctx; tracer->database = database; osync_change_ref(change); - osync_context_ref(ctx); // prepare data OSyncData *odata = osync_change_get_data(change); @@ -165,6 +164,8 @@ tracer, &error)) goto error; + osync_context_report_success(ctx); + osync_trace(TRACE_EXIT, "%s", __func__); return; Modified: plugins/syncml/src/syncml_ds_server.c ============================================================================== --- plugins/syncml/src/syncml_ds_server.c Thu Nov 5 20:16:33 2009 (r5940) +++ plugins/syncml/src/syncml_ds_server.c Thu Nov 5 20:55:58 2009 (r5941) @@ -44,6 +44,7 @@ osync_objtype_sink_set_get_changes_func(sink, ds_server_get_changeinfo); osync_objtype_sink_set_commit_func(sink, ds_server_commit); osync_objtype_sink_set_committed_all_func(sink, ds_server_committed_all); + osync_objtype_sink_set_sync_done_func(sink, sink_sync_done); // Request a state database from the framework. osync_objtype_sink_enable_state_db(sink, TRUE); @@ -136,11 +137,9 @@ if (!tracer) goto oserror; tracer->change = change; - tracer->context = ctx; tracer->database = database; osync_change_ref(change); - osync_context_ref(ctx); // prepare data OSyncData *odata = osync_change_get_data(change); @@ -159,6 +158,8 @@ tracer, &error)) goto error; + osync_context_report_success(ctx); + osync_trace(TRACE_EXIT, "%s", __func__); return; |