Mercurial > hg > audiodb
comparison query.cpp @ 546:e8193805ce42 multiprobeLSH
Rework new audiodb_track_id_datum_offset() and audiodb_insert_create_datum_offset() so that all offsets are in num_vectors. Internals of data storage are left the the methods to implement. If we are going to export these methods to the API, how do we expose the cache ? It needs to be passed back to the user and back in by the user on each call for caching to be re-entrant. No (intentional) functional changes this version.
author | mas01mc |
---|---|
date | Sun, 08 Feb 2009 22:32:33 +0000 |
parents | bf89c80ec4cc |
children |
comparison
equal
deleted
inserted
replaced
545:bf89c80ec4cc | 546:e8193805ce42 |
---|---|
201 int audiodb_track_id_datum(adb_t * adb, uint32_t track_id, adb_datum_t *datum){ | 201 int audiodb_track_id_datum(adb_t * adb, uint32_t track_id, adb_datum_t *datum){ |
202 return audiodb_track_id_datum_offset(adb, track_id , datum, 0, 0, 0); | 202 return audiodb_track_id_datum_offset(adb, track_id , datum, 0, 0, 0); |
203 } | 203 } |
204 | 204 |
205 int audiodb_track_id_datum_offset(adb_t *adb, uint32_t track_id, adb_datum_t *d, off_t vector_offset, size_t num_vectors, adb_fd_cache_t* cache){ | 205 int audiodb_track_id_datum_offset(adb_t *adb, uint32_t track_id, adb_datum_t *d, off_t vector_offset, size_t num_vectors, adb_fd_cache_t* cache){ |
206 off_t track_offset = (*adb->track_offsets)[track_id]; | |
207 | |
208 if(adb->header->flags & ADB_HEADER_FLAG_REFERENCES) { | 206 if(adb->header->flags & ADB_HEADER_FLAG_REFERENCES) { |
209 /* create a reference/insert, then use adb_insert_create_datum() */ | 207 /* create a reference/insert, then use adb_insert_create_datum() */ |
210 adb_reference_t *reference = NULL; | 208 adb_reference_t *reference = NULL; |
211 if(! (cache && cache->reference) ){ | 209 if(! (cache && cache->reference) ){ |
212 reference = (adb_reference_t *) malloc(sizeof(adb_reference_t)); | 210 reference = (adb_reference_t *) malloc(sizeof(adb_reference_t)); |
213 reference->features = (char*) malloc(ADB_MAXSTR*sizeof(char)); | 211 reference->features = (char*) malloc(ADB_MAXSTR*sizeof(char)); |
214 if(adb->header->flags & ADB_HEADER_FLAG_POWER) | 212 if(adb->header->flags & ADB_HEADER_FLAG_POWER) { |
215 reference->power = (char*) malloc(ADB_MAXSTR*sizeof(char)); | 213 reference->power = (char*) malloc(ADB_MAXSTR*sizeof(char)); |
216 else | 214 } |
215 else{ | |
217 reference->power = NULL; | 216 reference->power = NULL; |
218 if(adb->header->flags & ADB_HEADER_FLAG_TIMES) | 217 } |
218 if(adb->header->flags & ADB_HEADER_FLAG_TIMES){ | |
219 reference->times = (char*)malloc(ADB_MAXSTR*sizeof(char)); | 219 reference->times = (char*)malloc(ADB_MAXSTR*sizeof(char)); |
220 else | 220 } |
221 else{ | |
221 reference->times = NULL; | 222 reference->times = NULL; |
222 if(cache) | 223 } |
224 if(cache){ | |
223 cache->reference = reference; | 225 cache->reference = reference; |
224 } | 226 } |
225 else | 227 } |
228 else{ | |
226 reference = cache->reference; | 229 reference = cache->reference; |
227 | 230 } |
228 if(! (cache && cache->track_id==track_id) ){ | 231 if(! (cache && cache->track_id==track_id) ){ |
229 if(cache) | 232 if(cache){ |
230 cache->track_id = track_id; | 233 cache->track_id = track_id; |
234 } | |
231 lseek(adb->fd, adb->header->dataOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET); | 235 lseek(adb->fd, adb->header->dataOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET); |
232 read_or_goto_error(adb->fd, (void *)reference->features, ADB_MAXSTR); | 236 read_or_goto_error(adb->fd, (void *)reference->features, ADB_MAXSTR); |
233 if(adb->header->flags & ADB_HEADER_FLAG_POWER) { | 237 if(adb->header->flags & ADB_HEADER_FLAG_POWER) { |
234 lseek(adb->fd, adb->header->powerTableOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET); | 238 lseek(adb->fd, adb->header->powerTableOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET); |
235 read_or_goto_error(adb->fd, (void *)reference->power, ADB_MAXSTR); | 239 read_or_goto_error(adb->fd, (void *)reference->power, ADB_MAXSTR); |
237 if(adb->header->flags & ADB_HEADER_FLAG_TIMES) { | 241 if(adb->header->flags & ADB_HEADER_FLAG_TIMES) { |
238 lseek(adb->fd, adb->header->timesTableOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET); | 242 lseek(adb->fd, adb->header->timesTableOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET); |
239 read_or_goto_error(adb->fd, (void *)reference->times, ADB_MAXSTR); | 243 read_or_goto_error(adb->fd, (void *)reference->times, ADB_MAXSTR); |
240 } | 244 } |
241 } | 245 } |
242 | 246 int retval = audiodb_insert_create_datum_offset(reference, d, vector_offset, num_vectors, cache); |
243 int retval = audiodb_insert_create_datum_offset(reference, d, vector_offset*adb->header->dim*sizeof(double), num_vectors*adb->header->dim*sizeof(double), cache); | |
244 if(!cache){ | 247 if(!cache){ |
245 audiodb_free_datum_reference(reference); | 248 audiodb_free_datum_reference(reference); |
246 free(reference); | 249 free(reference); |
247 } | 250 } |
248 return retval; | 251 return retval; |
249 } else { | 252 } |
253 else { | |
254 off_t track_offset = (*adb->track_offsets)[track_id]; | |
250 /* initialize from sources of data that we already have */ | 255 /* initialize from sources of data that we already have */ |
251 if(num_vectors) | 256 if(num_vectors) |
252 d->nvectors = num_vectors; | 257 d->nvectors = num_vectors; |
253 else | 258 else |
254 d->nvectors = (*adb->track_lengths)[track_id]; | 259 d->nvectors = (*adb->track_lengths)[track_id]; |