comparison query.cpp @ 452:25ee0b77f8ca api-inversion

No more audioDB::error in audioDB::query_loop Change it to return an int, and return non-zero for an error instead. This is very coarse-grained, yes, but necessary.
author mas01cr
date Wed, 24 Dec 2008 10:57:09 +0000
parents ef9ef130e27b
children 16a903968d18
comparison
equal deleted inserted replaced
451:ef9ef130e27b 452:25ee0b77f8ca
203 VERB_LOG(1, "Calling indexed query on database %s, radius=%f, sequence_length=%d\n", adb->path, qspec.refine.radius, qspec.qid.sequence_length); 203 VERB_LOG(1, "Calling indexed query on database %s, radius=%f, sequence_length=%d\n", adb->path, qspec.refine.radius, qspec.qid.sequence_length);
204 index_query_loop(&qspec, dbName, query_from_key_index); 204 index_query_loop(&qspec, dbName, query_from_key_index);
205 } 205 }
206 else{ 206 else{
207 VERB_LOG(1, "Calling brute-force query on database %s\n", dbName); 207 VERB_LOG(1, "Calling brute-force query on database %s\n", dbName);
208 query_loop(adb, &qspec, query_from_key_index); 208 if(query_loop(adb, &qspec, query_from_key_index)) {
209 error("query_loop failed");
210 }
209 } 211 }
210 212
211 adb_query_results_t *rs = accumulator->get_points(); 213 adb_query_results_t *rs = accumulator->get_points();
212 for(unsigned int k = 0; k < rs->nresults; k++) { 214 for(unsigned int k = 0; k < rs->nresults; k++) {
213 adb_result_t r = rs->results[k]; 215 adb_result_t r = rs->results[k];
688 SAFE_DELETE_ARRAY(dbpointers.l2norm_data); 690 SAFE_DELETE_ARRAY(dbpointers.l2norm_data);
689 SAFE_DELETE_ARRAY(dbpointers.power_data); 691 SAFE_DELETE_ARRAY(dbpointers.power_data);
690 SAFE_DELETE_ARRAY(dbpointers.mean_duration); 692 SAFE_DELETE_ARRAY(dbpointers.mean_duration);
691 } 693 }
692 694
693 void audioDB::query_loop(adb_t *adb, adb_query_spec_t *spec, Uns32T queryIndex) { 695 int audioDB::query_loop(adb_t *adb, adb_query_spec_t *spec, Uns32T queryIndex) {
694 696
695 double *query, *query_data; 697 double *query, *query_data;
696 adb_qpointers_internal_t qpointers = {0}, dbpointers = {0}; 698 adb_qpointers_internal_t qpointers = {0}, dbpointers = {0};
697 699
698 bool power_refine = spec->refine.flags & (ADB_REFINE_ABSOLUTE_THRESHOLD|ADB_REFINE_RELATIVE_THRESHOLD); 700 bool power_refine = spec->refine.flags & (ADB_REFINE_ABSOLUTE_THRESHOLD|ADB_REFINE_RELATIVE_THRESHOLD);
699 701
700 if( adb->header->flags & O2_FLAG_LARGE_ADB ) 702 if(adb->header->flags & O2_FLAG_LARGE_ADB) {
701 error("error: LARGE_ADB requires indexed query"); 703 /* FIXME: actually it would be nice to support this mode of
704 * operation, but for now... */
705 return 1;
706 }
702 707
703 if(audiodb_query_spec_qpointers(adb, spec, &query_data, &query, &qpointers)) { 708 if(audiodb_query_spec_qpointers(adb, spec, &query_data, &query, &qpointers)) {
704 error("failed to set up qpointers"); 709 return 1;
705 } 710 }
706 711
707 if(audiodb_set_up_dbpointers(adb, spec, &dbpointers)) { 712 if(audiodb_set_up_dbpointers(adb, spec, &dbpointers)) {
708 error("failed to set up db"); 713 return 1;
709 } 714 }
710 715
711 unsigned j,k,track,trackOffset=0, HOP_SIZE = spec->refine.hopsize; 716 unsigned j,k,track,trackOffset=0, HOP_SIZE = spec->refine.hopsize;
712 unsigned wL = spec->qid.sequence_length; 717 unsigned wL = spec->qid.sequence_length;
713 double **D = 0; // Differences query and target 718 double **D = 0; // Differences query and target
733 if(trackFile) { 738 if(trackFile) {
734 trackFile->getline(nextKey,MAXSTR); 739 trackFile->getline(nextKey,MAXSTR);
735 if(!trackFile->eof()) { 740 if(!trackFile->eof()) {
736 track = audiodb_key_index(adb, nextKey); 741 track = audiodb_key_index(adb, nextKey);
737 if(track == (uint32_t) -1) { 742 if(track == (uint32_t) -1) {
738 error("key not found", nextKey); 743 return 1;
739 } 744 }
740 trackOffset = (*adb->track_offsets)[track]; 745 trackOffset = (*adb->track_offsets)[track];
741 lseek(adb->fd, adb->header->dataOffset + trackOffset, SEEK_SET); 746 lseek(adb->fd, adb->header->dataOffset + trackOffset, SEEK_SET);
742 } else { 747 } else {
743 break; 748 break;
756 } 761 }
757 } 762 }
758 763
759 trackIndexOffset = trackOffset / (adb->header->dim * sizeof(double)); // dbpointers.nvectors offset 764 trackIndexOffset = trackOffset / (adb->header->dim * sizeof(double)); // dbpointers.nvectors offset
760 765
761 if(audiodb_read_data(adb, adb->fd, track, &data_buffer, &data_buffer_size)) 766 if(audiodb_read_data(adb, adb->fd, track, &data_buffer, &data_buffer_size)) {
762 error("failed to read data"); 767 return 1;
768 }
763 if(wL <= (*adb->track_lengths)[track]) { // test for short sequences 769 if(wL <= (*adb->track_lengths)[track]) { // test for short sequences
764 770
765 audiodb_initialize_arrays(adb, spec, track, qpointers.nvectors, query, data_buffer, D, DD); 771 audiodb_initialize_arrays(adb, spec, track, qpointers.nvectors, query, data_buffer, D, DD);
766 772
767 if((!(spec->refine.flags & ADB_REFINE_DURATION_RATIO)) || 773 if((!(spec->refine.flags & ADB_REFINE_DURATION_RATIO)) ||
827 delete[] D; 833 delete[] D;
828 if(DD) 834 if(DD)
829 delete[] DD; 835 delete[] DD;
830 if(dbpointers.mean_duration) 836 if(dbpointers.mean_duration)
831 delete[] dbpointers.mean_duration; 837 delete[] dbpointers.mean_duration;
832 } 838
839 return 0;
840 }