Mercurial > hg > audiodb
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 } |