dav/db.c

changeset 49
c5759ac76c1b
parent 47
fbbbeed4ba8f
child 75
56962faf2b42
--- 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) {
         // <resource>
@@ -237,6 +282,21 @@
         xmlTextWriterEndElement(writer);
     }
     
+    // write all remove entries
+    i = ucx_map_iterator(db->remove);
+    UCX_MAP_FOREACH(key, res, i) {
+        // <remove>
+        xmlTextWriterStartElement(writer, BAD_CAST "remove");
+        
+        xmlTextWriterWriteElement(
+                    writer,
+                    BAD_CAST "path",
+                    BAD_CAST res->path);
+        
+        // </remove>
+        xmlTextWriterEndElement(writer);
+    }
+    
     // end
     xmlTextWriterEndElement(writer);
     r = xmlTextWriterEndDocument(writer);

mercurial