From: <svn...@op...> - 2005-03-20 23:54:50
|
Author: abauer Date: 2005-03-17 15:58:35 +0100 (Do, 17 M2005) New Revision: 375 Modified: trunk/opensync/opensync_db.c trunk/opensync/opensync_plugin.c trunk/opensync/opensync_plugin.h trunk/osengine/osengine_client.c trunk/osengine/osengine_deciders.c trunk/osengine/osengine_engine.c trunk/osengine/osengine_engine_internals.h trunk/osengine/osengine_mapcmds.c trunk/osengine/osengine_mapping.c trunk/osengine/osengine_mapping_internals.h trunk/tests/check_multisync.c Log: Some more updates to support ignore_change Geert: trunk/opensync/opensync_db.c =================================================================== --- trunk/opensync/opensync_db.c 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/opensync/opensync_db.c 2005-03-17 14:58:35 UTC (rev 375) @@ -18,7 +18,7 @@ * */ -#include <opensync.h> +#include "opensync.h" #include "opensync_internals.h" void osync_db_trace(void *data, const char *query) @@ -61,6 +61,77 @@ return ret; } +osync_bool osync_db_open_changelog(OSyncGroup *group, char ***uids, int **changetypes, OSyncError **error) +{ + g_assert(group); + OSyncDB *log_db; + + group->changes_path = g_strdup(group->configdir); + char *filename = g_strdup_printf("%s/changelog.db", group->changes_path); + if (!(log_db = osync_db_open(filename, error))) { + osync_error_update(error, "Unable to load changelog: %s", osync_error_print(error)); + return FALSE; + } + osync_debug("OSDB", 3, "Preparing to changelog from file %s", filename); + g_free(filename); + + sqlite3 *sdb = log_db->db; + + if (sqlite3_exec(sdb, "CREATE TABLE tbl_log (uid VARCHAR PRIMARY KEY, changetype INTEGER)", NULL, NULL, NULL) != SQLITE_OK) + osync_debug("OSDB", 2, "Unable create log table! %s", sqlite3_errmsg(sdb)); + + int count = osync_db_count(group->changes_db, "SELECT count(*) FROM tbl_log"); + *uids = g_malloc0(sizeof(char *) * (count + 1)); + *changetypes = g_malloc0(sizeof(int) * (count + 1)); + + sqlite3_stmt *ppStmt = NULL; + sqlite3_prepare(sdb, "SELECT uid, changetype FROM tbl_log", -1, &ppStmt, NULL); + int i = 0; + while (sqlite3_step(ppStmt) == SQLITE_ROW) { + (*uids)[i] = g_strdup(sqlite3_column_text(ppStmt, 0)); + (*changetypes)[i] = sqlite3_column_int(ppStmt, 1); + i++; + } + (*uids)[i] = NULL; + (*changetypes)[i] = 0; + sqlite3_finalize(ppStmt); + + osync_db_close(log_db); + return TRUE; +} + +osync_bool osync_db_save_changelog(OSyncGroup *group, OSyncChange *change, OSyncError **error) +{ + g_assert(group); + OSyncDB *log_db; + + group->changes_path = g_strdup(group->configdir); + char *filename = g_strdup_printf("%s/changelog.db", group->changes_path); + if (!(log_db = osync_db_open(filename, error))) { + osync_error_update(error, "Unable to load changelog: %s", osync_error_print(error)); + return FALSE; + } + osync_debug("OSDB", 3, "Preparing to changelog from file %s", filename); + g_free(filename); + + sqlite3 *sdb = log_db->db; + + if (sqlite3_exec(sdb, "CREATE TABLE tbl_log (uid VARCHAR PRIMARY KEY, changetype INTEGER)", NULL, NULL, NULL) != SQLITE_OK) + osync_debug("OSDB", 2, "Unable create log table! %s", sqlite3_errmsg(sdb)); + + char *query = g_strdup_printf("INSERT INTO tbl_log (uid, changetype) VALUES('%s', '%i')", change->uid, change->changetype); + if (sqlite3_exec(sdb, query, NULL, NULL, NULL) != SQLITE_OK) { + osync_error_set(error, OSYNC_ERROR_PARAMETER, "Unable to insert log! %s", sqlite3_errmsg(sdb)); + g_free(query); + return FALSE; + } + change->id = sqlite3_last_insert_rowid(sdb); + g_free(query); + + osync_db_close(log_db); + return TRUE; +} + osync_bool osync_db_open_changes(OSyncGroup *group, OSyncChange ***changes, OSyncError **error) { g_assert(group); @@ -76,14 +147,14 @@ sqlite3 *sdb = group->changes_db->db; - if (sqlite3_exec(sdb, "CREATE TABLE tbl_changes (id INTEGER PRIMARY KEY, uid VARCHAR, objtype VARCHAR, format VARCHAR, memberid INTEGER, mappingid INTEGER, changetype INTEGER)", NULL, NULL, NULL) != SQLITE_OK) + if (sqlite3_exec(sdb, "CREATE TABLE tbl_changes (id INTEGER PRIMARY KEY, uid VARCHAR, objtype VARCHAR, format VARCHAR, memberid INTEGER, mappingid INTEGER)", NULL, NULL, NULL) != SQLITE_OK) osync_debug("OSDB", 2, "Unable create changes table! %s", sqlite3_errmsg(sdb)); int count = osync_db_count(group->changes_db, "SELECT count(*) FROM tbl_changes"); *changes = g_malloc0(sizeof(OSyncChange *) * (count + 1)); sqlite3_stmt *ppStmt = NULL; - sqlite3_prepare(sdb, "SELECT id, uid, objtype, format, memberid, mappingid, changetype FROM tbl_changes ORDER BY mappingid", -1, &ppStmt, NULL); + sqlite3_prepare(sdb, "SELECT id, uid, objtype, format, memberid, mappingid FROM tbl_changes ORDER BY mappingid", -1, &ppStmt, NULL); int i = 0; while (sqlite3_step(ppStmt) == SQLITE_ROW) { OSyncChange *change = osync_change_new(); @@ -93,7 +164,6 @@ change->format_name = g_strdup(sqlite3_column_text(ppStmt, 3)); change->initial_format_name = g_strdup(change->format_name); change->mappingid = sqlite3_column_int64(ppStmt, 5); - change->changetype = sqlite3_column_int64(ppStmt, 6); long long int memberid = sqlite3_column_int64(ppStmt, 4); change->changes_db = group->changes_db; osync_change_set_member(change, osync_member_from_id(group, memberid)); @@ -121,7 +191,7 @@ char *query = NULL; if (!change->id) { - query = g_strdup_printf("INSERT INTO tbl_changes (uid, objtype, format, memberid, mappingid, changetype) VALUES('%s', '%s', '%s', '%lli', '%lli', '%i')", change->uid, osync_change_get_objtype(change)->name, osync_change_get_objformat(change)->name, change->member->id, change->mappingid, change->changetype); + query = g_strdup_printf("INSERT INTO tbl_changes (uid, objtype, format, memberid, mappingid) VALUES('%s', '%s', '%s', '%lli', '%lli')", change->uid, osync_change_get_objtype(change)->name, osync_change_get_objformat(change)->name, change->member->id, change->mappingid); if (sqlite3_exec(sdb, query, NULL, NULL, NULL) != SQLITE_OK) { osync_error_set(error, OSYNC_ERROR_PARAMETER, "Unable to insert change! %s", sqlite3_errmsg(sdb)); g_free(query); @@ -131,9 +201,9 @@ change->id = sqlite3_last_insert_rowid(sdb); } else { if (save_format) - query = g_strdup_printf("UPDATE tbl_changes SET uid='%s', objtype='%s', format='%s', memberid='%lli', mappingid='%lli', changetype='%i' WHERE id=%lli", change->uid, osync_change_get_objtype(change)->name, osync_change_get_objformat(change)->name, change->member->id, change->mappingid, change->changetype, change->id); + query = g_strdup_printf("UPDATE tbl_changes SET uid='%s', objtype='%s', format='%s', memberid='%lli', mappingid='%lli' WHERE id=%lli", change->uid, osync_change_get_objtype(change)->name, osync_change_get_objformat(change)->name, change->member->id, change->mappingid, change->id); else - query = g_strdup_printf("UPDATE tbl_changes SET uid='%s', memberid='%lli', mappingid='%lli', changetype='%i' WHERE id=%lli", change->uid, change->member->id, change->mappingid, change->changetype, change->id); + query = g_strdup_printf("UPDATE tbl_changes SET uid='%s', memberid='%lli', mappingid='%lli' WHERE id=%lli", change->uid, change->member->id, change->mappingid, change->id); if (sqlite3_exec(sdb, query, NULL, NULL, NULL) != SQLITE_OK) { osync_error_set(error, OSYNC_ERROR_PARAMETER, "Unable to update change! %s", sqlite3_errmsg(sdb)); g_free(query); Geert: trunk/opensync/opensync_plugin.c =================================================================== --- trunk/opensync/opensync_plugin.c 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/opensync/opensync_plugin.c 2005-03-17 14:58:35 UTC (rev 375) @@ -50,6 +50,7 @@ plugin->info.timeouts.get_changeinfo_timeout = 60; plugin->info.timeouts.get_data_timeout = 60; plugin->info.timeouts.commit_timeout = 60; + plugin->info.timeouts.read_change_timeout = 60; plugin->info.plugin = plugin; Geert: trunk/opensync/opensync_plugin.h =================================================================== --- trunk/opensync/opensync_plugin.h 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/opensync/opensync_plugin.h 2005-03-17 14:58:35 UTC (rev 375) @@ -29,6 +29,7 @@ unsigned int get_changeinfo_timeout; unsigned int get_data_timeout; unsigned int commit_timeout; + unsigned int read_change_timeout; } OSyncPluginTimeouts; /*! @brief The functions for accessing formats on a plugin */ Geert: trunk/osengine/osengine_client.c =================================================================== --- trunk/osengine/osengine_client.c 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/osengine/osengine_client.c 2005-03-17 14:58:35 UTC (rev 375) @@ -172,7 +172,7 @@ if (itm_message_is_methodcall(message, "READ_CHANGE")) { OSyncChange *change = itm_message_get_data(message, "change"); - osync_member_read_change(client->member, change, (OSyncEngCallback)osync_client_changes_sink, message); + osync_member_read_change(client->member, change, (OSyncEngCallback)message_callback, message); osync_trace(TRACE_EXIT, "client_message_handler"); return; } Geert: trunk/osengine/osengine_deciders.c =================================================================== --- trunk/osengine/osengine_deciders.c 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/osengine/osengine_deciders.c 2005-03-17 14:58:35 UTC (rev 375) @@ -35,7 +35,18 @@ void osengine_mappingentry_decider(OSyncEngine *engine, OSyncMappingEntry *entry) { osync_trace(TRACE_ENTRY, "osengine_mappingentry_decider(%p, %p)", engine, entry); - + osync_trace(TRACE_INTERNAL, "ENG(SYNC%i,SENT%i,READ%i)DATA%i,DRY%i,MAP%i,INFO%i,SYNC%i,DEL%i", \ + osync_flag_is_set(engine->cmb_synced), \ + osync_flag_is_set(engine->cmb_sent_changes), \ + osync_flag_is_set(engine->cmb_read_all), \ + osync_flag_is_set(entry->fl_has_data), \ + osync_flag_is_set(entry->fl_dirty), \ + osync_flag_is_set(entry->fl_mapped), \ + osync_flag_is_set(entry->fl_has_info), \ + osync_flag_is_set(entry->fl_synced), \ + osync_flag_is_set(entry->fl_deleted)); + + if (osync_flag_is_set(engine->fl_running) \ && osync_flag_is_set(engine->fl_sync) \ && osync_flag_is_set(entry->fl_has_info) \ @@ -47,6 +58,7 @@ } if (osync_flag_is_set(engine->fl_running) \ + && osync_flag_is_set(engine->cmb_read_all) \ && osync_flag_is_set(engine->cmb_sent_changes) \ && osync_flag_is_set(engine->fl_sync) \ && osync_flag_is_set(entry->fl_has_info) \ @@ -80,7 +92,10 @@ void osengine_mapping_decider(OSyncEngine *engine, OSyncMapping *mapping) { osync_trace(TRACE_ENTRY, "osengine_mapping_decider(%p, %p)", engine, mapping); - osync_trace(TRACE_INTERNAL, "SOLV%i,SYNC%i,DATA%i,INFO%i,DEL%i,CHK%i,MUL%i", \ + osync_trace(TRACE_INTERNAL, "ENG(SENT%i,READ%i,MAP%i),SOLV%i,SYNC%i,DATA%i,INFO%i,DEL%i,CHK%i,MUL%i", \ + osync_flag_is_set(engine->cmb_sent_changes), \ + osync_flag_is_set(engine->cmb_read_all), \ + osync_flag_is_set(engine->cmb_entries_mapped), \ osync_flag_is_set(mapping->fl_solved), \ osync_flag_is_set(mapping->cmb_synced), \ osync_flag_is_set(mapping->cmb_has_data), \ @@ -91,6 +106,7 @@ if (osync_flag_is_set(engine->fl_running) \ && osync_flag_is_set(engine->cmb_sent_changes) \ + && osync_flag_is_set(engine->cmb_read_all) \ && osync_flag_is_set(engine->cmb_entries_mapped) \ && osync_flag_is_set(mapping->cmb_has_data) \ && osync_flag_is_not_set(mapping->cmb_synced) \ @@ -103,6 +119,7 @@ if (osync_flag_is_set(engine->fl_running) \ && osync_flag_is_set(engine->cmb_sent_changes) \ + && osync_flag_is_set(engine->cmb_read_all) \ && osync_flag_is_set(engine->cmb_entries_mapped) \ && osync_flag_is_set(mapping->cmb_has_data) \ && osync_flag_is_not_set(mapping->cmb_synced) \ @@ -149,7 +166,15 @@ void osengine_client_decider(OSyncEngine *engine, OSyncClient *client) { osync_trace(TRACE_ENTRY, "osengine_client_decider(%p, %p)", engine, client); - + osync_trace(TRACE_INTERNAL, "ENG(SENT%i,READ%i,MAP%i),CON%i,SENT%i,DONE%i,FIN%i", \ + osync_flag_is_set(engine->cmb_sent_changes), \ + osync_flag_is_set(engine->cmb_read_all), \ + osync_flag_is_set(engine->cmb_entries_mapped), \ + osync_flag_is_set(client->fl_connected), \ + osync_flag_is_set(client->fl_sent_changes), \ + osync_flag_is_set(client->fl_done), \ + osync_flag_is_set(client->fl_finished)); + if (osync_flag_is_set(engine->fl_running) \ && osync_flag_is_not_set(engine->fl_stop) \ && osync_flag_is_not_set(client->fl_done) \ @@ -184,6 +209,7 @@ && osync_flag_is_not_set(client->fl_done) \ && osync_flag_is_set(client->fl_connected) \ && osync_flag_is_set(client->fl_sent_changes) \ + && osync_flag_is_set(engine->cmb_read_all) \ && osync_flag_is_set(engine->cmb_sent_changes) \ && osync_flag_is_set(engine->cmb_synced) \ && osync_flag_is_set(engine->cmb_entries_mapped)) { Geert: trunk/osengine/osengine_engine.c =================================================================== --- trunk/osengine/osengine_engine.c 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/osengine/osengine_engine.c 2005-03-17 14:58:35 UTC (rev 375) @@ -156,6 +156,8 @@ return; } + engine->maptable->logchanges = g_list_remove(engine->maptable->logchanges, entry); + //We convert to the common format here to make sure we always pass it osync_change_convert_to_common(change, NULL); @@ -216,6 +218,28 @@ osync_trace(TRACE_EXIT, "_get_change_data_reply_receiver"); } +void _read_change_reply_receiver(OSyncClient *sender, ITMessage *message, OSyncEngine *engine) +{ + osync_trace(TRACE_ENTRY, "_read_change_reply_receiver(%p, %p, %p)", sender, message, engine); + + OSyncMappingEntry *entry = itm_message_get_data(message, "entry"); + + osync_flag_detach(entry->fl_read); + + osync_flag_unset(entry->mapping->fl_solved); + osync_flag_unset(entry->mapping->fl_chkconflict); + + if (osync_change_get_changetype(entry->change) == CHANGE_DELETED) + osync_flag_set(entry->fl_deleted); + + osync_flag_set(entry->fl_has_info); + osync_flag_unset(entry->fl_synced); + + osync_change_save(entry->change, TRUE, NULL); + osengine_mappingentry_decider(engine, entry); + osync_trace(TRACE_EXIT, "_read_change_reply_receiver"); +} + void _commit_change_reply_receiver(OSyncClient *sender, ITMessage *message, OSyncEngine *engine) { osync_trace(TRACE_ENTRY, "_commit_change_reply_receiver(%p, %p, %p)", sender, message, engine); @@ -238,11 +262,16 @@ osync_flag_set(entry->fl_synced); } - OSyncError *error = NULL; - osync_change_save(entry->change, TRUE, &error); + engine->maptable->logchanges = g_list_remove(engine->maptable->logchanges, entry); + if (osync_change_get_changetype(entry->change) == CHANGE_DELETED) osync_flag_set(entry->fl_deleted); + osync_change_reset(entry->change); + + OSyncError *error = NULL; + osync_change_save(entry->change, TRUE, &error); + osengine_mappingentry_decider(engine, entry); osync_trace(TRACE_EXIT, "_commit_change_reply_receiver"); } @@ -272,6 +301,19 @@ itm_queue_send_with_timeout(entry->client->incoming, message, timeouts.get_data_timeout, sender); } +void send_read_change(OSyncEngine *sender, OSyncMappingEntry *entry) +{ + //osync_flag_changing(entry->fl_has_data); + ITMessage *message = itm_message_new_methodcall(sender, "READ_CHANGE"); + itm_message_set_handler(message, sender->incoming, (ITMessageHandler)_read_change_reply_receiver, sender); + itm_message_set_data(message, "change", entry->change); + itm_message_set_data(message, "entry", entry); + osync_debug("ENG", 3, "Sending read_change message %p to client %p", message, entry->client); + + OSyncPluginTimeouts timeouts = osync_client_get_timeouts(entry->client); + itm_queue_send_with_timeout(entry->client->incoming, message, timeouts.read_change_timeout, sender); +} + void send_connect(OSyncClient *target, OSyncEngine *sender) { osync_flag_changing(target->fl_connected); @@ -435,6 +477,12 @@ static void trigger_clients_sent_changes(OSyncEngine *engine) { + //Load the old mappings + osengine_mappingtable_inject_changes(engine->maptable); +} + +static void trigger_clients_read_all(OSyncEngine *engine) +{ osync_status_update_engine(engine, ENG_ENDPHASE_READ, NULL); g_mutex_lock(engine->info_received_mutex); @@ -454,9 +502,8 @@ static void trigger_clients_connected(OSyncEngine *engine) { osync_trace(TRACE_ENTRY, "%s(%p)", __func__, engine); - //Load the old mappings - osengine_mappintable_load_mappings(engine->maptable); send_engine_changed(engine); + osync_trace(TRACE_EXIT, "%s", __func__); } @@ -510,6 +557,7 @@ osync_flag_set_state(engine->cmb_chkconflict, TRUE); osync_flag_set_state(engine->cmb_finished, FALSE); osync_flag_set_state(engine->cmb_connected, FALSE); + osync_flag_set_state(engine->cmb_read_all, TRUE); itm_queue_flush(engine->incoming); osync_status_update_engine(engine, ENG_ENDPHASE_DISCON, NULL); @@ -579,6 +627,9 @@ engine->cmb_sent_changes = osync_comb_flag_new(FALSE, FALSE); osync_flag_set_pos_trigger(engine->cmb_sent_changes, (MSyncFlagTriggerFunc)trigger_clients_sent_changes, engine, NULL); + engine->cmb_read_all = osync_comb_flag_new(FALSE, TRUE); + osync_flag_set_pos_trigger(engine->cmb_read_all, (MSyncFlagTriggerFunc)trigger_clients_read_all, engine, NULL); + engine->cmb_entries_mapped = osync_comb_flag_new(FALSE, FALSE); osync_flag_set_pos_trigger(engine->cmb_entries_mapped, (MSyncFlagTriggerFunc)send_engine_changed, engine, NULL); @@ -637,6 +688,7 @@ osync_flag_free(engine->cmb_chkconflict); osync_flag_free(engine->cmb_finished); osync_flag_free(engine->cmb_connected); + osync_flag_free(engine->cmb_read_all); itm_queue_flush(engine->incoming); itm_queue_free(engine->incoming); Geert: trunk/osengine/osengine_engine_internals.h =================================================================== --- trunk/osengine/osengine_engine_internals.h 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/osengine/osengine_engine_internals.h 2005-03-17 14:58:35 UTC (rev 375) @@ -47,6 +47,7 @@ MSyncFlag *cmb_synced; //Are all mappings synced? MSyncFlag *cmb_finished; //Are all clients done and disconnected? MSyncFlag *cmb_chkconflict; + MSyncFlag *cmb_read_all; osync_bool man_dispatch; osync_bool allow_sync_alert; @@ -66,3 +67,5 @@ void send_get_changes(OSyncClient *target, OSyncEngine *sender, osync_bool data); void send_sync_done(OSyncClient *target, OSyncEngine *sender); void send_disconnect(OSyncClient *target, OSyncEngine *sender); +void send_read_change(OSyncEngine *sender, OSyncMappingEntry *entry); +void send_engine_changed(OSyncEngine *engine); Geert: trunk/osengine/osengine_mapcmds.c =================================================================== --- trunk/osengine/osengine_mapcmds.c 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/osengine/osengine_mapcmds.c 2005-03-17 14:58:35 UTC (rev 375) @@ -116,6 +116,7 @@ OSyncMappingEntry *master = NULL; master = mapping->master; + g_assert(master); if (osync_flag_is_not_set(master->fl_dirty)) osync_flag_set(master->fl_synced); @@ -164,6 +165,11 @@ } } + osync_change_reset(master->change); + + OSyncError *error = NULL; + osync_change_save(master->change, TRUE, &error); + osync_flag_set(mapping->fl_multiplied); osync_trace(TRACE_EXIT, "osync_mapping_multiply_master"); } @@ -182,26 +188,25 @@ g_assert(engine != NULL); g_assert(mapping != NULL); + g_assert(!mapping->master); - if (!mapping->master) { - for (e = mapping->entries; e; e = e->next) { - leftentry = e->data; - if (osync_change_get_changetype(leftentry->change) == CHANGE_UNKNOWN) + for (e = mapping->entries; e; e = e->next) { + leftentry = e->data; + if (osync_change_get_changetype(leftentry->change) == CHANGE_UNKNOWN) + continue; + mapping->master = leftentry; + for (n = e->next; n; n = n->next) { + rightentry = n->data; + if (osync_change_get_changetype(rightentry->change) == CHANGE_UNKNOWN) continue; - mapping->master = leftentry; - for (n = e->next; n; n = n->next) { - rightentry = n->data; - if (osync_change_get_changetype(rightentry->change) == CHANGE_UNKNOWN) - continue; - - if (osync_change_compare(leftentry->change, rightentry->change) != CONV_DATA_SAME) { - is_conflict = TRUE; - goto conflict; - } else { - is_same++; - } - } - } + + if (osync_change_compare(leftentry->change, rightentry->change) != CONV_DATA_SAME) { + is_conflict = TRUE; + goto conflict; + } else { + is_same++; + } + } } conflict: @@ -213,6 +218,7 @@ osync_trace(TRACE_EXIT, "osync_mapping_check_conflict: Got conflict"); return; } + g_assert(mapping->master); osync_flag_set(mapping->fl_chkconflict); //Our mapping is already solved since there is no conflict @@ -385,8 +391,12 @@ { osync_trace(TRACE_ENTRY, "%s(%p, %p)", __func__, engine, mapping); - //Mark all members of this conflict to be reloaded again next time. - osengine_mappintable_store_mapping(mapping); + GList *e = NULL; + for (e = mapping->entries; e; e = e->next) { + OSyncMappingEntry *entry = e->data; + osync_trace(TRACE_INTERNAL, "Adding %p to logchanges", entry); + engine->maptable->logchanges = g_list_append(engine->maptable->logchanges, entry); + } //And make sure we dont synchronize it this time osengine_mapping_reset(mapping); Geert: trunk/osengine/osengine_mapping.c =================================================================== --- trunk/osengine/osengine_mapping.c 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/osengine/osengine_mapping.c 2005-03-17 14:58:35 UTC (rev 375) @@ -143,27 +143,32 @@ entry->change = change; //entry->orig_change = change; entry->client = (OSyncClient *)osync_member_get_data(osync_change_get_member(change)); + + if (!osync_change_get_mappingid(change)) { + table->unmapped = g_list_append(table->unmapped, entry); + } else { + if (!mapping || mapping->id != osync_change_get_mappingid(change)) { + mapping = osengine_mapping_new(table); + mapping->id = osync_change_get_mappingid(change); + } + osengine_mapping_add_entry(mapping, entry); + } + + osync_flag_set(entry->fl_has_data); + + OSyncMappingView *view = osengine_mappingtable_find_view(table, osync_change_get_member(change)); + if (view) + osengine_mappingview_add_entry(view, entry); + if (osync_change_get_changetype(change) != CHANGE_UNKNOWN) { - table->logchange = g_list_append(table->logchange, change); - } else { - if (!osync_change_get_mappingid(change)) { - table->unmapped = g_list_append(table->unmapped, entry); - } else { - if (!mapping || mapping->id != osync_change_get_mappingid(change)) { - mapping = osengine_mapping_new(table); - mapping->id = osync_change_get_mappingid(change); - } - osengine_mapping_add_entry(mapping, entry); - } - - osync_flag_set(entry->fl_has_data); - - OSyncMappingView *view = osengine_mappingtable_find_view(table, osync_change_get_member(change)); - if (view) - osengine_mappingview_add_entry(view, entry); + osync_trace(TRACE_INTERNAL, "Adding %p to logchanges", entry); + table->logchanges = g_list_append(table->logchanges, entry); } + i++; } + + osync_trace(TRACE_INTERNAL, "#logchanges: %i", g_list_length(table->logchanges)); osync_trace(TRACE_EXIT, "osengine_mappingtable_load: TRUE"); return TRUE; } @@ -180,22 +185,31 @@ return new_id; } -void osync_mappingtable_inject_changes(OSyncMappingTable *table) +void osengine_mappingtable_inject_changes(OSyncMappingTable *table) { + osync_trace(TRACE_ENTRY, "%s(%p)", __func__, table); OSyncEngine *engine = table->engine; + + char **uids = NULL; + int *types = NULL; + char *uid = NULL; + int type = 0; + int i = 0; + osync_db_load_changelog(table->engine->group, &uids, &types, NULL); - GList *c; - OSyncChange *change = NULL; - while ((change = g_list_nth_data(table->logchanges, 0))) { - table->logchange = g_list_remove(table->logchange, change); - OSyncMember *member = osync_change_get_member(change); - OSyncClient *client = osync_member_get_data(member); - - ITMessage *message = itm_message_new_signal(client, "NEW_CHANGE"); - itm_message_set_data(message, "change", change); - itm_message_reset_timeout(orig); - itm_queue_send(engine->incoming, message); + if (!uids) + send_engine_changed(engine); + + while ((uid = uids[i])) { + type = types[i]; + OSyncMappingEntry *entry = osengine_mappingtable_find_entry(table, uid); + osync_change_set_changetype(entry->change, type); + osync_trace(TRACE_INTERNAL, "Injecting %p with changetype %i", entry, osync_change_get_changetype(entry->change)); + osync_flag_attach(entry->fl_read, table->engine->cmb_read_all); + send_read_change(engine, entry); + i++; } + osync_trace(TRACE_EXIT, "%s", __func__); } OSyncMappingTable *_osengine_mappingtable_load_group(OSyncGroup *group) @@ -447,6 +461,7 @@ entry->fl_has_info = osync_flag_new(NULL); entry->fl_synced = osync_flag_new(NULL); entry->fl_deleted = osync_flag_new(NULL); + entry->fl_read = osync_flag_new(NULL); osync_flag_set(entry->fl_synced); if (mapping) @@ -468,6 +483,7 @@ osync_flag_free(entry->fl_has_info); osync_flag_free(entry->fl_synced); osync_flag_free(entry->fl_deleted); + osync_flag_free(entry->fl_read); entry->view->changes = g_list_remove(entry->view->changes, entry); entry->view = NULL; Geert: trunk/osengine/osengine_mapping_internals.h =================================================================== --- trunk/osengine/osengine_mapping_internals.h 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/osengine/osengine_mapping_internals.h 2005-03-17 14:58:35 UTC (rev 375) @@ -15,6 +15,7 @@ OSyncGroup *group; GList *views; GList *entries; + GList *logchanges; }; /*! @brief A view to the mappingtable, represents one source @@ -58,6 +59,7 @@ MSyncFlag *fl_has_info; MSyncFlag *fl_synced; MSyncFlag *fl_deleted; + MSyncFlag *fl_read; }; OSyncMappingTable *osengine_mappingtable_new(OSyncEngine *engine); @@ -71,6 +73,7 @@ void osengine_mappingtable_close(OSyncMappingTable *table); long long int osengine_mappingtable_get_next_id(OSyncMappingTable *table); void osengine_mappingtable_reset(OSyncMappingTable *table); +void osengine_mappingtable_inject_changes(OSyncMappingTable *table); OSyncMapping *osengine_mapping_new(OSyncMappingTable *table); void osengine_mapping_free(OSyncMapping *mapping); Geert: trunk/tests/check_multisync.c =================================================================== --- trunk/tests/check_multisync.c 2005-03-16 23:33:07 UTC (rev 374) +++ trunk/tests/check_multisync.c 2005-03-17 14:58:35 UTC (rev 375) @@ -1742,9 +1742,72 @@ synchronize_once(engine, NULL); - fail_unless(num_read == 0, NULL); - fail_unless(num_conflicts == 0, NULL); + fail_unless(num_read == 5, NULL); + fail_unless(num_conflicts == 2, NULL); + fail_unless(num_written == 0, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" != \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" != \"x\""), NULL); + maptable = mappingtable_load(group, 2, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "file", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "file", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "file", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1", "file", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1", "file", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1", "file", "data"); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + + osync_engine_set_conflict_callback(engine, conflict_handler_choose_modified, (void *)3); + synchronize_once(engine, NULL); + + fail_unless(num_read == 5, NULL); + fail_unless(num_conflicts == 2, NULL); + fail_unless(num_written == 4, NULL); + fail_unless(num_engine_end_conflicts == 1, NULL); + + fail_unless(!system("test \"x$(diff -x \".*\" data1 data2)\" = \"x\""), NULL); + fail_unless(!system("test \"x$(diff -x \".*\" data1 data3)\" = \"x\""), NULL); + + maptable = mappingtable_load(group, 2, 0); + check_mapping(maptable, 1, -1, 3, "testdata", "file", "data"); + check_mapping(maptable, 2, -1, 3, "testdata", "file", "data"); + check_mapping(maptable, 3, -1, 3, "testdata", "file", "data"); + check_mapping(maptable, 1, -1, 3, "testdata1", "file", "data"); + check_mapping(maptable, 2, -1, 3, "testdata1", "file", "data"); + check_mapping(maptable, 3, -1, 3, "testdata1", "file", "data"); + mappingtable_close(maptable); + + table = hashtable_load(group, 1, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + table = hashtable_load(group, 2, 1); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + + table = hashtable_load(group, 3, 2); + check_hash(table, "testdata"); + check_hash(table, "testdata1"); + osync_hashtable_close(table); + system("rm -f data1/*"); synchronize_once(engine, NULL); @@ -1880,7 +1943,7 @@ Suite *multisync_suite(void) { Suite *s = suite_create("Multisync"); - //Suite *s2 = suite_create("Multisync"); + Suite *s2 = suite_create("Multisync"); create_case(s, "multisync_easy_new", multisync_easy_new); create_case(s, "multisync_dual_new", multisync_dual_new); create_case(s, "multisync_triple_new", multisync_triple_new); @@ -1905,10 +1968,10 @@ create_case(s, "multisync_multi_conflict", multisync_multi_conflict); create_case(s, "multisync_delayed_conflict_handler", multisync_delayed_conflict_handler); - create_case(s, "multisync_conflict_ignore", multisync_conflict_ignore); + create_case(s2, "multisync_conflict_ignore", multisync_conflict_ignore); create_case(s, "multisync_conflict_ignore2", multisync_conflict_ignore2); - return s; + return s2; } int main(void) |