dav/sync.c

changeset 223
cbbdf207e67e
parent 222
7b73058d782e
child 224
4b55f05f4e00
--- a/dav/sync.c	Fri Mar 18 19:54:36 2016 +0100
+++ b/dav/sync.c	Sat Mar 19 12:34:32 2016 +0100
@@ -352,14 +352,14 @@
     // store db
     if(store_db(db, dir->database)) {
         fprintf(stderr, "Cannot store sync db\n");
-        ret = -1;
+        ret = -2;
     }
     
-    // TODO: cleanup - BUT DONT CLEANUP SYNC CONFIG (do this in main!)
+    // TODO: cleanup
     dav_session_destroy(sn);
     
     // Report
-    if(ret == 0) {
+    if(ret != -2) {
         char *str_success = sync_success == 1 ? "file" : "files";
         char *str_delete = sync_delete == 1 ? "file" : "files";
         char *str_error = sync_error == 1 ? "error" : "errors";
@@ -753,11 +753,11 @@
             if(res_isconflict(db, local_res)) {
                 printf("skip: %s\n", local_res->path);
                 sync_skipped++;
-                local_resource_free(local_res);
                 continue;
             }
             
             // upload every changed file
+            int error = 0;
             if (local_resource_is_changed(dir, db, local_res)) {
                 DavResource *res = dav_resource_new(sn, local_res->path);
                 if(!res) {
@@ -777,7 +777,6 @@
                     if(cdt && remote_resource_is_changed(sn, dir, db, local_res)) {
                         printf("conflict: %s\n", local_res->path);
                         sync_skipped++;
-                        local_resource_free(local_res);
                         continue;
                     }
                     
@@ -787,6 +786,7 @@
                         print_resource_error(sn, res->path);
                         ret = -1;
                         sync_error++;
+                        error = 1;
                     }
                 }
                 dav_resource_free(res);
@@ -794,14 +794,17 @@
             
             // remove every locally available resource from db->resource
             // the remaining elements are all deleted files
-            ucx_map_cstr_put(lclres, local_res->path, local_res);
+            elm->data = NULL;
+            if(!error) {
+                ucx_map_cstr_put(lclres, local_res->path, local_res);
+            }
+            
             LocalResource *lr = ucx_map_cstr_remove(db->resources, local_res->path);
             if(lr) {
                 local_resource_free(lr);
             }
         }
     }
-    ucx_list_free(resources);
     
     // delete all removed files
     if(ret == 0) {
@@ -820,6 +823,7 @@
             }
         }
     }
+    ucx_map_free_content(db->resources, (ucx_destructor)local_resource_free);
     ucx_map_free(db->resources);
     db->resources = lclres;
     
@@ -834,15 +838,22 @@
     // store db
     if(store_db(db, dir->database)) {
         fprintf(stderr, "Cannot store sync db\n");
-        ret = -1;
+        ret = -2;
     }
     
     // cleanup
     dav_session_destroy(sn);
-    ucx_list_free(resources); // content is already freed
+    while(resources) {
+        UcxList *next = resources->next;
+        if(resources->data) {
+            local_resource_free(resources->data);
+        }
+        free(resources);
+        resources = next;
+    }
     
     // Report
-    if(ret == 0) {
+    if(ret != -2) {
         char *str_success = sync_success == 1 ? "file" : "files";
         char *str_delete = sync_delete == 1 ? "file" : "files";
         char *str_skipped = sync_delete == 1 ? "file" : "files";

mercurial