dav/db.c

changeset 875
3b9ac2dd757d
parent 854
1c8401ece69e
child 886
da79af4baec8
equal deleted inserted replaced
874:8f0add189b2f 875:3b9ac2dd757d
32 #include <errno.h> 32 #include <errno.h>
33 33
34 #include "db.h" 34 #include "db.h"
35 35
36 #include <cx/utils.h> 36 #include <cx/utils.h>
37 #include <cx/array_list.h>
37 38
38 #include <libidav/utils.h> 39 #include <libidav/utils.h>
39 40
40 #include <libxml/encoding.h> 41 #include <libxml/encoding.h>
41 #include <libxml/xmlwriter.h> 42 #include <libxml/xmlwriter.h>
110 return db; 111 return db;
111 } 112 }
112 } 113 }
113 114
114 void process_parts(xmlTextReaderPtr reader, LocalResource *res) { 115 void process_parts(xmlTextReaderPtr reader, LocalResource *res) {
115 // TODO: rewrite using low level array 116 size_t parts_alloc = 32;
116 117 size_t parts_size = 0;
117 CxList *parts = cxLinkedListCreateSimple(CX_STORE_POINTERS); 118 FilePart *parts = calloc(parts_alloc, sizeof(FilePart));
118 119
119 FilePart *current_part = NULL; 120 FilePart *current_part = NULL;
120 121
121 size_t count = 0;
122 int field = -1; 122 int field = -1;
123 int err = 0; 123 int err = 0;
124 while(xmlTextReaderRead(reader)) { 124 while(xmlTextReaderRead(reader)) {
125 int type = xmlTextReaderNodeType(reader); 125 int type = xmlTextReaderNodeType(reader);
126 const xmlChar *name = xmlTextReaderConstName(reader); 126 const xmlChar *name = xmlTextReaderConstName(reader);
127 int depth = xmlTextReaderDepth(reader); 127 int depth = xmlTextReaderDepth(reader);
128 128
129 if(type == XML_READER_TYPE_ELEMENT) { 129 if(type == XML_READER_TYPE_ELEMENT) {
130 if(depth == 3 && xstreq(name, "part")) { 130 if(depth == 3 && xstreq(name, "part")) {
131 current_part = calloc(1, sizeof(FilePart)); 131 FilePart newpart = { 0 };
132 current_part->block = count; 132 cx_array_add(&parts, &parts_size, &parts_alloc, sizeof(FilePart), &newpart, cx_array_default_reallocator);
133 cxListAdd(parts, current_part); 133
134 count++; 134 current_part = &parts[parts_size-1];
135 current_part->block = parts_size;
135 } else if(depth == 4) { 136 } else if(depth == 4) {
136 if(xstreq(name, "hash")) { 137 if(xstreq(name, "hash")) {
137 field = 0; 138 field = 0;
138 } else if(xstreq(name, "etag")) { 139 } else if(xstreq(name, "etag")) {
139 field = 1; 140 field = 1;
162 } 163 }
163 } 164 }
164 } 165 }
165 166
166 if(!err) { 167 if(!err) {
167 FilePart *file_parts = calloc(count, sizeof(FilePart)); 168 res->parts = parts;
168 CxIterator iter = cxListIterator(parts); 169 res->numparts = parts_size;
169 cx_foreach(FilePart*, p, iter) { 170 } else {
170 file_parts[iter.index] = *p; 171 for(int i=0;i<parts_size;i++) {
171 free(p); 172 free(parts[i].etag);
172 } 173 free(parts[i].hash);
173 174 }
174 res->parts = file_parts; 175 free(parts);
175 res->numparts = count; 176 }
176 }
177
178 cxListFree(parts);
179 } 177 }
180 178
181 LocalResource* process_resource(xmlTextReaderPtr reader) { 179 LocalResource* process_resource(xmlTextReaderPtr reader) {
182 LocalResource *res = calloc(1, sizeof(LocalResource)); 180 LocalResource *res = calloc(1, sizeof(LocalResource));
183 181

mercurial