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