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