mas01cr@239
|
1 #include "audioDB.h"
|
mas01cr@239
|
2 #include "adb.nsmap"
|
mas01cr@239
|
3
|
mas01cr@239
|
4 /* Command-line client definitions */
|
mas01cr@239
|
5
|
mas01cr@239
|
6 // FIXME: this can't propagate the sequence length argument (used for
|
mas01cr@239
|
7 // dudCount). See adb__status() definition for the other half of
|
mas01cr@239
|
8 // this. -- CSR, 2007-10-01
|
mas01cr@239
|
9 void audioDB::ws_status(const char*dbName, char* hostport){
|
mas01cr@239
|
10 struct soap soap;
|
mas01cr@239
|
11 adb__statusResponse adbStatusResponse;
|
mas01cr@239
|
12
|
mas01cr@239
|
13 // Query an existing adb database
|
mas01cr@239
|
14 soap_init(&soap);
|
mas01cr@239
|
15 if(soap_call_adb__status(&soap,hostport,NULL,(char*)dbName,adbStatusResponse)==SOAP_OK) {
|
mas01cr@239
|
16 std::cout << "numFiles = " << adbStatusResponse.result.numFiles << std::endl;
|
mas01cr@239
|
17 std::cout << "dim = " << adbStatusResponse.result.dim << std::endl;
|
mas01cr@239
|
18 std::cout << "length = " << adbStatusResponse.result.length << std::endl;
|
mas01cr@239
|
19 std::cout << "dudCount = " << adbStatusResponse.result.dudCount << std::endl;
|
mas01cr@239
|
20 std::cout << "nullCount = " << adbStatusResponse.result.nullCount << std::endl;
|
mas01cr@239
|
21 std::cout << "flags = " << adbStatusResponse.result.flags << std::endl;
|
mas01cr@239
|
22 } else {
|
mas01cr@239
|
23 soap_print_fault(&soap,stderr);
|
mas01cr@239
|
24 }
|
mas01cr@239
|
25
|
mas01cr@239
|
26 soap_destroy(&soap);
|
mas01cr@239
|
27 soap_end(&soap);
|
mas01cr@239
|
28 soap_done(&soap);
|
mas01cr@239
|
29 }
|
mas01cr@239
|
30
|
mas01cr@239
|
31 void audioDB::ws_query(const char*dbName, const char *trackKey, const char* hostport){
|
mas01cr@239
|
32 struct soap soap;
|
mas01cr@239
|
33 adb__queryResponse adbQueryResponse;
|
mas01cr@239
|
34
|
mas01cr@239
|
35 soap_init(&soap);
|
mas01cr@239
|
36 if(soap_call_adb__query(&soap,hostport,NULL,
|
mas01cr@239
|
37 (char*)dbName,(char*)trackKey,(char*)trackFileName,(char*)timesFileName,
|
mas01cr@239
|
38 queryType, queryPoint, pointNN, trackNN, sequenceLength, adbQueryResponse)==SOAP_OK){
|
mas01cr@239
|
39 //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl;
|
mas01cr@239
|
40 for(int i=0; i<adbQueryResponse.result.__sizeRlist; i++)
|
mas01cr@239
|
41 std::cout << adbQueryResponse.result.Rlist[i] << " " << adbQueryResponse.result.Dist[i]
|
mas01cr@239
|
42 << " " << adbQueryResponse.result.Qpos[i] << " " << adbQueryResponse.result.Spos[i] << std::endl;
|
mas01cr@239
|
43 }
|
mas01cr@239
|
44 else
|
mas01cr@239
|
45 soap_print_fault(&soap,stderr);
|
mas01cr@239
|
46
|
mas01cr@239
|
47 soap_destroy(&soap);
|
mas01cr@239
|
48 soap_end(&soap);
|
mas01cr@239
|
49 soap_done(&soap);
|
mas01cr@239
|
50 }
|
mas01cr@239
|
51
|
mas01cr@239
|
52 /* Server definitions */
|
mas01cr@239
|
53 int adb__status(struct soap* soap, xsd__string dbName, adb__statusResponse &adbStatusResponse){
|
mas01cr@239
|
54 char* const argv[]={"audioDB",COM_STATUS,"-d",dbName};
|
mas01cr@239
|
55 const unsigned argc = 4;
|
mas01cr@239
|
56 try {
|
mas01cr@239
|
57 audioDB(argc, argv, &adbStatusResponse);
|
mas01cr@239
|
58 return SOAP_OK;
|
mas01cr@239
|
59 } catch(char *err) {
|
mas01cr@239
|
60 soap_receiver_fault(soap, err, "");
|
mas01cr@239
|
61 return SOAP_FAULT;
|
mas01cr@239
|
62 }
|
mas01cr@239
|
63 }
|
mas01cr@239
|
64
|
mas01cr@239
|
65 // Literal translation of command line to web service
|
mas01cr@239
|
66
|
mas01cr@239
|
67 int adb__query(struct soap* soap, xsd__string dbName, xsd__string qKey, xsd__string keyList, xsd__string timesFileName, xsd__int qType, xsd__int qPos, xsd__int pointNN, xsd__int trackNN, xsd__int seqLen, adb__queryResponse &adbQueryResponse){
|
mas01cr@239
|
68 char queryType[256];
|
mas01cr@239
|
69 for(int k=0; k<256; k++)
|
mas01cr@239
|
70 queryType[k]='\0';
|
mas01cr@239
|
71 if(qType == O2_POINT_QUERY)
|
mas01cr@239
|
72 strncpy(queryType, "point", strlen("point"));
|
mas01cr@239
|
73 else if (qType == O2_SEQUENCE_QUERY)
|
mas01cr@239
|
74 strncpy(queryType, "sequence", strlen("sequence"));
|
mas01cr@239
|
75 else if(qType == O2_TRACK_QUERY)
|
mas01cr@239
|
76 strncpy(queryType,"track", strlen("track"));
|
mas01cr@239
|
77 else
|
mas01cr@239
|
78 strncpy(queryType, "", strlen(""));
|
mas01cr@239
|
79
|
mas01cr@239
|
80 if(pointNN==0)
|
mas01cr@239
|
81 pointNN=10;
|
mas01cr@239
|
82 if(trackNN==0)
|
mas01cr@239
|
83 trackNN=10;
|
mas01cr@239
|
84 if(seqLen==0)
|
mas01cr@239
|
85 seqLen=16;
|
mas01cr@239
|
86
|
mas01cr@239
|
87 char qPosStr[256];
|
mas01cr@239
|
88 sprintf(qPosStr, "%d", qPos);
|
mas01cr@239
|
89 char pointNNStr[256];
|
mas01cr@239
|
90 sprintf(pointNNStr,"%d",pointNN);
|
mas01cr@239
|
91 char trackNNStr[256];
|
mas01cr@239
|
92 sprintf(trackNNStr,"%d",trackNN);
|
mas01cr@239
|
93 char seqLenStr[256];
|
mas01cr@239
|
94 sprintf(seqLenStr,"%d",seqLen);
|
mas01cr@239
|
95
|
mas01cr@239
|
96 const char* argv[] ={
|
mas01cr@239
|
97 "./audioDB",
|
mas01cr@239
|
98 COM_QUERY,
|
mas01cr@239
|
99 queryType, // Need to pass a parameter
|
mas01cr@239
|
100 COM_DATABASE,
|
mas01cr@239
|
101 ENSURE_STRING(dbName),
|
mas01cr@239
|
102 COM_FEATURES,
|
mas01cr@239
|
103 ENSURE_STRING(qKey),
|
mas01cr@239
|
104 COM_KEYLIST,
|
mas01cr@239
|
105 ENSURE_STRING(keyList),
|
mas01cr@239
|
106 COM_TIMES,
|
mas01cr@239
|
107 ENSURE_STRING(timesFileName),
|
mas01cr@239
|
108 COM_QPOINT,
|
mas01cr@239
|
109 qPosStr,
|
mas01cr@239
|
110 COM_POINTNN,
|
mas01cr@239
|
111 pointNNStr,
|
mas01cr@239
|
112 COM_TRACKNN,
|
mas01cr@239
|
113 trackNNStr, // Need to pass a parameter
|
mas01cr@239
|
114 COM_SEQLEN,
|
mas01cr@239
|
115 seqLenStr
|
mas01cr@239
|
116 };
|
mas01cr@239
|
117
|
mas01cr@239
|
118 const unsigned argc = 19;
|
mas01cr@239
|
119 try {
|
mas01cr@239
|
120 audioDB(argc, (char* const*)argv, &adbQueryResponse);
|
mas01cr@239
|
121 return SOAP_OK;
|
mas01cr@239
|
122 } catch (char *err) {
|
mas01cr@239
|
123 soap_receiver_fault(soap, err, "");
|
mas01cr@239
|
124 return SOAP_FAULT;
|
mas01cr@239
|
125 }
|
mas01cr@239
|
126 }
|
mas01cr@239
|
127
|
mas01cr@239
|
128 int adb__sequenceQuery(struct soap* soap, xsd__string dbName, xsd__string qKey,
|
mas01cr@239
|
129 adb__sequenceQueryParms *parms,
|
mas01cr@239
|
130 adb__queryResponse &adbQueryResponse) {
|
mas01cr@239
|
131
|
mas01cr@239
|
132 char qPosStr[256];
|
mas01cr@239
|
133 char pointNNStr[256];
|
mas01cr@239
|
134 char trackNNStr[256];
|
mas01cr@239
|
135 char seqLenStr[256];
|
mas01cr@239
|
136 char relative_thresholdStr[256];
|
mas01cr@239
|
137 char absolute_thresholdStr[256];
|
mas01cr@239
|
138
|
mas01cr@239
|
139 /* When the branch is merged, move this to a header and use it
|
mas01cr@239
|
140 elsewhere */
|
mas01cr@239
|
141 #define INTSTRINGIFY(val, str) \
|
mas01cr@239
|
142 snprintf(str, 256, "%d", val);
|
mas01cr@239
|
143 #define DOUBLESTRINGIFY(val, str) \
|
mas01cr@239
|
144 snprintf(str, 256, "%f", val);
|
mas01cr@239
|
145
|
mas01cr@239
|
146 INTSTRINGIFY(parms->qPos, qPosStr);
|
mas01cr@239
|
147 INTSTRINGIFY(parms->pointNN, pointNNStr);
|
mas01cr@239
|
148 INTSTRINGIFY(parms->segNN, trackNNStr);
|
mas01cr@239
|
149 /* FIXME: decide which of segLen and seqLen should live */
|
mas01cr@239
|
150 INTSTRINGIFY(parms->segLen, seqLenStr);
|
mas01cr@239
|
151
|
mas01cr@239
|
152 DOUBLESTRINGIFY(parms->relative_threshold, relative_thresholdStr);
|
mas01cr@239
|
153 DOUBLESTRINGIFY(parms->absolute_threshold, absolute_thresholdStr);
|
mas01cr@239
|
154
|
mas01cr@239
|
155 const char *argv[] = {
|
mas01cr@239
|
156 "./audioDB",
|
mas01cr@239
|
157 COM_QUERY,
|
mas01cr@239
|
158 "sequence",
|
mas01cr@239
|
159 COM_DATABASE,
|
mas01cr@239
|
160 dbName,
|
mas01cr@239
|
161 COM_FEATURES,
|
mas01cr@239
|
162 qKey,
|
mas01cr@239
|
163 COM_KEYLIST,
|
mas01cr@239
|
164 /* FIXME: when this branch is merged, use ENSURE_STRING */
|
mas01cr@239
|
165 parms->keyList==0?"":parms->keyList,
|
mas01cr@239
|
166 COM_TIMES,
|
mas01cr@239
|
167 parms->timesFileName==0?"":parms->timesFileName,
|
mas01cr@239
|
168 COM_QUERYPOWER,
|
mas01cr@239
|
169 parms->powerFileName==0?"":parms->powerFileName,
|
mas01cr@239
|
170 COM_QPOINT,
|
mas01cr@239
|
171 qPosStr,
|
mas01cr@239
|
172 COM_POINTNN,
|
mas01cr@239
|
173 pointNNStr,
|
mas01cr@239
|
174 COM_TRACKNN,
|
mas01cr@239
|
175 trackNNStr,
|
mas01cr@239
|
176 COM_SEQLEN,
|
mas01cr@239
|
177 seqLenStr,
|
mas01cr@239
|
178 COM_RELATIVE_THRESH,
|
mas01cr@239
|
179 relative_thresholdStr,
|
mas01cr@239
|
180 COM_ABSOLUTE_THRESH,
|
mas01cr@239
|
181 absolute_thresholdStr
|
mas01cr@239
|
182 };
|
mas01cr@239
|
183
|
mas01cr@239
|
184 const unsigned argc = 25;
|
mas01cr@239
|
185
|
mas01cr@239
|
186 try {
|
mas01cr@239
|
187 audioDB(argc, (char* const*)argv, &adbQueryResponse);
|
mas01cr@239
|
188 return SOAP_OK;
|
mas01cr@239
|
189 } catch (char *err) {
|
mas01cr@239
|
190 soap_receiver_fault(soap, err, "");
|
mas01cr@239
|
191 return SOAP_FAULT;
|
mas01cr@239
|
192 }
|
mas01cr@239
|
193 }
|
mas01cr@239
|
194
|
mas01cr@239
|
195 /* Server loop */
|
mas01cr@239
|
196 void audioDB::startServer(){
|
mas01cr@239
|
197 struct soap soap;
|
mas01cr@239
|
198 int m, s; // master and slave sockets
|
mas01cr@239
|
199 soap_init(&soap);
|
mas01cr@239
|
200 // FIXME: largely this use of SO_REUSEADDR is to make writing (and
|
mas01cr@239
|
201 // running) test cases more convenient, so that multiple test runs
|
mas01cr@239
|
202 // in close succession don't fail because of a bin() error.
|
mas01cr@239
|
203 // Investigate whether there are any potential drawbacks in this,
|
mas01cr@239
|
204 // and also whether there's a better way to write the tests. --
|
mas01cr@239
|
205 // CSR, 2007-10-03
|
mas01cr@239
|
206 soap.bind_flags |= SO_REUSEADDR;
|
mas01cr@239
|
207 m = soap_bind(&soap, NULL, port, 100);
|
mas01cr@239
|
208 if (m < 0)
|
mas01cr@239
|
209 soap_print_fault(&soap, stderr);
|
mas01cr@239
|
210 else
|
mas01cr@239
|
211 {
|
mas01cr@239
|
212 fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
|
mas01cr@239
|
213 for (int i = 1; ; i++)
|
mas01cr@239
|
214 {
|
mas01cr@239
|
215 s = soap_accept(&soap);
|
mas01cr@239
|
216 if (s < 0)
|
mas01cr@239
|
217 {
|
mas01cr@239
|
218 soap_print_fault(&soap, stderr);
|
mas01cr@239
|
219 break;
|
mas01cr@239
|
220 }
|
mas01cr@239
|
221 /* FIXME: find a way to play nice with logging when run from
|
mas01cr@239
|
222 /etc/init.d scripts: at present this just goes nowhere */
|
mas01cr@239
|
223 fprintf(stderr, "%d: accepted connection from IP=%lu.%lu.%lu.%lu socket=%d\n", i,
|
mas01cr@239
|
224 (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, s);
|
mas01cr@239
|
225 if (soap_serve(&soap) != SOAP_OK) // process RPC request
|
mas01cr@239
|
226 soap_print_fault(&soap, stderr); // print error
|
mas01cr@239
|
227 fprintf(stderr, "request served\n");
|
mas01cr@239
|
228 soap_destroy(&soap); // clean up class instances
|
mas01cr@239
|
229 soap_end(&soap); // clean up everything and close socket
|
mas01cr@239
|
230 }
|
mas01cr@239
|
231 }
|
mas01cr@239
|
232 soap_done(&soap); // close master socket and detach environment
|
mas01cr@239
|
233 }
|