diff -r 08d5544c92fb -r c5759ac76c1b dav/db.c --- a/dav/db.c Sun Jun 15 20:12:48 2014 +0200 +++ b/dav/db.c Thu Jul 03 15:50:13 2014 +0200 @@ -46,19 +46,23 @@ #define ENV_HOME getenv("HOME") #endif /* _WIN32 */ -UcxMap* load_db(char *name) { +SyncDatabase* load_db(char *name) { char *dav_dir = util_concat_path(ENV_HOME, ".dav"); char *db_file = util_concat_path(dav_dir, name); free(dav_dir); + SyncDatabase *db = malloc(sizeof(SyncDatabase)); xmlTextReaderPtr reader = xmlReaderForFile(db_file, NULL, 0); if(!reader) { xmlDoc *doc = doc = xmlNewDoc(BAD_CAST "1.0"); xmlNode *root = xmlNewNode(NULL, BAD_CAST "directory"); xmlDocSetRootElement(doc, root); - UcxMap *db = NULL; if(xmlSaveFormatFileEnc(db_file, doc, "UTF-8", 1) != -1) { - db = ucx_map_new(2048); + db->resources = ucx_map_new(2048); + db->remove = ucx_map_new(8); + } else { + free(db); + db = NULL; } xmlFreeDoc(doc); free(db_file); @@ -66,7 +70,8 @@ } free(db_file); - UcxMap *map = ucx_map_new(2048); + db->resources = ucx_map_new(2048); + db->remove = ucx_map_new(16); int error = 0; while(xmlTextReaderRead(reader)) { int type = xmlTextReaderNodeType(reader); @@ -76,7 +81,15 @@ if(xstreq(name, "resource")) { LocalResource *res = process_resource(reader); if(res) { - ucx_map_cstr_put(map, res->path, res); + ucx_map_cstr_put(db->resources, res->path, res); + } else { + error = 1; + break; + } + } else if(xstreq(name, "remove")) { + LocalResource *res = process_remove(reader); + if(res) { + ucx_map_cstr_put(db->remove, res->path, res); } else { error = 1; break; @@ -90,7 +103,7 @@ // TODO: free resources and map return NULL; } else { - return map; + return db; } } @@ -160,7 +173,39 @@ } } -int store_db(UcxMap *db, char *name) { +LocalResource* process_remove(xmlTextReaderPtr reader) { + LocalResource *res = calloc(1, sizeof(LocalResource)); + + int path = 0; + while(xmlTextReaderRead(reader)) { + int type = xmlTextReaderNodeType(reader); + const xmlChar *name = xmlTextReaderConstName(reader); + + if(type == XML_READER_TYPE_ELEMENT) { + if(xstreq(name, "path")) { + path = 1; + } + } else if(type == XML_READER_TYPE_TEXT && path) { + const xmlChar *value = xmlTextReaderConstValue(reader); + res->path = strdup((char*)value); + } else if(XML_READER_TYPE_END_ELEMENT) { + if(xstreq(name, "remove")) { + break; + } else { + path = 0; + } + } + } + + if(!res->path) { + // TODO: free res + return NULL; + } else { + return res; + } +} + +int store_db(SyncDatabase *db, char *name) { // open writer char *dav_dir = util_concat_path(ENV_HOME, ".dav"); char *db_file = util_concat_path(dav_dir, name); @@ -183,7 +228,7 @@ xmlTextWriterStartElement(writer, BAD_CAST "directory"); // write all resource entries - UcxMapIterator i = ucx_map_iterator(db); + UcxMapIterator i = ucx_map_iterator(db->resources); LocalResource *res; UCX_MAP_FOREACH(key, res, i) { // @@ -237,6 +282,21 @@ xmlTextWriterEndElement(writer); } + // write all remove entries + i = ucx_map_iterator(db->remove); + UCX_MAP_FOREACH(key, res, i) { + // + xmlTextWriterStartElement(writer, BAD_CAST "remove"); + + xmlTextWriterWriteElement( + writer, + BAD_CAST "path", + BAD_CAST res->path); + + // + xmlTextWriterEndElement(writer); + } + // end xmlTextWriterEndElement(writer); r = xmlTextWriterEndDocument(writer);