dav/db.c

changeset 521
c5bbae4b3cca
parent 367
4a6a59f89f9f
child 522
46f96dcd6eab
--- a/dav/db.c	Wed Mar 13 12:52:24 2019 +0100
+++ b/dav/db.c	Wed Mar 13 15:05:40 2019 +0100
@@ -29,6 +29,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 
 #include "db.h"
 
@@ -124,6 +125,14 @@
                 field = 3;
             } else if(xstreq(name, "tags-hash")) {
                 field = 4;
+            } else if(xstreq(name, "mode")) {
+                field = 5;
+            } else if(xstreq(name, "uid")) {
+                field = 6;
+            } else if(xstreq(name, "gid")) {
+                field = 7;
+            } else if(xstreq(name, "xattr-hash")) {
+                field = 8;
             } else if(xstreq(name, "skipped")) {
                 res->skipped = TRUE;
             } else if(xstreq(name, "tags-updated")) {
@@ -169,6 +178,32 @@
                     res->tags_hash = strdup((char*)value);
                     break;
                 }
+                case 5: {
+                    char *end;
+                    long int mode = strtol((char*)value, &end, 8);
+                    if(errno == 0) {
+                        res->mode = (mode_t)mode;
+                    }
+                    break;
+                }
+                case 6: {
+                    uint64_t uid = 0;
+                    if(util_strtouint((char*)value, &uid)) {
+                        res->uid = (uid_t)uid;
+                    }
+                    break;
+                }
+                case 7: {
+                    uint64_t gid = 0;
+                    if(util_strtouint((char*)value, &gid)) {
+                        res->uid = (gid_t)gid;
+                    }
+                    break;
+                }
+                case 8: {
+                    res->xattr_hash = strdup((char*)value);
+                    break;
+                }
             }
         } else if(XML_READER_TYPE_END_ELEMENT) {
             if(xstreq(name, "resource")) {
@@ -219,7 +254,7 @@
     }
 }
 
-int store_db(SyncDatabase *db, char *name) {
+int store_db(SyncDatabase *db, char *name, uint32_t settings) {
     // open writer
     char *dav_dir = util_concat_path(ENV_HOME, ".dav");
     char *db_file = util_concat_path(dav_dir, name);
@@ -281,6 +316,42 @@
             return -1;
         }
         
+        if(settings & DB_STORE_MODE == DB_STORE_MODE) {
+            r = xmlTextWriterWriteFormatElement(
+                writer,
+                BAD_CAST "mode",
+                "%o",
+                (int)res->mode);
+            if(r < 0) {
+                fprintf(stderr, "Cannot write mode\n");
+                xmlFreeTextWriter(writer);
+                return -1;
+            }
+        }
+        
+        if(settings & DB_STORE_USER == DB_STORE_USER) {
+            r = xmlTextWriterWriteFormatElement(
+                    writer,
+                    BAD_CAST "uid",
+                    "%u",
+                    (unsigned int)res->uid);
+            if(r < 0) {
+                fprintf(stderr, "Cannot write uid\n");
+                xmlFreeTextWriter(writer);
+                return -1;
+            }
+            r = xmlTextWriterWriteFormatElement(
+                    writer,
+                    BAD_CAST "gid",
+                    "%u",
+                    (unsigned int)res->gid);
+            if(r < 0) {
+                fprintf(stderr, "Cannot write gid\n");
+                xmlFreeTextWriter(writer);
+                return -1;
+            }
+        }
+        
         r = xmlTextWriterWriteFormatElement(
                 writer,
                 BAD_CAST "size",
@@ -304,6 +375,18 @@
             }
         }
         
+        if(res->xattr_hash) {
+            r = xmlTextWriterWriteElement(
+                    writer,
+                    BAD_CAST "xattr-hash",
+                    BAD_CAST res->xattr_hash);
+            if(r < 0) {
+                fprintf(stderr, "Cannot write xattr-hash: %s\n", res->etag);
+                xmlFreeTextWriter(writer);
+                return -1;
+            }
+        }
+        
         if(res->skipped) {
             r = xmlTextWriterStartElement(writer, BAD_CAST "skipped");
             r += xmlTextWriterEndElement(writer);

mercurial