dav/db.c

changeset 216
16d6b97fbf33
parent 215
781aee172901
child 222
7b73058d782e
equal deleted inserted replaced
215:781aee172901 216:16d6b97fbf33
57 xmlDoc *doc = doc = xmlNewDoc(BAD_CAST "1.0"); 57 xmlDoc *doc = doc = xmlNewDoc(BAD_CAST "1.0");
58 xmlNode *root = xmlNewNode(NULL, BAD_CAST "directory"); 58 xmlNode *root = xmlNewNode(NULL, BAD_CAST "directory");
59 xmlDocSetRootElement(doc, root); 59 xmlDocSetRootElement(doc, root);
60 if(xmlSaveFormatFileEnc(db_file, doc, "UTF-8", 1) != -1) { 60 if(xmlSaveFormatFileEnc(db_file, doc, "UTF-8", 1) != -1) {
61 db->resources = ucx_map_new(2048); 61 db->resources = ucx_map_new(2048);
62 db->remove = ucx_map_new(8); 62 //db->remove = ucx_map_new(8);
63 } else { 63 } else {
64 free(db); 64 free(db);
65 db = NULL; 65 db = NULL;
66 } 66 }
67 xmlFreeDoc(doc); 67 xmlFreeDoc(doc);
69 return db; 69 return db;
70 } 70 }
71 free(db_file); 71 free(db_file);
72 72
73 db->resources = ucx_map_new(2048); 73 db->resources = ucx_map_new(2048);
74 db->remove = ucx_map_new(16); 74 //db->remove = ucx_map_new(16);
75 db->conflict = ucx_map_new(16);
75 int error = 0; 76 int error = 0;
76 while(xmlTextReaderRead(reader)) { 77 while(xmlTextReaderRead(reader)) {
77 int type = xmlTextReaderNodeType(reader); 78 int type = xmlTextReaderNodeType(reader);
78 const xmlChar *name = xmlTextReaderConstName(reader); 79 const xmlChar *name = xmlTextReaderConstName(reader);
79 80
84 ucx_map_cstr_put(db->resources, res->path, res); 85 ucx_map_cstr_put(db->resources, res->path, res);
85 } else { 86 } else {
86 error = 1; 87 error = 1;
87 break; 88 break;
88 } 89 }
89 } else if(xstreq(name, "remove")) { 90 } else if(xstreq(name, "conflict")) {
90 LocalResource *res = process_remove(reader); 91 LocalResource *res = process_conflict(reader);
91 if(res) { 92 if(res) {
92 ucx_map_cstr_put(db->remove, res->path, res); 93 ucx_map_cstr_put(db->conflict, res->path, res);
93 } else { 94 } else {
94 error = 1; 95 error = 1;
95 break; 96 break;
96 } 97 }
97 } 98 }
171 } else { 172 } else {
172 return res; 173 return res;
173 } 174 }
174 } 175 }
175 176
176 LocalResource* process_remove(xmlTextReaderPtr reader) { 177 LocalResource* process_conflict(xmlTextReaderPtr reader) {
177 LocalResource *res = calloc(1, sizeof(LocalResource)); 178 LocalResource *res = calloc(1, sizeof(LocalResource));
178 179
179 int path = 0; 180 int path = 0;
180 while(xmlTextReaderRead(reader)) { 181 while(xmlTextReaderRead(reader)) {
181 int type = xmlTextReaderNodeType(reader); 182 int type = xmlTextReaderNodeType(reader);
187 } 188 }
188 } else if(type == XML_READER_TYPE_TEXT && path) { 189 } else if(type == XML_READER_TYPE_TEXT && path) {
189 const xmlChar *value = xmlTextReaderConstValue(reader); 190 const xmlChar *value = xmlTextReaderConstValue(reader);
190 res->path = strdup((char*)value); 191 res->path = strdup((char*)value);
191 } else if(XML_READER_TYPE_END_ELEMENT) { 192 } else if(XML_READER_TYPE_END_ELEMENT) {
192 if(xstreq(name, "remove")) { 193 if(xstreq(name, "conflict")) {
193 break; 194 break;
194 } else { 195 } else {
195 path = 0; 196 path = 0;
196 } 197 }
197 } 198 }
281 // </resource> 282 // </resource>
282 xmlTextWriterEndElement(writer); 283 xmlTextWriterEndElement(writer);
283 } 284 }
284 285
285 // write all remove entries 286 // write all remove entries
287 /*
286 i = ucx_map_iterator(db->remove); 288 i = ucx_map_iterator(db->remove);
287 UCX_MAP_FOREACH(key, res, i) { 289 UCX_MAP_FOREACH(key, res, i) {
288 // <remove> 290 // <remove>
289 xmlTextWriterStartElement(writer, BAD_CAST "remove"); 291 xmlTextWriterStartElement(writer, BAD_CAST "remove");
290 292
292 writer, 294 writer,
293 BAD_CAST "path", 295 BAD_CAST "path",
294 BAD_CAST res->path); 296 BAD_CAST res->path);
295 297
296 // </remove> 298 // </remove>
299 xmlTextWriterEndElement(writer);
300 }
301 */
302
303 // write all conflict entries
304 i = ucx_map_iterator(db->conflict);
305 UCX_MAP_FOREACH(key, res, i) {
306 // <conflict>
307 xmlTextWriterStartElement(writer, BAD_CAST "conflict");
308
309 xmlTextWriterWriteElement(
310 writer,
311 BAD_CAST "path",
312 BAD_CAST res->path);
313
314 // </conflict>
297 xmlTextWriterEndElement(writer); 315 xmlTextWriterEndElement(writer);
298 } 316 }
299 317
300 // end 318 // end
301 xmlTextWriterEndElement(writer); 319 xmlTextWriterEndElement(writer);

mercurial