comparison audioDB.cpp @ 496:8fb85fbcaba6 api-inversion

Mostly disentangle API from command-line binary. Now audioDB.cpp doesn't need to be included in the library, because nothing the library does creates an audioDB instance. Hooray. We can't disentangle the other way, because there's still plenty in the command-line binary that isn't implemented in terms of the API, so the audioDB binary code needs to know naughty stuff about the library's internals (e.g. what the file header looks like). Remove liszt.o and sample.o from the library, even though they'll probably make a reapparance soon (for scare-quoted values of "soon") Remove cmdline.o and common.o from the library, not scheduled to make a reapparence ever (hooray!). Separate out the bits that are used in the library -- locks and PointPairs -- into their own files.
author mas01cr
date Sat, 10 Jan 2009 15:33:25 +0000
parents d3afc91d205d
children
comparison
equal deleted inserted replaced
495:c291e9201a3c 496:8fb85fbcaba6
5 } 5 }
6 #include "reporter.h" 6 #include "reporter.h"
7 7
8 char* SERVER_ADB_ROOT; 8 char* SERVER_ADB_ROOT;
9 char* SERVER_ADB_FEATURE_ROOT; 9 char* SERVER_ADB_FEATURE_ROOT;
10
11 PointPair::PointPair(Uns32T a, Uns32T b, Uns32T c):trackID(a),qpos(b),spos(c){};
12
13 bool operator<(const PointPair& a, const PointPair& b){
14 return ( (a.trackID<b.trackID) ||
15 ( (a.trackID==b.trackID) &&
16 ( (a.spos<b.spos) || ( (a.spos==b.spos) && (a.qpos < b.qpos) )) ) );
17 }
18
19 bool operator>(const PointPair& a, const PointPair& b){
20 return ( (a.trackID>b.trackID) ||
21 ( (a.trackID==b.trackID) &&
22 ( (a.spos>b.spos) || ( (a.spos==b.spos) && (a.qpos > b.qpos) )) ) );
23 }
24
25 bool operator==(const PointPair& a, const PointPair& b){
26 return ( (a.trackID==b.trackID) && (a.qpos==b.qpos) && (a.spos==b.spos) );
27 }
28 10
29 audioDB::audioDB(const unsigned argc, const char *argv[]): O2_AUDIODB_INITIALIZERS 11 audioDB::audioDB(const unsigned argc, const char *argv[]): O2_AUDIODB_INITIALIZERS
30 { 12 {
31 if(processArgs(argc, argv)<0){ 13 if(processArgs(argc, argv)<0){
32 printf("No command found.\n"); 14 printf("No command found.\n");
43 // Perform database prefix substitution 25 // Perform database prefix substitution
44 if(dbName && adb_root) 26 if(dbName && adb_root)
45 prefix_name((char** const)&dbName, adb_root); 27 prefix_name((char** const)&dbName, adb_root);
46 28
47 if(O2_ACTION(COM_SERVER)) 29 if(O2_ACTION(COM_SERVER))
48 #ifdef LIBRARY
49 ;
50 #else
51 startServer(); 30 startServer();
52 #endif
53 31
54 else if(O2_ACTION(COM_CREATE)) 32 else if(O2_ACTION(COM_CREATE))
55 create(dbName); 33 create(dbName);
56 34
57 else if(O2_ACTION(COM_INSERT)) 35 else if(O2_ACTION(COM_INSERT))
60 else if(O2_ACTION(COM_BATCHINSERT)) 38 else if(O2_ACTION(COM_BATCHINSERT))
61 batchinsert(dbName, inFile); 39 batchinsert(dbName, inFile);
62 40
63 else if(O2_ACTION(COM_QUERY)) 41 else if(O2_ACTION(COM_QUERY))
64 if(isClient){ 42 if(isClient){
65 #ifdef LIBRARY
66 ;
67 #else
68 if(query_from_key){ 43 if(query_from_key){
69 VERB_LOG(1, "Calling web services query %s on database %s, query=%s\n", radius>0?"(Radius)":"(NN)", dbName, (key&&strlen(key))?key:inFile); 44 VERB_LOG(1, "Calling web services query %s on database %s, query=%s\n", radius>0?"(Radius)":"(NN)", dbName, (key&&strlen(key))?key:inFile);
70 ws_query_by_key(dbName, key, inFile, (char*)hostport); 45 ws_query_by_key(dbName, key, inFile, (char*)hostport);
71 } 46 }
72 else{ 47 else{
73 VERB_LOG(1, "Calling web services query on database %s, query=%s\n", dbName, (key&&strlen(key))?key:inFile); 48 VERB_LOG(1, "Calling web services query on database %s, query=%s\n", dbName, (key&&strlen(key))?key:inFile);
74 ws_query(dbName, inFile, (char*)hostport); 49 ws_query(dbName, inFile, (char*)hostport);
75 } 50 }
76 #endif
77 } 51 }
78 else 52 else
79 query(dbName, inFile); 53 query(dbName, inFile);
80 54
81 else if(O2_ACTION(COM_STATUS)) 55 else if(O2_ACTION(COM_STATUS))
82 if(isClient) 56 if(isClient)
83 #ifdef LIBRARY
84 ;
85 #else
86 ws_status(dbName,(char*)hostport); 57 ws_status(dbName,(char*)hostport);
87 #endif
88 else 58 else
89 status(dbName); 59 status(dbName);
90 60
91 else if(O2_ACTION(COM_SAMPLE)) 61 else if(O2_ACTION(COM_SAMPLE))
92 sample(dbName); 62 sample(dbName);
100 else if(O2_ACTION(COM_DUMP)) 70 else if(O2_ACTION(COM_DUMP))
101 dump(dbName); 71 dump(dbName);
102 72
103 else if(O2_ACTION(COM_LISZT)) 73 else if(O2_ACTION(COM_LISZT))
104 if(isClient) 74 if(isClient)
105 #ifdef LIBRARY
106 ;
107 #else
108 ws_liszt(dbName, (char*) hostport); 75 ws_liszt(dbName, (char*) hostport);
109 #endif
110 else 76 else
111 liszt(dbName, lisztOffset, lisztLength); 77 liszt(dbName, lisztOffset, lisztLength);
112 78
113 else if(O2_ACTION(COM_INDEX)) 79 else if(O2_ACTION(COM_INDEX))
114 index_index_db(dbName); 80 index_index_db(dbName);
161 liszt(dbName, lisztOffset, lisztLength, adbLisztResponse); 127 liszt(dbName, lisztOffset, lisztLength, adbLisztResponse);
162 } catch(char *err) { 128 } catch(char *err) {
163 cleanup(); 129 cleanup();
164 throw(err); 130 throw(err);
165 } 131 }
166 }
167
168 //for API query
169 audioDB::audioDB(const unsigned argc, const char *argv[],adb__queryResponse *adbQueryResponse, int * apierror, adb_t *a): O2_AUDIODB_INITIALIZERS
170 {
171
172 try {
173 UseApiError=1;
174 adb = a;
175
176 if(processArgs(argc, argv)<0){
177 printf("No command found.\n");
178 cmdline_parser_print_version ();
179 if (strlen(gengetopt_args_info_purpose) > 0)
180 printf("%s\n", gengetopt_args_info_purpose);
181 printf("%s\n", gengetopt_args_info_usage);
182 printf("%s\n", gengetopt_args_info_help[1]);
183 printf("%s\n", gengetopt_args_info_help[2]);
184 printf("%s\n", gengetopt_args_info_help[0]);
185 error("No command found");
186 }
187
188 query(dbName, inFile, adbQueryResponse);
189
190 } catch(int a) {
191 *apierror=a;
192 return;
193
194 }
195 *apierror=apierrortemp;
196 return;
197
198 } 132 }
199 133
200 void audioDB::cleanup() { 134 void audioDB::cleanup() {
201 cmdline_parser_free(&args_info); 135 cmdline_parser_free(&args_info);
202 if(fileTable) 136 if(fileTable)
219 delete reporter; 153 delete reporter;
220 if(rng) 154 if(rng)
221 gsl_rng_free(rng); 155 gsl_rng_free(rng);
222 if(infid>0) 156 if(infid>0)
223 close(infid); 157 close(infid);
224 if(adb && !UseApiError) { 158 if(adb) {
225 audiodb_close(adb); 159 audiodb_close(adb);
226 adb = NULL; 160 adb = NULL;
227 } 161 }
228 if(lsh) 162 if(lsh)
229 delete lsh; 163 delete lsh;
1006 int main(const int argc, const char* argv[]){ 940 int main(const int argc, const char* argv[]){
1007 SERVER_ADB_ROOT = 0; // Server-side database root prefix 941 SERVER_ADB_ROOT = 0; // Server-side database root prefix
1008 SERVER_ADB_FEATURE_ROOT = 0; // Server-side features root prefix 942 SERVER_ADB_FEATURE_ROOT = 0; // Server-side features root prefix
1009 audioDB(argc, argv); 943 audioDB(argc, argv);
1010 } 944 }
1011
1012
1013 extern "C" {
1014
1015 /* for API questions contact
1016 * Christophe Rhodes c.rhodes@gold.ac.uk
1017 * Ian Knopke mas01ik@gold.ac.uk, ian.knopke@gmail.com */
1018
1019 int audiodb_query(adb_ptr mydb, adb_query_ptr adbq, adb_queryresult_ptr adbqr){
1020
1021 const char *argv[32];
1022 int argvctr=0;
1023 char tempstr1[200];
1024 char tempstr2[200];
1025 char tempstr3[200];
1026 int apierror=0;
1027
1028 adb__queryResponse adbQueryResponse;
1029
1030 /* TODO: may need error checking here */
1031 /* currently counting on audioDB binary to fail for me */
1032 argv[argvctr++]="audioDB";
1033
1034 if(adbq->querytype){
1035 argv[argvctr++]="-Q";
1036 argv[argvctr++]=adbq->querytype;
1037 }
1038
1039 if(mydb->path){
1040 argv[argvctr++]="-d";
1041 argv[argvctr++]=mydb->path;
1042 }
1043
1044 if (adbq->feature){
1045 argv[argvctr++]="-f";
1046 argv[argvctr++]=adbq->feature;
1047 }
1048
1049 if (adbq->power){
1050 argv[argvctr++]="-w";
1051 argv[argvctr++]=adbq->power;
1052 }
1053
1054 if (adbq->qpoint){
1055 argv[argvctr++]="-p";
1056 argv[argvctr++]=adbq->qpoint;
1057 }
1058 if (adbq->numpoints){
1059 argv[argvctr++]="-n";
1060 argv[argvctr++]=adbq->numpoints;
1061 }
1062 if (adbq->radius){
1063 argv[argvctr++]="-R";
1064 argv[argvctr++]=adbq->radius;
1065 }
1066 if(adbq->resultlength){
1067 argv[argvctr++]="-r";
1068 argv[argvctr++]=adbq->resultlength;
1069 }
1070 if(adbq->sequencelength){
1071 argv[argvctr++]="-l";
1072 argv[argvctr++]=adbq->sequencelength;
1073 }
1074 if(adbq->sequencehop){
1075 argv[argvctr++]="-h";
1076 argv[argvctr++]=adbq->sequencehop;
1077 }
1078
1079 if (adbq->absolute_threshold){
1080 argv[argvctr++]="--absolute-threshold";
1081 snprintf(tempstr1,sizeof(tempstr1),"%f",adbq->absolute_threshold);
1082 argv[argvctr++]=tempstr1;
1083 }
1084
1085 if (adbq->relative_threshold){
1086 argv[argvctr++]="--relative-threshold";
1087 snprintf(tempstr2,sizeof(tempstr2),"%f",adbq->relative_threshold);
1088 argv[argvctr++]=tempstr2;
1089 }
1090
1091 if (adbq->exhaustive){
1092 argv[argvctr++]="--exhaustive";
1093 }
1094
1095 if (adbq->expandfactor){
1096 argv[argvctr++]="--expandfactor";
1097 snprintf(tempstr3,sizeof(tempstr3),"%f",adbq->expandfactor);
1098 argv[argvctr++]=tempstr3;
1099 }
1100
1101 if (adbq->rotate){
1102 argv[argvctr++]="--rotate";
1103 }
1104
1105 if (adbq->keylist){
1106 argv[argvctr++]="-K";
1107 argv[argvctr++]=adbq->keylist;
1108 }
1109 argv[argvctr]='\0';
1110
1111 /* debugging */
1112
1113 audioDB::audioDB(argvctr,argv, &adbQueryResponse, &apierror,mydb);
1114
1115 //copy data over here from adbQueryResponse to adbqr
1116 adbqr->sizeRlist=adbQueryResponse.result.__sizeRlist;
1117 adbqr->sizeDist=adbQueryResponse.result.__sizeDist;
1118 adbqr->sizeQpos=adbQueryResponse.result.__sizeQpos;
1119 adbqr->sizeSpos=adbQueryResponse.result.__sizeSpos;
1120 adbqr->Rlist=adbQueryResponse.result.Rlist;
1121 adbqr->Dist=adbQueryResponse.result.Dist;
1122 adbqr->Qpos=adbQueryResponse.result.Qpos;
1123 adbqr->Spos=adbQueryResponse.result.Spos;
1124
1125 return apierror;
1126 }
1127 }
1128