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