22 #include "engine_internals.h"
32 #ifndef DOXYGEN_SHOULD_SKIP_THIS
33 OSyncMappingTable *osengine_mappingtable_new(OSyncEngine *engine)
36 OSyncMappingTable *table = g_malloc0(
sizeof(OSyncMappingTable));
37 table->engine = engine;
38 table->group = engine->group;
41 for (c = engine->clients; c; c = c->next) {
42 OSyncClient *client = c->data;
43 osengine_mappingview_new(table, client);
50 void osengine_mappingtable_reset(OSyncMappingTable *table)
53 for (v = table->views; v; v = v->next) {
54 OSyncMappingView *view = v->data;
55 osengine_mappingview_reset(view);
59 void osengine_mappingtable_free(OSyncMappingTable *table)
65 GList *mappings = g_list_copy(table->mappings);
66 GList *unmapped = g_list_copy(table->unmapped);
67 GList *views = g_list_copy(table->views);
69 for (m = mappings; m; m = m->next) {
70 OSyncMapping *mapping = m->data;
71 osengine_mapping_free(mapping);
74 for (c = unmapped; c; c = c->next) {
75 OSyncMappingEntry *entry = c->data;
76 osengine_mappingentry_free(entry);
78 for (c = views; c; c = c->next) {
79 OSyncMappingView *view = c->data;
80 osengine_mappingview_free(view);
82 g_list_free(mappings);
83 g_list_free(unmapped);
89 OSyncMappingEntry *osengine_mappingtable_find_entry(OSyncMappingTable *table,
const char *uid,
const char *objtype,
long long int memberid)
93 int count_of_entries = 0;
94 OSyncMappingEntry *ret_entry = NULL;
95 for (v = table->views; v; v = v->next) {
96 OSyncMappingView *view = v->data;
102 for (c = view->changes; c; c = c->next) {
103 OSyncMappingEntry *entry = c->data;
104 g_assert(entry->change);
124 if(count_of_entries == 1 && ret_entry){
128 if(count_of_entries >1){
142 OSyncMappingEntry *osengine_mappingtable_store_change(OSyncMappingTable *table,
OSyncChange *change)
147 OSyncMappingEntry *entry = osengine_mappingview_store_change(view, change);
152 OSyncMapping *osengine_mappingtable_find_mapping(OSyncMappingTable *table,
OSyncChange *change)
155 for (m = table->mappings; m; m = m->next) {
156 OSyncMapping *mapping = m->data;
157 if (osengine_mapping_find_entry(mapping, change, NULL))
163 OSyncMapping *osengine_mappingtable_mapping_from_id(OSyncMappingTable *table,
long long int id)
166 for (m = table->mappings; m; m = m->next) {
167 OSyncMapping *mapping = m->data;
168 if (mapping->id ==
id)
174 OSyncMappingView *osengine_mappingtable_find_view(OSyncMappingTable *table,
OSyncMember *member)
177 for (v = table->views; v; v = v->next) {
178 OSyncMappingView *view = v->data;
185 void osengine_mappingtable_add_mapping(OSyncMappingTable *table, OSyncMapping *mapping)
187 table->mappings = g_list_append(table->mappings, mapping);
188 mapping->table = table;
191 osync_bool osengine_mappingtable_load(OSyncMappingTable *table,
OSyncError **error)
202 OSyncMapping *mapping = NULL;
203 while ((change = changes[i])) {
204 OSyncMappingEntry *entry = osengine_mappingentry_new(NULL);
205 entry->change = change;
210 table->unmapped = g_list_append(table->unmapped, entry);
213 mapping = osengine_mapping_new(table);
216 osengine_mapping_add_entry(mapping, entry);
219 osync_flag_set(entry->fl_has_data);
223 osengine_mappingview_add_entry(view, entry);
232 long long int osengine_mappingtable_get_next_id(OSyncMappingTable *table)
234 long long int new_id = 1;
236 for (m = table->mappings; m; m = m->next) {
237 OSyncMapping *mapping = m->data;
238 if (new_id <= mapping->
id)
239 new_id = mapping->id + 1;
244 void osengine_mappingtable_inject_changes(OSyncMappingTable *table)
250 char **objtypes = NULL;
251 long long int *memberids = NULL;
254 char *objtype = NULL;
260 for (i = 0; (uid = uids[i]) ; i++) {
262 objtype = objtypes[i];
263 long long int memberid = memberids[i];
264 OSyncMappingEntry *entry = osengine_mappingtable_find_entry(table, uid, objtype, memberid);
269 g_assert_not_reached();
274 osync_flag_attach(entry->fl_read, table->engine->cmb_read_all);
278 osync_flag_set(entry->fl_mapped);
286 OSyncMappingTable *_osengine_mappingtable_load_group(
OSyncGroup *group)
288 OSyncMappingTable *table = g_malloc0(
sizeof(OSyncMappingTable));
289 table->group = group;
294 OSyncMappingView *view = g_malloc0(
sizeof(OSyncMappingView));
295 table->views = g_list_append(table->views, view);
300 if (!osengine_mappingtable_load(table, NULL))
305 void osengine_mappingtable_close(OSyncMappingTable *table)
311 OSyncMapping *osengine_mapping_new(OSyncMappingTable *table)
314 OSyncMapping *mapping = g_malloc0(
sizeof(OSyncMapping));
315 osengine_mappingtable_add_mapping(table, mapping);
317 mapping->fl_solved = osync_flag_new(NULL);
319 mapping->fl_chkconflict = osync_flag_new(NULL);
320 osync_flag_set(mapping->fl_chkconflict);
322 mapping->fl_multiplied = osync_flag_new(NULL);
323 osync_flag_set(mapping->fl_multiplied);
325 mapping->cmb_has_data = osync_comb_flag_new(FALSE, FALSE);
326 osync_flag_set_pos_trigger(mapping->cmb_has_data, (OSyncFlagTriggerFunc)send_mapping_changed, table->engine, mapping);
328 mapping->cmb_has_info = osync_comb_flag_new(FALSE, FALSE);
330 mapping->cmb_synced = osync_comb_flag_new(FALSE, TRUE);
332 mapping->cmb_deleted = osync_comb_flag_new(FALSE, FALSE);
334 osync_flag_attach(mapping->cmb_synced, table->engine->cmb_synced);
335 osync_flag_attach(mapping->fl_multiplied, table->engine->cmb_multiplied);
336 osync_flag_attach(mapping->fl_chkconflict, table->engine->cmb_chkconflict);
342 void osengine_mapping_free(OSyncMapping *mapping)
346 while (g_list_nth_data(mapping->entries, 0))
347 osengine_mappingentry_free(g_list_nth_data(mapping->entries, 0));
349 osync_flag_detach(mapping->cmb_synced);
350 osync_flag_detach(mapping->fl_chkconflict);
351 osync_flag_detach(mapping->fl_multiplied);
353 mapping->table->mappings = g_list_remove(mapping->table->mappings, mapping);
354 osync_flag_free(mapping->fl_solved);
355 osync_flag_free(mapping->cmb_has_data);
356 osync_flag_free(mapping->cmb_has_info);
357 osync_flag_free(mapping->cmb_synced);
358 osync_flag_free(mapping->fl_chkconflict);
359 osync_flag_free(mapping->cmb_deleted);
360 osync_flag_free(mapping->fl_multiplied);
366 void osengine_mapping_add_entry(OSyncMapping *mapping, OSyncMappingEntry *entry)
369 g_assert(!osengine_mapping_find_entry(mapping, NULL, entry->view));
370 mapping->entries = g_list_append(mapping->entries, entry);
371 entry->mapping = mapping;
373 if (mapping->table->engine) {
374 osync_flag_attach(entry->fl_has_data, mapping->cmb_has_data);
375 osync_flag_attach(entry->fl_has_info, mapping->cmb_has_info);
376 osync_flag_attach(entry->fl_synced, mapping->cmb_synced);
377 osync_flag_attach(entry->fl_deleted, mapping->cmb_deleted);
378 osync_flag_set_pos_trigger(entry->fl_dirty, (OSyncFlagTriggerFunc)send_mappingentry_changed, mapping->table->engine, entry);
382 mapping->table->unmapped = g_list_remove(mapping->table->unmapped, entry);
383 mapping->table->entries = g_list_append(mapping->table->entries, entry);
386 void osengine_mapping_remove_entry(OSyncMapping *mapping, OSyncMappingEntry *entry)
388 mapping->entries = g_list_remove(mapping->entries, entry);
389 mapping->table->entries = g_list_remove(mapping->table->entries, entry);
390 entry->mapping = NULL;
392 osync_flag_detach(entry->fl_has_data);
393 osync_flag_detach(entry->fl_has_info);
394 osync_flag_detach(entry->fl_synced);
395 osync_flag_detach(entry->fl_deleted);
398 OSyncMappingEntry *osengine_mapping_find_entry(OSyncMapping *mapping,
OSyncChange *change, OSyncMappingView *view)
401 for (e = mapping->entries; e; e = e->next) {
402 OSyncMappingEntry *entry = e->data;
403 if (change && entry->change == change)
405 if (view && entry->view == view)
411 OSyncMappingEntry *osengine_mapping_nth_entry(OSyncMapping *mapping,
int nth)
413 return (OSyncMappingEntry *)g_list_nth_data(mapping->entries, nth);
416 int osengine_mapping_num_changes(OSyncMapping *mapping)
418 return g_list_length(mapping->entries);
421 OSyncChange *osengine_mapping_nth_change(OSyncMapping *mapping,
int nth)
423 OSyncMappingEntry *entry = g_list_nth_data(mapping->entries, nth);
426 return entry->change;
429 long long osengine_mapping_get_id(OSyncMapping *mapping)
434 void osengine_mapping_reset(OSyncMapping *mapping)
438 for (e = mapping->entries; e; e = e->next) {
439 OSyncMappingEntry *entry = e->data;
440 osengine_mappingentry_reset(entry);
443 osync_flag_set(mapping->fl_multiplied);
444 osync_flag_set(mapping->fl_chkconflict);
445 mapping->master = NULL;
449 void osengine_mapping_delete(OSyncMapping *mapping)
452 GList *entries = g_list_copy(mapping->entries);
454 for (c = entries; c; c = c->next) {
455 OSyncMappingEntry *entry = c->data;
458 g_list_free(entries);
459 osengine_mapping_free(mapping);
463 OSyncMappingView *osengine_mappingview_new(OSyncMappingTable *table, OSyncClient *client)
466 OSyncMappingView *view = g_malloc0(
sizeof(OSyncMappingView));
467 table->views = g_list_append(table->views, view);
468 view->client = client;
475 void osengine_mappingview_free(OSyncMappingView *view)
478 g_list_free(view->changes);
479 view->changes = NULL;
483 void osengine_mappingview_add_entry(OSyncMappingView *view, OSyncMappingEntry *entry)
485 view->changes = g_list_append(view->changes, entry);
489 OSyncMappingEntry *osengine_mappingview_store_change(OSyncMappingView *view,
OSyncChange *change)
494 for (c = view->changes; c; c = c->next) {
495 OSyncMappingEntry *entry = c->data;
496 g_assert(entry->change);
510 (change_objtype_name == NULL) ||
511 (entry_objtype_name == NULL) ||
512 (!strcmp(change_objtype_name, entry_objtype_name)) ||
513 (!strcmp(change_objtype_name,
"data")) ||
514 (!strcmp(entry_objtype_name,
"data"))
516 osengine_mappingentry_update(entry, change);
524 OSyncMappingEntry *newentry = osengine_mappingentry_new(NULL);
525 newentry->change = change;
526 newentry->client = view->client;
527 view->table->unmapped = g_list_append(view->table->unmapped, newentry);
528 osengine_mappingview_add_entry(view, newentry);
533 osync_bool osengine_mappingview_uid_is_unique(OSyncMappingView *view, OSyncMappingEntry *entry, osync_bool spare_deleted)
537 for (e = view->changes; e; e = e->next) {
538 OSyncMappingEntry *exentry = e->data;
545 void osengine_mappingview_reset(OSyncMappingView *view)
551 OSyncMappingEntry *osengine_mappingentry_new(OSyncMapping *mapping)
553 OSyncMappingEntry *entry = g_malloc0(
sizeof(OSyncMappingEntry));
555 entry->fl_has_data = osync_flag_new(NULL);
556 entry->fl_dirty = osync_flag_new(NULL);
557 entry->fl_mapped = osync_flag_new(NULL);
558 entry->fl_has_info = osync_flag_new(NULL);
559 entry->fl_synced = osync_flag_new(NULL);
560 entry->fl_deleted = osync_flag_new(NULL);
561 entry->fl_read = osync_flag_new(NULL);
562 entry->fl_committed = osync_flag_new(NULL);
563 osync_flag_set(entry->fl_synced);
566 osengine_mapping_add_entry(mapping, entry);
571 void osengine_mappingentry_free(OSyncMappingEntry *entry)
576 osengine_mapping_remove_entry(entry->mapping, entry);
578 osync_flag_free(entry->fl_has_data);
579 osync_flag_free(entry->fl_dirty);
580 osync_flag_free(entry->fl_mapped);
581 osync_flag_free(entry->fl_has_info);
582 osync_flag_free(entry->fl_synced);
583 osync_flag_free(entry->fl_deleted);
584 osync_flag_free(entry->fl_read);
585 osync_flag_free(entry->fl_committed);
587 entry->view->changes = g_list_remove(entry->view->changes, entry);
593 void osengine_mappingentry_update(OSyncMappingEntry *entry,
OSyncChange *change)
612 OSyncMappingEntry *osengine_mappingentry_copy(OSyncMappingEntry *entry)
614 OSyncMappingEntry *newentry = osengine_mappingentry_new(NULL);
618 newentry->client = entry->client;
619 osengine_mappingview_add_entry(entry->view, newentry);
623 void osengine_mappingentry_reset(OSyncMappingEntry *entry)
627 osync_flag_set(entry->fl_has_data);
628 osync_flag_unset(entry->fl_dirty);
629 osync_flag_unset(entry->fl_has_info);
630 osync_flag_unset(entry->fl_deleted);
631 osync_flag_set(entry->fl_synced);