Ticket #1183: xmlformat-2nd-level.diff

File xmlformat-2nd-level.diff, 10.2 KB (added by dgollub, 2 years ago)

xmlformat plugin patch to handle multiple levels in demerger

  • tests/check_merger.c

     
    88static OSyncCapabilities *_merger_assemble_caps(void) 
    99{ 
    1010        OSyncError *error; 
     11        OSyncCapability *cap, *child_cap; 
    1112 
    1213        OSyncCapabilities *capabilities = osync_capabilities_new("xmlformat-caps", &error); 
    1314        fail_unless(capabilities != NULL, NULL); 
     
    1617        OSyncCapabilitiesObjType *capsobjtype = osync_capabilities_objtype_new(capabilities, "contact", &error);  
    1718        fail_unless(capsobjtype != NULL, NULL); 
    1819 
    19         OSyncCapability *cap = osync_capability_new(capsobjtype, &error); 
    20         osync_capability_set_name(cap, "Name"); 
    21  
    2220        cap = osync_capability_new(capsobjtype, &error); 
    23         osync_capability_set_name(cap, "LastName"); 
     21        osync_capability_set_name(cap, "Address"); 
    2422 
    25         cap = osync_capability_new(capsobjtype, &error); 
    26         osync_capability_set_name(cap, "Telephone"); 
     23        child_cap = osync_capability_new_child(cap, &error); 
     24        osync_capability_set_name(child_cap, "City"); 
    2725 
     26        child_cap = osync_capability_new_child(cap, &error); 
     27        osync_capability_set_name(child_cap, "Region"); 
     28 
     29        child_cap = osync_capability_new_child(cap, &error); 
     30        osync_capability_set_name(child_cap, "Street"); 
     31 
    2832        cap = osync_capability_new(capsobjtype, &error); 
    2933        osync_capability_set_name(cap, "Categories"); 
    3034 
    3135        cap = osync_capability_new(capsobjtype, &error); 
    32         osync_capability_set_name(cap, "Address"); 
     36        osync_capability_set_name(cap, "Name"); 
    3337 
    34         cap = osync_capability_new(capsobjtype, &error); 
    35         osync_capability_set_name(cap, "Street"); 
     38//      child_cap = osync_capability_new_child(cap, &error); 
     39//      osync_capability_set_name(child_cap, "FirstName"); 
    3640 
    37         cap = osync_capability_new(capsobjtype, &error); 
    38         osync_capability_set_name(cap, "City"); 
     41        child_cap = osync_capability_new_child(cap, &error); 
     42        osync_capability_set_name(child_cap, "LastName"); 
    3943 
     44 
    4045        cap = osync_capability_new(capsobjtype, &error); 
    41         osync_capability_set_name(cap, "Region"); 
     46        osync_capability_set_name(cap, "Telephone"); 
    4247 
     48 
    4349        return capabilities; 
    4450} 
    4551 
     
    99105        OSyncXMLFormat *xmlformat, *xmlformat_entire; 
    100106        OSyncCapabilities *capabilities = _merger_assemble_caps(); 
    101107 
     108        OSyncCapabilitiesObjType *capsobjtype = osync_capabilities_get_objtype(capabilities, "contact"); 
     109        OSyncList *caplist = osync_capabilities_objtype_get_caps(capsobjtype); 
     110        for (; caplist; caplist = caplist->next) { 
     111                OSyncCapability *cap_cur = (OSyncCapability *) caplist->data; 
     112                printf("Capability: %s\n", osync_capability_get_name(cap_cur)); 
     113        } 
     114 
    102115        fail_unless(osync_file_read("contact.xml", &buffer, &size, &error), NULL); 
    103116        xmlformat = osync_xmlformat_parse(buffer, size, &error); 
    104117        fail_unless(xmlformat != NULL, NULL); 
     
    115128        osync_xmlformat_sort(xmlformat_entire, &error); 
    116129        fail_unless(error == NULL, NULL); 
    117130 
    118 //osync_xmlformat_assemble(xmlformat, &buffer, &size); printf("\n%s", buffer); g_free(buffer); 
    119 //osync_xmlformat_assemble(xmlformat_entire, &buffer, &size); printf("\n%s", buffer); g_free(buffer); 
     131osync_xmlformat_assemble(xmlformat, &buffer, &size, NULL); printf("XMLFORMAT:\n%s", buffer); g_free(buffer); 
     132osync_xmlformat_assemble(xmlformat_entire, &buffer, &size, NULL); printf("XMLFORMAT_ENTIRE\n%s", buffer); g_free(buffer); 
    120133         
    121         fail_unless(merge_xmlformat((char **) &xmlformat, &xmlformat_size, (char *) xmlformat_entire, osync_xmlformat_size(), capabilities, NULL, &error), NULL); 
    122 //osync_xmlformat_assemble(xmlformat, &buffer, &size); printf("\nMERGED:\n%s", buffer); g_free(buffer); 
    123         fail_unless(demerge_xmlformat((char **) &xmlformat, &xmlformat_size, capabilities, NULL, &error), NULL); 
    124 //osync_xmlformat_assemble(xmlformat, &buffer, &size); printf("\nDEMERGED:\n%s", buffer); g_free(buffer); 
     134//      fail_unless(merge_xmlformat((char **) &xmlformat, &xmlformat_size, (char *) xmlformat_entire, osync_xmlformat_size(), capabilities, NULL, &error), NULL); 
     135//osync_xmlformat_assemble(xmlformat, &buffer, &size, NULL); printf("\nMERGED:\n%s", buffer); g_free(buffer); 
     136        fail_unless(demerge_xmlformat((char **) &xmlformat_entire, &xmlformat_size, capabilities, NULL, &error), NULL); 
     137osync_xmlformat_assemble(xmlformat_entire, &buffer, &size, NULL); printf("\nDEMERGED:\n%s", buffer); g_free(buffer); 
    125138 
    126139        osync_capabilities_unref(capabilities); 
    127140        osync_xmlformat_unref(xmlformat); 
     
    134147Suite *filter_suite(void) 
    135148{ 
    136149        Suite *s = suite_create("Merger"); 
    137         create_case(s, "merger_merge", merger_merge); 
     150//      create_case(s, "merger_merge", merger_merge); 
    138151        create_case(s, "merger_demerge", merger_demerge); 
    139152        return s; 
    140153} 
  • tests/check_xmlformat.c

     
    199199        }; 
    200200 
    201201        result = xmlformat_compare((OSyncXMLFormat*)xmlformat1, (OSyncXMLFormat*)xmlformat2, points, 0, 100); 
     202 
     203osync_xmlformat_assemble(xmlformat1, &buffer1, &size1, NULL); printf("\nXMLFORMAT1:\n%s", buffer1); g_free(buffer1); 
     204osync_xmlformat_assemble(xmlformat2, &buffer2, &size2, NULL); printf("\nXMLFORMAT2:\n%s", buffer2); g_free(buffer2); 
     205 
    202206        fail_unless(result == OSYNC_CONV_DATA_SAME, NULL); 
    203207 
    204208        result = xmlformat_compare((OSyncXMLFormat*)xmlformat2, (OSyncXMLFormat*)xmlformat1, points, 0, 100); 
  • tests/data/merger/capabilities.xml

     
    22<capabilities> 
    33          <!-- Contacts for the brand new Foo 2000 --> 
    44        <contact> 
    5                 <Name> 
    6                         <LastName /> 
    7                 </Name> 
    8                 <Telephone /> 
    9                 <Categories /> 
    105                <Address> 
    116                        <Street /> 
    127                        <City /> 
    138                        <Region /> 
    149                </Address> 
     10                <Categories /> 
     11                <Name> 
     12                        <LastName /> 
     13                </Name> 
     14                <Telephone /> 
    1515        </contact> 
    1616</capabilities> 
  • tests/data/merger/contact-full.xml

     
    11<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    22<contact version="1"> 
    3         <Telephone Type="Cellular"> 
    4                 <Content>123Full</Content> 
    5         </Telephone> 
    63        <Name> 
    7                 <FirstName>JohnFull123</FirstName> 
    8                 <FirstName>JohnFull1123</FirstName> 
    9                 <FirstName>JohnFull11123</FirstName> 
    10                 <LastName>DoeFull</LastName> 
     4                <FirstName>John</FirstName> 
     5                <LastName>Doe</LastName> 
    116        </Name> 
    12         <Address> 
    13                 <City>city</City> 
    14                 <Region>region</Region> 
    15                 <Street>street</Street> 
    16         </Address> 
    17         <Aim> 
    18                 <Content>112</Content> 
    19         </Aim> 
    20         <Icq> 
    21                 <Content>65465469</Content> 
    22         </Icq> 
    237</contact> 
  • tests/data/merger/contact.xml

     
    11<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    22<contact version="1"> 
    3         <Telephone Type="Cellular"> 
    4                 <Content>123</Content> 
    5         </Telephone> 
    63        <Name> 
    7                 <FirstName></FirstName> 
    8                 <FirstName></FirstName> 
    9                 <FirstName></FirstName> 
    104                <LastName>Doe</LastName> 
    11                 <DickeBeats>1</DickeBeats> 
    12                 <DickeBeats>2</DickeBeats> 
    13                 <DickeBeats>3</DickeBeats> 
    145        </Name> 
    156</contact> 
  • src/xmlformat_merge.c

     
    157157                                } 
    158158                        else if(ret > 0) 
    159159                                { 
     160 
    160161                                        tmp = old_cur; 
    161162                                        old_cur = osync_xmlfield_get_next(old_cur); 
    162163                                        osync_xmlfield_adopt_xmlfield_before_field(new_cur, tmp); 
     
    213214                                } 
    214215                                break;                   
    215216                        } 
    216                  
     217 
    217218                        rc = strcmp(osync_xmlfield_get_name(cur_xmlfield), osync_capability_get_name(cur_capability)); 
    218219                        if(rc == 0) { 
     220 
    219221                                /* check the secound level here */ 
    220222                                if(osync_capability_get_childs(cur_capability)) /* if there is no key - it means that the xmlfield can handle all keys */ 
    221223                                        { 
    222224                                                int i, j=0; 
    223225                                                int capability_keys = osync_list_length(osync_capability_get_childs(cur_capability)); 
    224226                                                int xmlfield_keys = osync_xmlfield_get_key_count(cur_xmlfield); 
    225                                  
    226                                                 for(i=0; i < xmlfield_keys; i++) 
    227                                                         { 
    228                                                                 int krc = 0; 
    229                                                                 if(j == capability_keys) { 
    230                                                                         for(; i < xmlfield_keys; i++) { 
    231                                                                                 osync_trace(TRACE_INTERNAL, "Demerge XMLField Key: %s->%s",     osync_xmlfield_get_name(cur_xmlfield), osync_xmlfield_get_nth_key_name(cur_xmlfield, i)); 
    232                                                                                 osync_xmlfield_set_nth_key_value(cur_xmlfield, i, ""); 
    233                                                                         } 
    234                                                                         break; 
     227                                                OSyncXMLField *child_xmlfield = osync_xmlfield_get_child(cur_xmlfield); 
     228 
     229                                                for(; child_xmlfield; child_xmlfield = osync_xmlfield_get_next(child_xmlfield)) { 
     230                                                        int krc = 0; 
     231                                                        if(j == capability_keys) { 
     232                                                                for (; child_xmlfield; child_xmlfield = osync_xmlfield_get_next(child_xmlfield)) { 
     233                                                                        osync_trace(TRACE_INTERNAL, "Demerge XMLField Key: %s", osync_xmlfield_get_name(cur_xmlfield)); 
     234                                                                        osync_xmlfield_delete(child_xmlfield); 
    235235                                                                } 
     236                                                                break; 
     237                                                        } 
    236238                                         
    237                                                                 krc = strcmp(osync_xmlfield_get_nth_key_name(cur_xmlfield, i), osync_list_nth_data(osync_capability_get_childs(cur_capability), j)); 
    238                                                                 if(krc == 0) { 
    239                                                                         continue; 
    240                                                                 }        
    241                                                                 if(krc > 0) { 
    242                                                                         j++; 
    243                                                                         continue; 
    244                                                                 } 
    245                                                                 if(krc < 0) { 
    246                                                                         osync_trace(TRACE_INTERNAL, "Demerge XMLField Key: %s->%s",     osync_xmlfield_get_name(cur_xmlfield), osync_xmlfield_get_nth_key_name(cur_xmlfield, i)); 
    247                                                                         osync_xmlfield_set_nth_key_value(cur_xmlfield, i, ""); 
    248                                                                         continue; 
    249                                                                 } 
    250                                                                 g_assert_not_reached(); 
     239                                                        OSyncCapability *child_cap = osync_list_nth_data(osync_capability_get_childs(cur_capability), j); 
     240                                                        krc = strcmp(osync_xmlfield_get_name(child_xmlfield), osync_capability_get_name(child_cap)); 
     241                                                        if(krc == 0) { 
     242                                                                continue; 
     243                                                        }        
     244                                                        if(krc > 0) { 
     245                                         
     246                                                                j++; 
     247                                                                continue; 
    251248                                                        } 
     249                                                        if(krc < 0) { 
     250                                                                osync_trace(TRACE_INTERNAL, "Demerge XMLField Key: %s", osync_xmlfield_get_name(child_xmlfield)); 
     251                                                                osync_xmlfield_delete(child_xmlfield); 
     252                                                                continue; 
     253                                                        } 
     254                                                        g_assert_not_reached(); 
     255                                                } 
    252256                                        } 
    253257                                cur_xmlfield = osync_xmlfield_get_next(cur_xmlfield); 
    254258                                continue;