diff 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
line wrap: on
line diff
--- a/query.cpp	Sun Feb 08 15:53:57 2009 +0000
+++ b/query.cpp	Sun Feb 08 22:32:33 2009 +0000
@@ -203,31 +203,35 @@
 }
 
 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){
-  off_t track_offset = (*adb->track_offsets)[track_id];
-  
   if(adb->header->flags & ADB_HEADER_FLAG_REFERENCES) {
     /* create a reference/insert, then use adb_insert_create_datum() */
     adb_reference_t *reference = NULL;
     if(! (cache && cache->reference) ){
       reference = (adb_reference_t *) malloc(sizeof(adb_reference_t));
       reference->features = (char*) malloc(ADB_MAXSTR*sizeof(char));
-      if(adb->header->flags & ADB_HEADER_FLAG_POWER) 
+      if(adb->header->flags & ADB_HEADER_FLAG_POWER) {
 	reference->power = (char*) malloc(ADB_MAXSTR*sizeof(char));
-      else
+      }
+      else{
 	reference->power = NULL;
-      if(adb->header->flags & ADB_HEADER_FLAG_TIMES) 
+      }
+      if(adb->header->flags & ADB_HEADER_FLAG_TIMES){
 	reference->times = (char*)malloc(ADB_MAXSTR*sizeof(char));
-      else
+      }
+      else{
 	reference->times = NULL;
-      if(cache)
+      }
+      if(cache){
 	cache->reference = reference;
+      }
     }
-    else
+    else{
       reference = cache->reference;
-
+    }
     if(! (cache && cache->track_id==track_id) ){
-      if(cache)
+      if(cache){
 	cache->track_id = track_id;
+      }
       lseek(adb->fd, adb->header->dataOffset + track_id * ADB_FILETABLE_ENTRY_SIZE, SEEK_SET);
       read_or_goto_error(adb->fd, (void *)reference->features, ADB_MAXSTR);
       if(adb->header->flags & ADB_HEADER_FLAG_POWER) {
@@ -239,14 +243,15 @@
 	read_or_goto_error(adb->fd, (void *)reference->times, ADB_MAXSTR);
       }
     }
-
-    int retval = audiodb_insert_create_datum_offset(reference, d, vector_offset*adb->header->dim*sizeof(double), num_vectors*adb->header->dim*sizeof(double), cache);
+    int retval = audiodb_insert_create_datum_offset(reference, d, vector_offset, num_vectors, cache);
     if(!cache){
       audiodb_free_datum_reference(reference);
       free(reference);      
     }
     return retval;
-  } else {
+  } 
+  else {
+    off_t track_offset = (*adb->track_offsets)[track_id];
     /* initialize from sources of data that we already have */
     if(num_vectors)
       d->nvectors = num_vectors;