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"); |