diff -r 0542668d0f26 -r fbbbeed4ba8f dav/db.c --- a/dav/db.c Fri Jun 13 13:52:59 2014 +0200 +++ b/dav/db.c Sun Jun 15 16:07:11 2014 +0200 @@ -34,6 +34,9 @@ #include +#include +#include + #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b) @@ -50,9 +53,16 @@ xmlTextReaderPtr reader = xmlReaderForFile(db_file, NULL, 0); if(!reader) { - fprintf(stderr, "Cannot open database file: %s\n", db_file); + xmlDoc *doc = doc = xmlNewDoc(BAD_CAST "1.0"); + xmlNode *root = xmlNewNode(NULL, BAD_CAST "directory"); + xmlDocSetRootElement(doc, root); + UcxMap *db = NULL; + if(xmlSaveFormatFileEnc(db_file, doc, "UTF-8", 1) != -1) { + db = ucx_map_new(2048); + } + xmlFreeDoc(doc); free(db_file); - return NULL; + return db; } free(db_file); @@ -107,7 +117,7 @@ int b = 0; switch(field) { case 0: { - res->name = strdup((char*)value); + res->path = strdup((char*)value); break; } case 1: { @@ -115,7 +125,17 @@ break; } case 2: { - res->last_modified = util_parse_lastmodified((char*)value); + //res->last_modified = util_parse_lastmodified((char*)value); + //res->last_modified = atoi((char*)value); + char *endptr = (char*)value; + time_t t = strtoll((char*)value, &endptr, 10); + if(endptr == (char*)value) { + fprintf( + stderr, + "lastmodified contains not a number: %s\n", value); + } else { + res->last_modified = t; + } break; } case 3: { @@ -132,7 +152,7 @@ } } - if(!res->name || !res->path || res->last_modified == 0) { + if(!res->path || res->last_modified == 0) { // TODO: free res return NULL; } else { @@ -141,6 +161,89 @@ } int store_db(UcxMap *db, char *name) { - // TODO: + // open writer + char *dav_dir = util_concat_path(ENV_HOME, ".dav"); + char *db_file = util_concat_path(dav_dir, name); + free(dav_dir); + xmlTextWriterPtr writer = xmlNewTextWriterFilename(db_file, 0); + if(!writer) { + fprintf(stderr, "Cannot write db file: %s\n", db_file); + free(db_file); + return -1; + } + free(db_file); + + // start document + int r = 0; + r = xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL); + if(r < 0) { + xmlFreeTextWriter(writer); + return -1; + } + xmlTextWriterStartElement(writer, BAD_CAST "directory"); + // write all resource entries + UcxMapIterator i = ucx_map_iterator(db); + LocalResource *res; + UCX_MAP_FOREACH(key, res, i) { + // + xmlTextWriterStartElement(writer, BAD_CAST "resource"); + + r = xmlTextWriterWriteElement( + writer, + BAD_CAST "path", + BAD_CAST res->path); + if(r < 0) { + fprintf(stderr, "Cannot write path: %s\n", res->path); + xmlFreeTextWriter(writer); + return -1; + } + + if(res->etag) { + r = xmlTextWriterWriteElement( + writer, + BAD_CAST "etag", + BAD_CAST res->etag); + if(r < 0) { + fprintf(stderr, "Cannot write etag: %s\n", res->etag); + xmlFreeTextWriter(writer); + return -1; + } + } + + r = xmlTextWriterWriteFormatElement( + writer, + BAD_CAST "lastmodified", + "%" PRId64, + (int64_t)res->last_modified); + if(r < 0) { + fprintf(stderr, "Cannot write lastmodified\n"); + xmlFreeTextWriter(writer); + return -1; + } + + r = xmlTextWriterWriteFormatElement( + writer, + BAD_CAST "size", + "%" PRId64, + (int64_t)res->size); + if(r < 0) { + fprintf(stderr, "Cannot write size\n"); + xmlFreeTextWriter(writer); + return -1; + } + + // + xmlTextWriterEndElement(writer); + } + + // end + xmlTextWriterEndElement(writer); + r = xmlTextWriterEndDocument(writer); + if(r < 0) { + xmlFreeTextWriter(writer); + return -1; + } + xmlFreeTextWriter(writer); + return 0; }