dav/scfg.c

changeset 200
cc474cf2c2f5
parent 198
44054c452de1
child 202
faa41a5e817d
--- a/dav/scfg.c	Sun Feb 28 11:21:05 2016 +0100
+++ b/dav/scfg.c	Sun Feb 28 13:39:59 2016 +0100
@@ -32,6 +32,7 @@
 #include <errno.h>
 #include <libidav/utils.h>
 #include <ucx/map.h>
+#include <ucx/utils.h>
 
 #include "scfg.h"
 
@@ -45,12 +46,43 @@
 
 static UcxMap *directories;
 
+static int create_default_sync_config(char *file) {
+    FILE *out = fopen(file, "w");
+    if(!out) {
+        perror("fopen");
+        return -1;
+    }
+    
+    fputs("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n", out);
+    fputs("<configuration>\n", out);
+    fputs("</configuration>\n", out);
+    fclose(out);
+    
+    return 0;
+}
+
 int load_sync_config() {
     char *file = util_concat_path(ENV_HOME, ".dav/sync.xml");
+    
+    struct stat s;
+    if(stat(file, &s)) {
+        switch(errno) {
+            case ENOENT: {
+                if(create_default_sync_config(file)) {
+                    return -1;
+                }
+                break;
+            }
+            default: {
+                perror("Cannot load sync.xml");
+            }
+        }
+        return 0;
+    }
+    
     xmlDoc *doc = xmlReadFile(file, NULL, 0);
     if(!doc) {
-        fprintf(stderr, "Missing or broken configuration file\n");
-        scfg_print_example();
+        fprintf(stderr, "Broken configuration file\n");
         return -1;
     }
     
@@ -200,30 +232,53 @@
     return 0;
 }
 
-void scfg_print_example() {
-    fprintf(stderr, 
-        "example sync.xml\n\n"
-        "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
-        "<configuration>\n"
-        "  <directory>\n"
-        "    <!-- identifier -->\n"
-        "    <name>documents</name>\n\n"
-        "    <!-- local path to the directory -->\n"
-        "    <path>/home/user/Documents</path>\n\n"
-        "    <!-- optional trash path -->\n"
-        "    <trash>.trash</trash>"
-        "    <!-- repository name specified in config.xml -->\n"
-        "    <repository>server</repository>\n\n"
-        "    <!-- collection to synchronize (optional) -->\n"
-        "    <collection>somecol</collection>\n\n"
-        "    <!-- database file name -->\n"
-        "    <database>documents-db.xml</database>\n"
-        "  </directory>\n"
-        "</configuration>\n");
+SyncDirectory* scfg_get_dir(char *name) {
+    return ucx_map_cstr_get(directories, name);
 }
 
-SyncDirectory* scfg_get_dir(char *name) {
-    return ucx_map_cstr_get(directories, name);
+
+int add_directory(SyncDirectory *dir) {
+    char *file = util_concat_path(ENV_HOME, ".dav/sync.xml");
+    xmlDoc *doc = xmlReadFile(file, NULL, 0);
+    if(!doc) {
+        free(file);
+        fprintf(stderr, "Cannot load config.xml\n");
+        return 1;
+    }
+    
+    xmlNode *root = xmlDocGetRootElement(doc);
+    
+    xmlNode *dirNode = xmlNewNode(NULL, BAD_CAST "directory");
+    xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t");
+    
+    xmlNewTextChild(dirNode, NULL, BAD_CAST "name", BAD_CAST dir->name);
+    xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t");
+    
+    xmlNewTextChild(dirNode, NULL, BAD_CAST "path", BAD_CAST dir->path);
+    xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t");
+    
+    xmlNewTextChild(dirNode, NULL, BAD_CAST "repository", BAD_CAST dir->repository);
+    xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t");
+    
+    if(dir->trash) {
+        xmlNewTextChild(dirNode, NULL, BAD_CAST "trash", BAD_CAST dir->trash);
+        xmlNodeAddContent(dirNode, BAD_CAST "\n\t\t");
+    }
+    xmlNewTextChild(dirNode, NULL, BAD_CAST "database", BAD_CAST dir->database);
+    xmlNodeAddContent(dirNode, BAD_CAST "\n\t");
+    
+    xmlNodeAddContent(root, BAD_CAST "\n\t");
+    xmlAddChild(root, dirNode);
+    xmlNodeAddContent(root, BAD_CAST "\n");
+    
+    int ret = 0;
+    if(xmlSaveFormatFileEnc(file, doc, "UTF-8", 1) == -1) {
+        ret = 1;
+    }
+    xmlFreeDoc(doc);
+    free(file);
+    
+    return ret;
 }
 
 int list_syncdirs() {
@@ -234,3 +289,29 @@
     }
     return 0;
 }
+
+char* generate_db_name(char *basename) {
+    char *dbname = NULL;
+    int count = -1;
+    while(!dbname) {
+        sstr_t name = count < 0 ?
+                ucx_sprintf("%s-db.xml", basename) : 
+                ucx_sprintf("%s%d-db.xml", basename, count);
+        count++;
+        
+        UcxMapIterator i = ucx_map_iterator(directories);
+        SyncDirectory *dir;
+        bool unique = true;
+        UCX_MAP_FOREACH(key, dir, i) {
+            if(!sstrcmp(name, sstr(dir->database))) {
+                unique = false;
+                break;
+            }
+        }
+        if(unique) {
+            dbname = name.ptr;
+            break;
+        }
+    }
+    return dbname;
+}

mercurial