From: <svn...@op...> - 2009-10-16 10:23:41
|
Author: bellmich Date: Fri Oct 16 12:23:28 2009 New Revision: 1331 URL: http://libsyncml.opensync.org/changeset/1331 Log: - fixed status management in index file - added error handling for changes Modified: trunk/tools/syncml-ds-tool.c trunk/tools/syncml-ds-tool_internals.c trunk/tools/syncml-ds-tool_internals.h Modified: trunk/tools/syncml-ds-tool.c ============================================================================== --- trunk/tools/syncml-ds-tool.c Fri Oct 16 12:02:45 2009 (r1330) +++ trunk/tools/syncml-ds-tool.c Fri Oct 16 12:23:28 2009 (r1331) @@ -939,6 +939,7 @@ static void writeSyncStatus(gboolean success) { + GError *error = NULL; SmlDsToolLocationType *datastore = NULL; GList *o = datastores; for(;o;o = o->next) { @@ -946,22 +947,32 @@ if (datastore->directory) { char *absolute = g_strdup_printf("%s/%s", datastore->directory, STATUS_FILENAME); if (success) { - GError *error = NULL; - if (!g_file_set_contents(absolute, "DONE", 4, &error)) { - g_warning("Cannot write data to %s. %s", - absolute, error->message); - g_error_free(error); + if (!g_file_set_contents(absolute, "Okay.", 5, &error)) + goto error; + + /* migrate all entries from committed_index to last_index */ + gsize count = 0; + char **keys = g_key_file_get_keys(datastore->index, "committed_index", NULL, NULL); + int pos = 0; + while (keys[pos] != NULL) + { + char *digest = g_key_file_get_string(datastore->index, "committed_index", keys[pos], &error); + if (!digest && error) + goto error; + if (!g_key_file_remove_key(datastore->index, "committed_index", keys[pos], &error)) + goto error; + g_key_file_set_string(datastore->index, "last_index", keys[pos], digest); + smlSafeCFree(&digest); + pos++; } + g_strfreev(keys); /* dump index */ gchar *filename = g_strdup_printf("%s/%s.INDEX", datastore->directory, STATUS_FILENAME); gsize length = 0; gchar *data = g_key_file_to_data(datastore->index, &length, &error); if (!g_file_set_contents(filename, data, length, &error)) - { - g_warning("The index file %s cannot be written.", filename); - g_error_free(error); - } + goto error; g_free(filename); } else { g_unlink(STATUS_FILENAME); @@ -969,6 +980,9 @@ smlSafeCFree(&absolute); } } + return; +error: + g_error("%s", error->message); } gboolean @@ -1204,7 +1218,6 @@ { smlTrace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, session, item, userdata, error); char *absolute_uid = NULL; - char *absolute_status = NULL; /* find the appropriate datasoure */ SmlDsToolLocationType *datastore = userdata; @@ -1225,7 +1238,6 @@ char *safeUID = getSafeFilename(orgUID); printf("Writing item %s to directory %s.\n", safeUID, datastore->directory); absolute_uid = g_strdup_printf("%s/%s", datastore->directory, safeUID); - absolute_status = g_strdup_printf("%s/%s", datastore->directory, STATUS_FILENAME); /* sanity check for uid */ if (!strncmp(safeUID, STATUS_FILENAME, strlen(STATUS_FILENAME))) { @@ -1513,7 +1525,6 @@ /* cleanup UIDs */ smlSafeCFree(&safeUID); smlSafeCFree(&absolute_uid); - smlSafeCFree(&absolute_status); } else { /* print received change */ printf("-----BEGIN CHANGE-----\n"); @@ -1529,8 +1540,6 @@ error: if (absolute_uid) smlSafeCFree(&absolute_uid); - if (absolute_status) - smlSafeCFree(&absolute_status); smlTrace(TRACE_EXIT_ERROR, "%s - %s", __func__, (*error)->message); return FALSE; } @@ -1544,6 +1553,13 @@ { smlTrace(TRACE_ENTRY, "%s(%p, %p, %d, %p, %p)", __func__, session, item, code, userdata, error); + /* If there is an error then the whole operation must be aborted. */ + if (sml_error_get_class(code) != SML_ERRORCLASS_SUCCESS) + { + g_set_error(error, TOOL_ERROR, code, smlErrorTypeGetMessage(code)); + goto error; + } + /* find the appropriate datasoure */ SmlDsToolLocationType *datastore = userdata; if (!datastore) @@ -1555,7 +1571,7 @@ SmlLocation *loc = sml_data_sync_change_item_get_location(item); const char *key = sml_location_get_uri(loc); - const char *digest = g_key_file_get_string(datastore->index, "last_index", key, error); + const char *digest = g_key_file_get_string(datastore->index, "change_index", key, error); if (!digest && *error) goto error; @@ -1606,6 +1622,21 @@ datastore->slow = TRUE; if (datastore->slow) type = SML_ALERT_SLOW_SYNC; + char *status = g_strdup_printf("%s/%s", datastore->directory, STATUS_FILENAME); + if (!g_file_test(status, G_FILE_TEST_EXISTS)) + { + /* directory is out-of-sync => enforce slow sync */ + datastore->slow = TRUE; + type = SML_ALERT_SLOW_SYNC; + } + smlSafeCFree(&status); + + if (type == SML_ALERT_SLOW_SYNC) + { + g_message("\t%s => SLOW SYNC.", sml_data_sync_data_store_get_local_uri(datastore->object)); + } else { + g_message("\t%s => NORMAL SYNC.", sml_data_sync_data_store_get_local_uri(datastore->object)); + } smlTrace(TRACE_EXIT, "%s - slow == %d", __func__, datastore->slow); return type; @@ -1702,6 +1733,7 @@ if (!sml_data_sync_initialize(dsObject, &error)) goto error; + g_message("Starting data sync ..."); /* run the sync */ checkpoint = time(NULL); Modified: trunk/tools/syncml-ds-tool_internals.c ============================================================================== --- trunk/tools/syncml-ds-tool_internals.c Fri Oct 16 12:02:45 2009 (r1330) +++ trunk/tools/syncml-ds-tool_internals.c Fri Oct 16 12:23:28 2009 (r1331) @@ -19,3 +19,4 @@ */ #include <libsyncml/sml_support.h> +#include <libsyncml/sml_error_internals.h> Modified: trunk/tools/syncml-ds-tool_internals.h ============================================================================== --- trunk/tools/syncml-ds-tool_internals.h Fri Oct 16 12:02:45 2009 (r1330) +++ trunk/tools/syncml-ds-tool_internals.h Fri Oct 16 12:23:28 2009 (r1331) @@ -31,6 +31,8 @@ void smlSafeFree (gpointer *address); void smlSafeCFree (gchar **address); +const char *smlErrorTypeGetMessage(SmlErrorType type); + /** Solaris g_strdup_vprintf crashes on NULL strings. * Therefore a macro was introduced to sanitize string parameters. */ |