dav/sync.c

changeset 603
8e7e072c18c1
parent 599
508cbc4d30ea
child 607
5dc7fe41e8f8
equal deleted inserted replaced
602:ff9e8d2e2f3c 603:8e7e072c18c1
1905 print_resource_error(sn, local_res->path); 1905 print_resource_error(sn, local_res->path);
1906 ret = -1; 1906 ret = -1;
1907 sync_error++; 1907 sync_error++;
1908 } 1908 }
1909 1909
1910 int abort = 0; 1910 //int abort = 0;
1911 1911
1912 dav_exists(res); 1912 dav_exists(res);
1913 if(sn->error == DAV_NOT_FOUND) { 1913 if(sn->error == DAV_NOT_FOUND) {
1914 // create collection 1914 // create collection
1915 // TODO: show 405 1915 // TODO: show 405
1917 if(sync_mkdir(dir, res, local_res) && sn->error != DAV_METHOD_NOT_ALLOWED) { 1917 if(sync_mkdir(dir, res, local_res) && sn->error != DAV_METHOD_NOT_ALLOWED) {
1918 print_resource_error(sn, res->path); 1918 print_resource_error(sn, res->path);
1919 ret = -1; 1919 ret = -1;
1920 sync_error++; 1920 sync_error++;
1921 error = 1; 1921 error = 1;
1922 abort = 1; 1922 //abort = 1;
1923 } else {
1924 // success
1925 if(local_res->metadata_updated) {
1926 sync_update_metadata(dir, sn, res, local_res);
1927 }
1928
1929 // remove old db entry (if it exists)
1930 // and add add new entry
1931 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
1932 ucx_map_cstr_put(db->resources, local_res->path, local_res);
1923 } 1933 }
1924 } else if(sn->error != DAV_OK) { 1934 } else if(sn->error != DAV_OK) {
1925 // dav_exists() failed 1935 // dav_exists() failed
1926 print_resource_error(sn, local_res->path); 1936 print_resource_error(sn, local_res->path);
1927 ret = -1; 1937 ret = -1;
1928 sync_error++; 1938 sync_error++;
1929 error = 1; 1939 error = 1;
1930 abort = 1; 1940 //abort = 1;
1931 }
1932
1933 if(local_res->metadata_updated && !abort) {
1934 sync_update_metadata(dir, sn, res, local_res);
1935 } 1941 }
1936 1942
1937 dav_resource_free(res); 1943 dav_resource_free(res);
1938
1939 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
1940 ucx_map_cstr_put(db->resources, local_res->path, local_res);
1941 } 1944 }
1942 1945
1943 // copy/move files 1946 // copy/move files
1944 DavBool copy = TRUE; 1947 DavBool copy = TRUE;
1945 if(!ls_copy) { 1948 if(!ls_copy) {
1986 if(err) { 1989 if(err) {
1987 sync_error++; 1990 sync_error++;
1988 print_resource_error(sn, res->path); 1991 print_resource_error(sn, res->path);
1989 ret = -1; 1992 ret = -1;
1990 error = 1; 1993 error = 1;
1991 } 1994 } else {
1992 1995 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local->path);
1993 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local->path); 1996 ucx_map_cstr_put(db->resources, local->path, local);
1994 ucx_map_cstr_put(db->resources, local->path, local); 1997 }
1995 1998
1996 if(copy && !elm->next) { 1999 if(copy && !elm->next) {
1997 // finished copy, begin move 2000 // finished copy, begin move
1998 elm->next = ls_move; 2001 elm->next = ls_move;
1999 copy = FALSE; 2002 copy = FALSE;
2003 // upload changed files 2006 // upload changed files
2004 ls_modified = ucx_list_concat(ls_new, ls_modified); 2007 ls_modified = ucx_list_concat(ls_new, ls_modified);
2005 2008
2006 for(UcxList *elm=ls_modified;elm && !sync_shutdown;elm=elm->next) { 2009 for(UcxList *elm=ls_modified;elm && !sync_shutdown;elm=elm->next) {
2007 LocalResource *local_res = elm->data; 2010 LocalResource *local_res = elm->data;
2011 int err = 0;
2008 2012
2009 DavResource *res = dav_resource_new(sn, local_res->path); 2013 DavResource *res = dav_resource_new(sn, local_res->path);
2010 if(!res) { 2014 if(!res) {
2011 print_resource_error(sn, local_res->path); 2015 print_resource_error(sn, local_res->path);
2012 ret = -1; 2016 ret = -1;
2013 sync_error++; 2017 sync_error++;
2014 }
2015
2016 int changed = remote_resource_is_changed(sn, dir, db, res, local_res);
2017 if(cdt && changed) {
2018 printf("conflict: %s\n", local_res->path);
2019 local_res->last_modified = 0;
2020 nullfree(local_res->etag);
2021 local_res->etag = NULL;
2022 nullfree(local_res->hash);
2023 local_res->hash = NULL;
2024 local_res->skipped = TRUE;
2025 sync_conflict++;
2026 } else { 2018 } else {
2027 if(local_res->link_target) { 2019 int changed = remote_resource_is_changed(sn, dir, db, res, local_res);
2028 printf( 2020 if(cdt && changed) {
2029 "link: %s -> %s\n", 2021 printf("conflict: %s\n", local_res->path);
2030 local_res->path, 2022 local_res->last_modified = 0;
2031 local_res->link_target); 2023 nullfree(local_res->etag);
2024 local_res->etag = NULL;
2025 nullfree(local_res->hash);
2026 local_res->hash = NULL;
2027 local_res->skipped = TRUE;
2028 sync_conflict++;
2032 } else { 2029 } else {
2033 printf("put: %s\n", local_res->path); 2030 if(local_res->link_target) {
2034 } 2031 printf(
2035 if(sync_put_resource(dir, res, local_res, &sync_success)) { 2032 "link: %s -> %s\n",
2036 sync_error++; 2033 local_res->path,
2037 print_resource_error(sn, res->path); 2034 local_res->link_target);
2038 ret = -1; 2035 } else {
2039 error = 1; 2036 printf("put: %s\n", local_res->path);
2037 }
2038 if(sync_put_resource(dir, res, local_res, &sync_success)) {
2039 sync_error++;
2040 print_resource_error(sn, res->path);
2041 ret = -1;
2042 error = 1;
2043
2044 err = 1;
2045 }
2046 }
2047
2048 if(!err) {
2049 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
2050 ucx_map_cstr_put(db->resources, local_res->path, local_res);
2040 } 2051 }
2041 } 2052 }
2042 2053
2043 dav_resource_free(res); 2054 dav_resource_free(res);
2044
2045 LocalResource *dbres = ucx_map_cstr_remove(db->resources, local_res->path);
2046 ucx_map_cstr_put(db->resources, local_res->path, local_res);
2047 //if(dbres) local_resource_free(dbres);
2048 } 2055 }
2049 2056
2050 // metadata updates 2057 // metadata updates
2051 for(UcxList *elm=ls_update;elm && !sync_shutdown;elm=elm->next) { 2058 for(UcxList *elm=ls_update;elm && !sync_shutdown;elm=elm->next) {
2052 LocalResource *local_res = elm->data; 2059 LocalResource *local_res = elm->data;

mercurial