Mercurial > hg > audiodb
comparison query.cpp @ 472:0f96ad351990 api-inversion
Clean up some compiler warnings.
Yes, we must check return values from read(2). Make
audiodb_track_id_datum() be more paranoid, and audiodb_free_datum()
defend against potential double-frees as well (even though we're not
exposing that issue at this point).
author | mas01cr |
---|---|
date | Tue, 06 Jan 2009 15:25:39 +0000 |
parents | d3afc91d205d |
children | b2fd8113d8bc |
comparison
equal
deleted
inserted
replaced
470:c26c5b7ef0d2 | 472:0f96ad351990 |
---|---|
201 if(adb->header->flags & O2_FLAG_LARGE_ADB) { | 201 if(adb->header->flags & O2_FLAG_LARGE_ADB) { |
202 /* create a reference/insert, then use adb_insert_create_datum() */ | 202 /* create a reference/insert, then use adb_insert_create_datum() */ |
203 adb_reference_t reference = {0}; | 203 adb_reference_t reference = {0}; |
204 char features[MAXSTR], power[MAXSTR], times[MAXSTR]; | 204 char features[MAXSTR], power[MAXSTR], times[MAXSTR]; |
205 lseek(adb->fd, adb->header->dataOffset + track_id * O2_FILETABLE_ENTRY_SIZE, SEEK_SET); | 205 lseek(adb->fd, adb->header->dataOffset + track_id * O2_FILETABLE_ENTRY_SIZE, SEEK_SET); |
206 /* FIXME: learn not to worry and love the bomb^Wbuffer overflow */ | 206 read_or_goto_error(adb->fd, features, MAXSTR); |
207 read(adb->fd, features, MAXSTR); | |
208 reference.features = features; | 207 reference.features = features; |
209 if(adb->header->flags & O2_FLAG_POWER) { | 208 if(adb->header->flags & O2_FLAG_POWER) { |
210 lseek(adb->fd, adb->header->powerTableOffset + track_id * O2_FILETABLE_ENTRY_SIZE, SEEK_SET); | 209 lseek(adb->fd, adb->header->powerTableOffset + track_id * O2_FILETABLE_ENTRY_SIZE, SEEK_SET); |
211 read(adb->fd, power, MAXSTR); | 210 read_or_goto_error(adb->fd, power, MAXSTR); |
212 reference.power = power; | 211 reference.power = power; |
213 } | 212 } |
214 if(adb->header->flags & O2_FLAG_TIMES) { | 213 if(adb->header->flags & O2_FLAG_TIMES) { |
215 lseek(adb->fd, adb->header->timesTableOffset + track_id * O2_FILETABLE_ENTRY_SIZE, SEEK_SET); | 214 lseek(adb->fd, adb->header->timesTableOffset + track_id * O2_FILETABLE_ENTRY_SIZE, SEEK_SET); |
216 read(adb->fd, times, MAXSTR); | 215 read_or_goto_error(adb->fd, times, MAXSTR); |
217 reference.times = times; | 216 reference.times = times; |
218 } | 217 } |
219 audiodb_insert_create_datum(&reference, d); | 218 return audiodb_insert_create_datum(&reference, d); |
220 } else { | 219 } else { |
221 /* initialize from sources of data that we already have */ | 220 /* initialize from sources of data that we already have */ |
222 d->nvectors = (*adb->track_lengths)[track_id]; | 221 d->nvectors = (*adb->track_lengths)[track_id]; |
223 d->dim = adb->header->dim; | 222 d->dim = adb->header->dim; |
224 d->key = (*adb->keys)[track_id].c_str(); | 223 d->key = (*adb->keys)[track_id].c_str(); |
225 /* read out stuff from the database tables */ | 224 /* read out stuff from the database tables */ |
226 d->data = (double *) malloc(d->nvectors * d->dim * sizeof(double)); | 225 d->data = (double *) malloc(d->nvectors * d->dim * sizeof(double)); |
227 lseek(adb->fd, adb->header->dataOffset + track_offset, SEEK_SET); | 226 lseek(adb->fd, adb->header->dataOffset + track_offset, SEEK_SET); |
228 read(adb->fd, d->data, d->nvectors * d->dim * sizeof(double)); | 227 read_or_goto_error(adb->fd, d->data, d->nvectors * d->dim * sizeof(double)); |
229 if(adb->header->flags & O2_FLAG_POWER) { | 228 if(adb->header->flags & O2_FLAG_POWER) { |
230 d->power = (double *) malloc(d->nvectors * sizeof(double)); | 229 d->power = (double *) malloc(d->nvectors * sizeof(double)); |
231 lseek(adb->fd, adb->header->powerTableOffset + track_offset / d->dim, SEEK_SET); | 230 lseek(adb->fd, adb->header->powerTableOffset + track_offset / d->dim, SEEK_SET); |
232 read(adb->fd, d->power, d->nvectors * sizeof(double)); | 231 read_or_goto_error(adb->fd, d->power, d->nvectors * sizeof(double)); |
233 } | 232 } |
234 if(adb->header->flags & O2_FLAG_TIMES) { | 233 if(adb->header->flags & O2_FLAG_TIMES) { |
235 d->times = (double *) malloc(2 * d->nvectors * sizeof(double)); | 234 d->times = (double *) malloc(2 * d->nvectors * sizeof(double)); |
236 lseek(adb->fd, adb->header->timesTableOffset + track_offset / d->dim, SEEK_SET); | 235 lseek(adb->fd, adb->header->timesTableOffset + track_offset / d->dim, SEEK_SET); |
237 read(adb->fd, d->times, 2 * d->nvectors * sizeof(double)); | 236 read_or_goto_error(adb->fd, d->times, 2 * d->nvectors * sizeof(double)); |
238 } | 237 } |
239 } | 238 return 0; |
240 return 0; | 239 } |
240 error: | |
241 audiodb_free_datum(d); | |
242 return 1; | |
241 } | 243 } |
242 | 244 |
243 int audiodb_datum_qpointers(adb_datum_t *d, uint32_t sequence_length, double **vector_data, double **vector, adb_qpointers_internal_t *qpointers) { | 245 int audiodb_datum_qpointers(adb_datum_t *d, uint32_t sequence_length, double **vector_data, double **vector, adb_qpointers_internal_t *qpointers) { |
244 uint32_t nvectors = d->nvectors; | 246 uint32_t nvectors = d->nvectors; |
245 | 247 |