dav/db.c

branch
ucx-3.1
changeset 816
839fefbdedc7
parent 747
efbd59642577
child 820
d0cccee15a7c
equal deleted inserted replaced
815:1f40ca07ae1b 816:839fefbdedc7
55 free(dav_dir); 55 free(dav_dir);
56 56
57 SyncDatabase *db = malloc(sizeof(SyncDatabase)); 57 SyncDatabase *db = malloc(sizeof(SyncDatabase));
58 db->resources = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 2048); 58 db->resources = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 2048);
59 db->conflict = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16); 59 db->conflict = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 16);
60 60
61 db->resources->destructor_data = (cx_destructor_func)local_resource_free; 61 cxDefineDestructor(db->resources, local_resource_free);
62 db->conflict->destructor_data = (cx_destructor_func)local_resource_free; 62 cxDefineDestructor(db->conflict, local_resource_free);
63 63
64 xmlTextReaderPtr reader = xmlReaderForFile(db_file, NULL, 0); 64 xmlTextReaderPtr reader = xmlReaderForFile(db_file, NULL, 0);
65 if(!reader) { 65 if(!reader) {
66 xmlDoc *doc = doc = xmlNewDoc(BAD_CAST "1.0"); 66 xmlDoc *doc = doc = xmlNewDoc(BAD_CAST "1.0");
67 xmlNode *root = xmlNewNode(NULL, BAD_CAST "directory"); 67 xmlNode *root = xmlNewNode(NULL, BAD_CAST "directory");
77 free(db_file); 77 free(db_file);
78 78
79 int error = 0; 79 int error = 0;
80 while(xmlTextReaderRead(reader)) { 80 while(xmlTextReaderRead(reader)) {
81 int type = xmlTextReaderNodeType(reader); 81 int type = xmlTextReaderNodeType(reader);
82 const xmlChar *name = xmlTextReaderConstName(reader); 82 const xmlChar *xmlName = xmlTextReaderConstName(reader);
83 83
84 if(type == XML_READER_TYPE_ELEMENT) { 84 if(type == XML_READER_TYPE_ELEMENT) {
85 if(xstreq(name, "resource")) { 85 if(xstreq(xmlName, "resource")) {
86 LocalResource *res = process_resource(reader); 86 LocalResource *res = process_resource(reader);
87 if(res) { 87 if(res) {
88 cxMapPut(db->resources, cx_hash_key_str(res->path), res); 88 cxMapPut(db->resources, cx_hash_key_str(res->path), res);
89 } else { 89 } else {
90 error = 1; 90 error = 1;
91 break; 91 break;
92 } 92 }
93 } else if(xstreq(name, "conflict")) { 93 } else if(xstreq(xmlName, "conflict")) {
94 LocalResource *res = process_conflict(reader); 94 LocalResource *res = process_conflict(reader);
95 if(res) { 95 if(res) {
96 cxMapPut(db->conflict, cx_hash_key_str(res->path), res); 96 cxMapPut(db->conflict, cx_hash_key_str(res->path), res);
97 } else { 97 } else {
98 error = 1; 98 error = 1;
113 113
114 void process_parts(xmlTextReaderPtr reader, LocalResource *res) { 114 void process_parts(xmlTextReaderPtr reader, LocalResource *res) {
115 // TODO: rewrite using low level array 115 // TODO: rewrite using low level array
116 116
117 CxList *parts = cxLinkedListCreateSimple(CX_STORE_POINTERS); 117 CxList *parts = cxLinkedListCreateSimple(CX_STORE_POINTERS);
118 parts->destructor_data = (cx_destructor_func)filepart_free; 118 cxDefineDestructor(parts, filepart_free);
119 119
120 FilePart *current_part = NULL; 120 FilePart *current_part = NULL;
121 121
122 size_t count = 0; 122 size_t count = 0;
123 int field = -1; 123 int field = -1;
409 return -1; 409 return -1;
410 } 410 }
411 xmlTextWriterStartElement(writer, BAD_CAST "directory"); 411 xmlTextWriterStartElement(writer, BAD_CAST "directory");
412 412
413 // write all resource entries 413 // write all resource entries
414 CxIterator i = cxMapIteratorValues(db->resources); 414 CxIterator iter = cxMapIteratorValues(db->resources);
415 LocalResource *res; 415 cx_foreach(LocalResource*, res, iter) {
416 cx_foreach(LocalResource*, res, i) {
417 // <resource> 416 // <resource>
418 xmlTextWriterStartElement(writer, BAD_CAST "resource"); 417 xmlTextWriterStartElement(writer, BAD_CAST "resource");
419 418
420 r = xmlTextWriterWriteElement( 419 r = xmlTextWriterWriteElement(
421 writer, 420 writer,
686 xmlTextWriterEndElement(writer); 685 xmlTextWriterEndElement(writer);
687 } 686 }
688 */ 687 */
689 688
690 // write all conflict entries 689 // write all conflict entries
691 i = cxMapIteratorValues(db->conflict); 690 iter = cxMapIteratorValues(db->conflict);
692 cx_foreach(LocalResource*, res, i) { 691 cx_foreach(LocalResource*, res, iter) {
693 // <conflict> 692 // <conflict>
694 xmlTextWriterStartElement(writer, BAD_CAST "conflict"); 693 xmlTextWriterStartElement(writer, BAD_CAST "conflict");
695 694
696 xmlTextWriterWriteElement( 695 xmlTextWriterWriteElement(
697 writer, 696 writer,
823 } 822 }
824 free(part); 823 free(part);
825 } 824 }
826 825
827 CxMap* create_hash_index(SyncDatabase *db) { 826 CxMap* create_hash_index(SyncDatabase *db) {
828 CxMap *hmap = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, db->resources->size + 64); 827 CxMap *hmap = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, cxMapSize(db->resources) + 64);
829 828
830 CxIterator i = cxMapIteratorValues(db->resources); 829 CxIterator i = cxMapIteratorValues(db->resources);
831 LocalResource *res;
832 cx_foreach(LocalResource*, res, i) { 830 cx_foreach(LocalResource*, res, i) {
833 if(res->hash) { 831 if(res->hash) {
834 cxMapPut(hmap, cx_hash_key_str(res->hash), res); 832 cxMapPut(hmap, cx_hash_key_str(res->hash), res);
835 } 833 }
836 } 834 }

mercurial