dav/db.c

changeset 521
c5bbae4b3cca
parent 367
4a6a59f89f9f
child 522
46f96dcd6eab
equal deleted inserted replaced
520:da2b0cc44e4f 521:c5bbae4b3cca
27 */ 27 */
28 28
29 #include <stdio.h> 29 #include <stdio.h>
30 #include <stdlib.h> 30 #include <stdlib.h>
31 #include <string.h> 31 #include <string.h>
32 #include <errno.h>
32 33
33 #include "db.h" 34 #include "db.h"
34 35
35 #include <libidav/utils.h> 36 #include <libidav/utils.h>
36 37
122 field = 2; 123 field = 2;
123 } else if(xstreq(name, "size")) { 124 } else if(xstreq(name, "size")) {
124 field = 3; 125 field = 3;
125 } else if(xstreq(name, "tags-hash")) { 126 } else if(xstreq(name, "tags-hash")) {
126 field = 4; 127 field = 4;
128 } else if(xstreq(name, "mode")) {
129 field = 5;
130 } else if(xstreq(name, "uid")) {
131 field = 6;
132 } else if(xstreq(name, "gid")) {
133 field = 7;
134 } else if(xstreq(name, "xattr-hash")) {
135 field = 8;
127 } else if(xstreq(name, "skipped")) { 136 } else if(xstreq(name, "skipped")) {
128 res->skipped = TRUE; 137 res->skipped = TRUE;
129 } else if(xstreq(name, "tags-updated")) { 138 } else if(xstreq(name, "tags-updated")) {
130 res->tags_updated = TRUE; 139 res->tags_updated = TRUE;
131 } 140 }
167 } 176 }
168 case 4: { 177 case 4: {
169 res->tags_hash = strdup((char*)value); 178 res->tags_hash = strdup((char*)value);
170 break; 179 break;
171 } 180 }
181 case 5: {
182 char *end;
183 long int mode = strtol((char*)value, &end, 8);
184 if(errno == 0) {
185 res->mode = (mode_t)mode;
186 }
187 break;
188 }
189 case 6: {
190 uint64_t uid = 0;
191 if(util_strtouint((char*)value, &uid)) {
192 res->uid = (uid_t)uid;
193 }
194 break;
195 }
196 case 7: {
197 uint64_t gid = 0;
198 if(util_strtouint((char*)value, &gid)) {
199 res->uid = (gid_t)gid;
200 }
201 break;
202 }
203 case 8: {
204 res->xattr_hash = strdup((char*)value);
205 break;
206 }
172 } 207 }
173 } else if(XML_READER_TYPE_END_ELEMENT) { 208 } else if(XML_READER_TYPE_END_ELEMENT) {
174 if(xstreq(name, "resource")) { 209 if(xstreq(name, "resource")) {
175 break; 210 break;
176 } else { 211 } else {
217 } else { 252 } else {
218 return res; 253 return res;
219 } 254 }
220 } 255 }
221 256
222 int store_db(SyncDatabase *db, char *name) { 257 int store_db(SyncDatabase *db, char *name, uint32_t settings) {
223 // open writer 258 // open writer
224 char *dav_dir = util_concat_path(ENV_HOME, ".dav"); 259 char *dav_dir = util_concat_path(ENV_HOME, ".dav");
225 char *db_file = util_concat_path(dav_dir, name); 260 char *db_file = util_concat_path(dav_dir, name);
226 free(dav_dir); 261 free(dav_dir);
227 xmlTextWriterPtr writer = xmlNewTextWriterFilename(db_file, 0); 262 xmlTextWriterPtr writer = xmlNewTextWriterFilename(db_file, 0);
279 fprintf(stderr, "Cannot write lastmodified\n"); 314 fprintf(stderr, "Cannot write lastmodified\n");
280 xmlFreeTextWriter(writer); 315 xmlFreeTextWriter(writer);
281 return -1; 316 return -1;
282 } 317 }
283 318
319 if(settings & DB_STORE_MODE == DB_STORE_MODE) {
320 r = xmlTextWriterWriteFormatElement(
321 writer,
322 BAD_CAST "mode",
323 "%o",
324 (int)res->mode);
325 if(r < 0) {
326 fprintf(stderr, "Cannot write mode\n");
327 xmlFreeTextWriter(writer);
328 return -1;
329 }
330 }
331
332 if(settings & DB_STORE_USER == DB_STORE_USER) {
333 r = xmlTextWriterWriteFormatElement(
334 writer,
335 BAD_CAST "uid",
336 "%u",
337 (unsigned int)res->uid);
338 if(r < 0) {
339 fprintf(stderr, "Cannot write uid\n");
340 xmlFreeTextWriter(writer);
341 return -1;
342 }
343 r = xmlTextWriterWriteFormatElement(
344 writer,
345 BAD_CAST "gid",
346 "%u",
347 (unsigned int)res->gid);
348 if(r < 0) {
349 fprintf(stderr, "Cannot write gid\n");
350 xmlFreeTextWriter(writer);
351 return -1;
352 }
353 }
354
284 r = xmlTextWriterWriteFormatElement( 355 r = xmlTextWriterWriteFormatElement(
285 writer, 356 writer,
286 BAD_CAST "size", 357 BAD_CAST "size",
287 "%" PRId64, 358 "%" PRId64,
288 (int64_t)res->size); 359 (int64_t)res->size);
302 xmlFreeTextWriter(writer); 373 xmlFreeTextWriter(writer);
303 return -1; 374 return -1;
304 } 375 }
305 } 376 }
306 377
378 if(res->xattr_hash) {
379 r = xmlTextWriterWriteElement(
380 writer,
381 BAD_CAST "xattr-hash",
382 BAD_CAST res->xattr_hash);
383 if(r < 0) {
384 fprintf(stderr, "Cannot write xattr-hash: %s\n", res->etag);
385 xmlFreeTextWriter(writer);
386 return -1;
387 }
388 }
389
307 if(res->skipped) { 390 if(res->skipped) {
308 r = xmlTextWriterStartElement(writer, BAD_CAST "skipped"); 391 r = xmlTextWriterStartElement(writer, BAD_CAST "skipped");
309 r += xmlTextWriterEndElement(writer); 392 r += xmlTextWriterEndElement(writer);
310 if(r < 0) { 393 if(r < 0) {
311 fprintf(stderr, "Cannot write skipped\n"); 394 fprintf(stderr, "Cannot write skipped\n");

mercurial