From: <svn...@op...> - 2009-04-08 15:38:34
|
Author: bellmich Date: Wed Apr 8 17:38:14 2009 New Revision: 5562 URL: http://www.opensync.org/changeset/5562 Log: replace batch_commit by commit and committed_all (callbacks) The error handling in case of a single failing change was and is wrong. Modified: plugins/syncml/src/syncml_ds_client.c plugins/syncml/src/syncml_ds_client.h plugins/syncml/src/syncml_ds_server.c plugins/syncml/src/syncml_ds_server.h Modified: plugins/syncml/src/syncml_ds_client.c ============================================================================== --- plugins/syncml/src/syncml_ds_client.c Wed Apr 8 17:14:01 2009 (r5561) +++ plugins/syncml/src/syncml_ds_client.c Wed Apr 8 17:38:14 2009 (r5562) @@ -43,7 +43,8 @@ osync_objtype_sink_set_connect_func(sink, syncml_connect); osync_objtype_sink_set_connect_done_func(sink, syncml_connect_done); osync_objtype_sink_set_get_changes_func(sink, ds_client_get_changeinfo); - osync_objtype_sink_set_batch_commit_func(sink, ds_client_batch_commit); + osync_objtype_sink_set_commit_func(sink, ds_client_commit); + osync_objtype_sink_set_committed_all_func(sink, ds_client_committed_all); /* Request a state database from the framework. */ osync_objtype_sink_enable_state_db(sink, TRUE); @@ -126,7 +127,57 @@ return; } -void ds_client_batch_commit(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncContext **contexts, OSyncChange **changes, void *data) +void ds_client_commit(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data) +{ + osync_trace(TRACE_ENTRY, "%s", __func__); + g_assert(ctx); + + SmlError *error = NULL; + OSyncError *oserror = NULL; + SmlDatabase *database = (SmlDatabase*)data; + + database->pendingCommits++; + + struct commitContext *tracer = osync_try_malloc0(sizeof(struct commitContext), &oserror); + 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); + char *buf = NULL; + unsigned int size = 0; + osync_data_get_data(odata, &buf, &size); + + osync_trace(TRACE_INTERNAL, "%s: Committing entry \"%s\": \"%s\"", + __func__, osync_change_get_uid(change), buf); + if (!smlDataSyncAddChange( + database->env->dsObject2, + database->url, + _get_changetype(change), + osync_change_get_uid(change), + buf, size, + tracer, &error)) + goto error; + + osync_trace(TRACE_EXIT, "%s", __func__); + return; + + /* FIXME: error handling must cleaned up - check context */ +error: + osync_error_set(&oserror, OSYNC_ERROR_GENERIC, "%s", smlErrorPrint(&error)); + smlErrorDeref(&error); +oserror: + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&oserror)); + /* report_error_on_context(&(database->commitCtx), &oserror, TRUE); */ +} + +void ds_client_committed_all(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) { osync_trace(TRACE_ENTRY, "%s", __func__); g_assert(ctx); @@ -138,7 +189,6 @@ database->commitCtx = ctx; osync_context_ref(database->commitCtx); - database->pendingCommits = get_num_changes(changes); if (database->pendingCommits == 0) { // if there are no changes then we do nothing @@ -149,42 +199,6 @@ return; } - // a batch commit should be called after the first DsSession - // was completely performed - g_assert(database->pendingChanges == 0); - - int i; - for (i=0; i < database->pendingCommits; i++) - { - struct commitContext *tracer = osync_try_malloc0(sizeof(struct commitContext), &oserror); - if (!tracer) - goto oserror; - tracer->change = changes[i]; - tracer->context = contexts[i]; - tracer->database = database; - - osync_change_ref(changes[i]); - osync_context_ref(contexts[i]); - - // prepare data - OSyncData *data = osync_change_get_data(changes[i]); - char *buf = NULL; - unsigned int size = 0; - osync_data_get_data(data, &buf, &size); - - osync_trace(TRACE_INTERNAL, "%s: Committing entry \"%s\": \"%s\"", - __func__, osync_change_get_uid(changes[i]), buf); - if (!smlDataSyncAddChange( - database->env->dsObject2, - database->url, - _get_changetype(changes[i]), - osync_change_get_uid(changes[i]), - buf, size, - tracer, &error)) - goto error; - - } - /* I (bellmich) tested a lot with OCS and the result is * that it is required to start a new OMA DS session for * the data uploading. If I only try to send a new alert @@ -213,7 +227,7 @@ error: osync_error_set(&oserror, OSYNC_ERROR_GENERIC, "%s", smlErrorPrint(&error)); smlErrorDeref(&error); -oserror: +/* oserror: */ osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&oserror)); report_error_on_context(&(database->commitCtx), &oserror, TRUE); } Modified: plugins/syncml/src/syncml_ds_client.h ============================================================================== --- plugins/syncml/src/syncml_ds_client.h Wed Apr 8 17:14:01 2009 (r5561) +++ plugins/syncml/src/syncml_ds_client.h Wed Apr 8 17:38:14 2009 (r5562) @@ -10,12 +10,17 @@ osync_bool slow_sync, void *data); -void ds_client_batch_commit( +void ds_client_commit( + OSyncObjTypeSink *sink, + OSyncPluginInfo *info, + OSyncContext *ctx, + OSyncChange *change, + void *data); + +void ds_client_committed_all( OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, - OSyncContext **contexts, - OSyncChange **changes, void *data); SmlBool ds_client_init_databases( Modified: plugins/syncml/src/syncml_ds_server.c ============================================================================== --- plugins/syncml/src/syncml_ds_server.c Wed Apr 8 17:14:01 2009 (r5561) +++ plugins/syncml/src/syncml_ds_server.c Wed Apr 8 17:38:14 2009 (r5562) @@ -42,7 +42,8 @@ osync_objtype_sink_set_connect_func(sink, syncml_connect); osync_objtype_sink_set_connect_done_func(sink, syncml_connect_done); osync_objtype_sink_set_get_changes_func(sink, ds_server_get_changeinfo); - osync_objtype_sink_set_batch_commit_func(sink, ds_server_batch_commit); + osync_objtype_sink_set_commit_func(sink, ds_server_commit); + osync_objtype_sink_set_committed_all_func(sink, ds_server_committed_all); // Request a state database from the framework. osync_objtype_sink_enable_state_db(sink, TRUE); @@ -118,7 +119,7 @@ return; } -void ds_server_batch_commit(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncContext **contexts, OSyncChange **changes, void *data) +void ds_server_commit(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, OSyncChange *change, void *data) { osync_trace(TRACE_ENTRY, "%s", __func__); g_assert(ctx); @@ -127,47 +128,64 @@ OSyncError *oserror = NULL; SmlDatabase *database = (SmlDatabase*)data; - database->env->gotDatabaseCommits++; - database->pendingCommits = get_num_changes(changes); + database->pendingCommits++; osync_trace(TRACE_INTERNAL, "%s - %i changes present to send", __func__, database->pendingCommits); - database->commitCtx = ctx; - osync_context_ref(database->commitCtx); - - g_assert(database->pendingChanges == 0); - - int i; - for (i=0; i < database->pendingCommits; i++) - { - struct commitContext *tracer = osync_try_malloc0(sizeof(struct commitContext), &oserror); - if (!tracer) - goto oserror; - tracer->change = changes[i]; - tracer->context = contexts[i]; - tracer->database = database; - - osync_change_ref(changes[i]); - osync_context_ref(contexts[i]); - - // prepare data - OSyncData *data = osync_change_get_data(changes[i]); - char *buf = NULL; - unsigned int size = 0; - osync_data_get_data(data, &buf, &size); - - osync_trace(TRACE_INTERNAL, "%s: Committing entry \"%s\": \"%s\"", - __func__, osync_change_get_uid(changes[i]), buf); - if (!smlDataSyncAddChange( + struct commitContext *tracer = osync_try_malloc0(sizeof(struct commitContext), &oserror); + 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); + char *buf = NULL; + unsigned int size = 0; + osync_data_get_data(odata, &buf, &size); + + osync_trace(TRACE_INTERNAL, "%s: Committing entry \"%s\": \"%s\"", + __func__, osync_change_get_uid(change), buf); + if (!smlDataSyncAddChange( database->env->dsObject1, database->url, - _get_changetype(changes[i]), - osync_change_get_uid(changes[i]), + _get_changetype(change), + osync_change_get_uid(change), buf, size, tracer, &error)) - goto error; + goto error; + + osync_trace(TRACE_EXIT, "%s", __func__); + return; + + /* the context handling in case of an error is wrong */ +error: + osync_error_set(&oserror, OSYNC_ERROR_GENERIC, "%s", smlErrorPrint(&error)); + smlErrorDeref(&error); +oserror: + osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&oserror)); + /* report_error_on_context(&(database->commitCtx), &oserror, TRUE); */ +} + +void ds_server_committed_all(OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, void *data) +{ + osync_trace(TRACE_ENTRY, "%s", __func__); + g_assert(ctx); + + SmlError *error = NULL; + OSyncError *oserror = NULL; + SmlDatabase *database = (SmlDatabase*)data; + + database->env->gotDatabaseCommits++; + + database->commitCtx = ctx; + osync_context_ref(database->commitCtx); - } + g_assert(database->pendingChanges == 0); if (g_list_length(database->env->databases) == database->env->gotDatabaseCommits && !smlDataSyncSendChanges(database->env->dsObject1, &error)) @@ -179,7 +197,6 @@ error: osync_error_set(&oserror, OSYNC_ERROR_GENERIC, "%s", smlErrorPrint(&error)); smlErrorDeref(&error); -oserror: osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&oserror)); report_error_on_context(&(database->commitCtx), &oserror, TRUE); } Modified: plugins/syncml/src/syncml_ds_server.h ============================================================================== --- plugins/syncml/src/syncml_ds_server.h Wed Apr 8 17:14:01 2009 (r5561) +++ plugins/syncml/src/syncml_ds_server.h Wed Apr 8 17:38:14 2009 (r5562) @@ -10,12 +10,17 @@ osync_bool slow_sync, void *data); -void ds_server_batch_commit( +void ds_server_commit( + OSyncObjTypeSink *sink, + OSyncPluginInfo *info, + OSyncContext *ctx, + OSyncChange *change, + void *data); + +void ds_server_committed_all( OSyncObjTypeSink *sink, OSyncPluginInfo *info, OSyncContext *ctx, - OSyncContext **contexts, - OSyncChange **changes, void *data); SmlBool ds_server_init_databases( |