| 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 |