annotate soap.cpp @ 369:6564be3109c5 gcc-4.3-cleanups

gcc-4.3 warning cleanups for lshlib.cpp (I do not believe that any of these changes contain significant copyrightable "intellectual property". However, to the extent that they do, the changes are hereby released into the Public Domain, and may be therefore be used by anyone for any purpose without need for consideration of any kind.)
author mas01cr
date Wed, 12 Nov 2008 15:23:32 +0000
parents d72ff5d0292f
children 17003dff8127 add65705e655
rev   line source
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;
mas01mc@324 21 std::cout << "flags = " << (adbStatusResponse.result.flags & 0x00FFFFFF) << 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
mas01mc@334 31 void audioDB::ws_liszt(const char* dbName, char* Hostport){
mas01mc@334 32 struct soap soap;
mas01mc@334 33 adb__lisztResponse adbLisztResponse;
mas01mc@334 34
mas01mc@334 35 soap_init(&soap);
mas01mc@334 36 if(soap_call_adb__liszt(&soap, hostport, NULL, (char*)dbName, lisztOffset, lisztLength, adbLisztResponse)==SOAP_OK){
mas01mc@334 37 for(int i = 0; i < adbLisztResponse.result.__sizeRkey; i++) {
mas01mc@334 38 std::cout << "[" << i+lisztOffset << "] " << adbLisztResponse.result.Rkey[i] << " ("
mas01mc@334 39 << adbLisztResponse.result.Rlen[i] << ")" << std::endl;
mas01mc@334 40 }
mas01mc@334 41 } else {
mas01mc@334 42 soap_print_fault(&soap, stderr);
mas01mc@334 43 }
mas01mc@334 44 }
mas01mc@334 45
mas01mc@308 46 // WS_QUERY (CLIENT SIDE)
mas01mc@307 47 void audioDB::ws_query(const char*dbName, const char *featureFileName, const char* hostport){
mas01cr@239 48 struct soap soap;
mas01cr@239 49 adb__queryResponse adbQueryResponse;
mas01mc@329 50 VERB_LOG(1, "Calling fileName query on database %s with featureFile=%s\n", dbName, featureFileName);
mas01cr@333 51 soap_init(&soap);
mas01cr@333 52 if(soap_call_adb__query(&soap, hostport, NULL, (char *) dbName,
mas01cr@333 53 (char *)featureFileName, (char *)trackFileName,
mas01cr@333 54 (char *)timesFileName, (char *) powerFileName,
mas01cr@333 55 queryType, queryPoint,
mas01cr@333 56 pointNN, trackNN, sequenceLength,
mas01cr@333 57 radius, absolute_threshold, relative_threshold,
mas01cr@333 58 !usingQueryPoint, lsh_exact,
mas01cr@333 59 adbQueryResponse)
mas01cr@333 60 == SOAP_OK) {
mas01cr@333 61 if(radius == 0) {
mas01cr@333 62 for(int i=0; i<adbQueryResponse.result.__sizeRlist; i++) {
mas01cr@333 63 std::cout << adbQueryResponse.result.Rlist[i] << " "
mas01cr@333 64 << adbQueryResponse.result.Dist[i] << " "
mas01cr@333 65 << adbQueryResponse.result.Qpos[i] << " "
mas01cr@333 66 << adbQueryResponse.result.Spos[i] << std::endl;
mas01cr@333 67 }
mas01cr@333 68 } else {
mas01cr@333 69 for(int i = 0; i < adbQueryResponse.result.__sizeRlist; i++) {
mas01cr@333 70 std::cout << adbQueryResponse.result.Rlist[i] << " "
mas01cr@333 71 << adbQueryResponse.result.Spos[i] << std::endl;
mas01cr@333 72 }
mas01cr@333 73 }
mas01cr@333 74 } else {
mas01cr@333 75 soap_print_fault(&soap,stderr);
mas01cr@239 76 }
mas01cr@333 77
mas01cr@239 78 soap_destroy(&soap);
mas01cr@239 79 soap_end(&soap);
mas01cr@239 80 soap_done(&soap);
mas01cr@239 81 }
mas01mc@307 82
mas01mc@308 83 // WS_QUERY_BY_KEY (CLIENT SIDE)
mas01mc@328 84 void audioDB::ws_query_by_key(const char*dbName, const char *trackKey, const char* featureFileName, const char* hostport){
mas01mc@307 85 struct soap soap;
mas01mc@307 86 adb__queryResponse adbQueryResponse;
mas01mc@314 87 /* JUST TRY TO USE A DATA STRUCTURE WITH PHP
mas01mc@314 88 adb__sequenceQueryParms asqp;
mas01mc@314 89 asqp.keyList = (char*)trackFileName;
mas01mc@314 90 asqp.timesFileName = (char*)timesFileName;
mas01mc@314 91 asqp.queryPoint = queryPoint;
mas01mc@314 92 asqp.pointNN = pointNN;
mas01mc@314 93 asqp.trackNN = trackNN;
mas01mc@314 94 asqp.sequenceLength = sequenceLength;
mas01mc@314 95 asqp.radius = radius;
mas01mc@314 96 asqp.relative_threshold = relative_threshold;
mas01mc@314 97 asqp.absolute_threshold = absolute_threshold;
mas01mc@314 98 asqp.usingQueryPoint = usingQueryPoint;
mas01mc@314 99 asqp.lsh_exact = lsh_exact;
mas01mc@314 100 */
mas01mc@331 101 VERB_LOG(1, "Calling %s query on database %s with %s=%s\n", (trackKey&&strlen(trackKey))?"KEY":"FILENAME", dbName, (trackKey&&strlen(trackKey))?"KEY":"FILENAME",(trackKey&&strlen(trackKey))?trackKey:featureFileName);
mas01mc@307 102 soap_init(&soap);
mas01mc@307 103 if(queryType==O2_SEQUENCE_QUERY || queryType==O2_N_SEQUENCE_QUERY){
mas01mc@314 104 if(soap_call_adb__sequenceQueryByKey(&soap,hostport,NULL,
mas01mc@328 105 (char*)dbName,
mas01mc@328 106 (char*)trackKey,
mas01mc@328 107 (char*)featureFileName,
mas01mc@328 108 queryType,
mas01mc@328 109 (char*)trackFileName, // this means keyFileName
mas01mc@328 110 (char*)timesFileName,
mas01mc@314 111 queryPoint,
mas01mc@328 112 pointNN,
mas01mc@328 113 trackNN,
mas01mc@328 114 sequenceLength,
mas01mc@328 115 radius,
mas01mc@328 116 absolute_threshold,
mas01mc@328 117 usingQueryPoint,
mas01mc@314 118 lsh_exact,
mas01mc@314 119 adbQueryResponse)==SOAP_OK){
mas01mc@307 120 //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl;
mas01mc@307 121 for(int i=0; i<adbQueryResponse.result.__sizeRlist; i++)
mas01mc@307 122 std::cout << adbQueryResponse.result.Rlist[i] << " " << adbQueryResponse.result.Dist[i]
mas01mc@307 123 << " " << adbQueryResponse.result.Qpos[i] << " " << adbQueryResponse.result.Spos[i] << std::endl;
mas01mc@307 124 }
mas01mc@307 125 else
mas01mc@307 126 soap_print_fault(&soap,stderr);
mas01mc@307 127 }else
mas01mc@307 128 ;// FIX ME: WRITE NON-SEQUENCE QUERY BY KEY ?
mas01mc@307 129
mas01mc@307 130 soap_destroy(&soap);
mas01mc@307 131 soap_end(&soap);
mas01mc@307 132 soap_done(&soap);
mas01mc@307 133 }
mas01mc@307 134
mas01cr@239 135
mas01cr@333 136 /* handy macros */
mas01cr@333 137 #define INTSTRINGIFY(val, str) \
mas01cr@333 138 char str[256]; \
mas01cr@333 139 snprintf(str, 256, "%d", val);
mas01cr@333 140 #define DOUBLESTRINGIFY(val, str) \
mas01cr@333 141 char str[256]; \
mas01cr@333 142 snprintf(str, 256, "%f", val);
mas01cr@333 143
mas01cr@239 144 /* Server definitions */
mas01cr@239 145 int adb__status(struct soap* soap, xsd__string dbName, adb__statusResponse &adbStatusResponse){
mas01cr@359 146 const char *argv[]={"./audioDB",COM_STATUS,"-d",dbName};
mas01cr@239 147 const unsigned argc = 4;
mas01cr@239 148 try {
mas01cr@239 149 audioDB(argc, argv, &adbStatusResponse);
mas01cr@239 150 return SOAP_OK;
mas01cr@239 151 } catch(char *err) {
mas01cr@239 152 soap_receiver_fault(soap, err, "");
mas01cr@239 153 return SOAP_FAULT;
mas01cr@239 154 }
mas01cr@239 155 }
mas01mc@334 156
mas01mc@334 157 int adb__liszt(struct soap* soap, xsd__string dbName, xsd__int lisztOffset, xsd__int lisztLength,
mas01mc@334 158 adb__lisztResponse& adbLisztResponse){
mas01mc@334 159
mas01mc@334 160 INTSTRINGIFY(lisztOffset, lisztOffsetStr);
mas01mc@334 161 INTSTRINGIFY(lisztLength, lisztLengthStr);
mas01mc@334 162
mas01cr@359 163 const char *argv[] = {"./audioDB", COM_LISZT, "-d",dbName, "--lisztOffset", lisztOffsetStr, "--lisztLength", lisztLengthStr};
mas01mc@334 164 const unsigned argc = 8;
mas01mc@334 165 try{
mas01mc@334 166 audioDB(argc, argv, &adbLisztResponse);
mas01mc@334 167 return SOAP_OK;
mas01mc@334 168 } catch(char *err) {
mas01mc@334 169 soap_receiver_fault(soap, err, "");
mas01mc@334 170 return SOAP_FAULT;
mas01mc@334 171 }
mas01mc@334 172 }
mas01mc@334 173
mas01cr@239 174 // Literal translation of command line to web service
mas01cr@333 175 int adb__query(struct soap* soap, xsd__string dbName,
mas01cr@333 176 xsd__string qKey, xsd__string keyList,
mas01cr@333 177 xsd__string timesFileName, xsd__string powerFileName,
mas01cr@333 178 xsd__int qType,
mas01cr@333 179 xsd__int qPos, xsd__int pointNN, xsd__int trackNN,
mas01cr@333 180 xsd__int seqLen,
mas01cr@333 181 xsd__double radius,
mas01cr@333 182 xsd__double absolute_threshold, xsd__double relative_threshold,
mas01cr@333 183 xsd__int exhaustive, xsd__int lsh_exact,
mas01cr@333 184 adb__queryResponse &adbQueryResponse){
mas01cr@239 185 char queryType[256];
mas01mc@329 186
mas01mc@329 187 fprintf(stderr,"Calling fileName query on database %s with featureFile=%s\n", dbName, qKey);
mas01mc@329 188
mas01cr@239 189 for(int k=0; k<256; k++)
mas01cr@239 190 queryType[k]='\0';
mas01cr@239 191 if(qType == O2_POINT_QUERY)
mas01cr@239 192 strncpy(queryType, "point", strlen("point"));
mas01cr@239 193 else if (qType == O2_SEQUENCE_QUERY)
mas01cr@239 194 strncpy(queryType, "sequence", strlen("sequence"));
mas01cr@239 195 else if(qType == O2_TRACK_QUERY)
mas01cr@239 196 strncpy(queryType,"track", strlen("track"));
mas01mc@324 197 else if(qType == O2_N_SEQUENCE_QUERY)
mas01mc@324 198 strncpy(queryType,"nsequence", strlen("nsequence"));
mas01cr@239 199
mas01cr@239 200 if(pointNN==0)
mas01cr@239 201 pointNN=10;
mas01cr@239 202 if(trackNN==0)
mas01cr@239 203 trackNN=10;
mas01cr@239 204 if(seqLen==0)
mas01cr@239 205 seqLen=16;
mas01cr@239 206
mas01cr@333 207 INTSTRINGIFY(qPos, qPosStr);
mas01cr@333 208 INTSTRINGIFY(pointNN, pointNNStr);
mas01cr@333 209 INTSTRINGIFY(trackNN, trackNNStr);
mas01cr@333 210 INTSTRINGIFY(seqLen, seqLenStr);
mas01cr@239 211
mas01cr@333 212 /* We don't necessarily use these, but because of scope we do this
mas01cr@333 213 anyway. We waste 756 bytes of stack this way. */
mas01cr@333 214 DOUBLESTRINGIFY(radius, radiusStr);
mas01cr@333 215 DOUBLESTRINGIFY(absolute_threshold, absolute_thresholdStr);
mas01cr@333 216 DOUBLESTRINGIFY(relative_threshold, relative_thresholdStr);
mas01cr@333 217
mas01cr@333 218 unsigned int argc = 19;
mas01cr@333 219 if (powerFileName) {
mas01cr@333 220 argc += 2;
mas01cr@333 221 }
mas01cr@333 222 if (radius != 0) {
mas01cr@333 223 argc += 2;
mas01cr@333 224 }
mas01cr@333 225 /* we can't use use_absolute_threshold and friends because we're not
mas01cr@333 226 in the audioDB class here. */
mas01cr@333 227 if (absolute_threshold != 0) {
mas01cr@333 228 argc += 2;
mas01cr@333 229 }
mas01cr@333 230 if (relative_threshold != 0) {
mas01cr@333 231 argc += 2;
mas01cr@333 232 }
mas01cr@333 233 if (exhaustive) {
mas01cr@333 234 argc++;
mas01cr@333 235 }
mas01cr@333 236 if (lsh_exact) {
mas01cr@333 237 argc++;
mas01cr@333 238 }
mas01cr@333 239
mas01cr@345 240 const char **argv = new const char*[argc+1];
mas01cr@333 241 argv[0] = "./audioDB";
mas01cr@333 242 argv[1] = COM_QUERY;
mas01cr@333 243 argv[2] = queryType;
mas01cr@333 244 argv[3] = COM_DATABASE;
mas01cr@333 245 argv[4] = (char *) (ENSURE_STRING(dbName));
mas01cr@333 246 argv[5] = COM_FEATURES;
mas01cr@333 247 argv[6] = (char *) (ENSURE_STRING(qKey));
mas01cr@333 248 argv[7] = COM_KEYLIST;
mas01cr@333 249 argv[8] = (char *) (ENSURE_STRING(keyList));
mas01cr@333 250 argv[9] = COM_TIMES;
mas01cr@333 251 argv[10] = (char *) (ENSURE_STRING(timesFileName));
mas01cr@333 252 argv[11] = COM_QPOINT;
mas01cr@333 253 argv[12] = qPosStr;
mas01cr@333 254 argv[13] = COM_POINTNN;
mas01cr@333 255 argv[14] = pointNNStr;
mas01cr@333 256 argv[15] = COM_TRACKNN;
mas01cr@333 257 argv[16] = trackNNStr;
mas01cr@333 258 argv[17] = COM_SEQLEN;
mas01cr@333 259 argv[18] = seqLenStr;
mas01cr@333 260 int argv_counter = 19;
mas01cr@333 261 if (powerFileName) {
mas01cr@333 262 argv[argv_counter++] = COM_QUERYPOWER;
mas01cr@333 263 argv[argv_counter++] = powerFileName;
mas01cr@333 264 }
mas01cr@333 265 if (radius != 0) {
mas01cr@333 266 argv[argv_counter++] = COM_RADIUS;
mas01cr@333 267 argv[argv_counter++] = radiusStr;
mas01cr@333 268 }
mas01cr@333 269 if (absolute_threshold != 0) {
mas01cr@333 270 argv[argv_counter++] = COM_ABSOLUTE_THRESH;
mas01cr@333 271 argv[argv_counter++] = absolute_thresholdStr;
mas01cr@333 272 }
mas01cr@333 273 if (relative_threshold != 0) {
mas01cr@333 274 argv[argv_counter++] = COM_RELATIVE_THRESH;
mas01cr@333 275 argv[argv_counter++] = relative_thresholdStr;
mas01cr@333 276 }
mas01cr@333 277 if (exhaustive) {
mas01cr@333 278 argv[argv_counter++] = COM_EXHAUSTIVE;
mas01cr@333 279 }
mas01cr@333 280 if (lsh_exact) {
mas01cr@333 281 argv[argv_counter++] = COM_LSH_EXACT;
mas01cr@333 282 }
mas01cr@333 283 argv[argv_counter] = NULL;
mas01cr@333 284
mas01cr@239 285 try {
mas01cr@359 286 audioDB(argc, argv, &adbQueryResponse);
mas01cr@333 287 delete [] argv;
mas01cr@239 288 return SOAP_OK;
mas01cr@239 289 } catch (char *err) {
mas01cr@239 290 soap_receiver_fault(soap, err, "");
mas01cr@333 291 delete [] argv;
mas01cr@239 292 return SOAP_FAULT;
mas01cr@239 293 }
mas01cr@239 294 }
mas01cr@239 295
mas01mc@314 296 int adb__sequenceQueryByKey(struct soap* soap,xsd__string dbName,
mas01mc@314 297 xsd__string trackKey,
mas01mc@328 298 xsd__string featureFileName,
mas01mc@314 299 xsd__int queryType,
mas01mc@328 300 xsd__string keyFileName,
mas01mc@314 301 xsd__string timesFileName,
mas01mc@314 302 xsd__int queryPoint,
mas01mc@314 303 xsd__int pointNN,
mas01mc@314 304 xsd__int trackNN,
mas01mc@314 305 xsd__int sequenceLength,
mas01mc@314 306 xsd__double radius,
mas01mc@314 307 xsd__double absolute_threshold,
mas01mc@314 308 xsd__int usingQueryPoint,
mas01mc@314 309 xsd__int lsh_exact,
mas01mc@314 310 struct adb__queryResponse& adbQueryResponse){
mas01mc@307 311 char qtypeStr[256];
mas01cr@239 312
mas01mc@331 313 fprintf(stderr, "Calling %s query on database %s with %s=%s\n", (trackKey&&strlen(trackKey))?"KEY":"FILENAME", dbName, (trackKey&&strlen(trackKey))?"KEY":"FILENAME",(trackKey&&strlen(trackKey))?trackKey:featureFileName);
mas01mc@329 314
mas01mc@314 315 INTSTRINGIFY(queryPoint, qPosStr);
mas01mc@314 316 INTSTRINGIFY(pointNN, pointNNStr);
mas01mc@314 317 INTSTRINGIFY(trackNN, trackNNStr);
mas01mc@314 318 INTSTRINGIFY(sequenceLength, seqLenStr);
mas01mc@314 319 DOUBLESTRINGIFY(absolute_threshold, absolute_thresholdStr);
mas01mc@314 320 DOUBLESTRINGIFY(radius, radiusStr);
mas01mc@307 321
mas01mc@307 322 // WS queries only support 1-nearest neighbour point reporting
mas01mc@307 323 // at the moment, until we figure out how to better serve results
mas01mc@307 324 snprintf(qtypeStr, 256, "nsequence");
mas01mc@310 325 const char *argv[]={
mas01cr@239 326 "./audioDB",
mas01cr@239 327 COM_QUERY,
mas01mc@307 328 qtypeStr,
mas01cr@239 329 COM_DATABASE,
mas01cr@239 330 dbName,
mas01mc@330 331 (trackKey&&strlen(trackKey))?COM_QUERYKEY:COM_FEATURES,
mas01mc@330 332 (trackKey&&strlen(trackKey))?ENSURE_STRING(trackKey):ENSURE_STRING(featureFileName),
mas01cr@239 333 COM_KEYLIST,
mas01mc@328 334 ENSURE_STRING(keyFileName),
mas01mc@314 335 usingQueryPoint?COM_QPOINT:COM_EXHAUSTIVE,
mas01mc@314 336 usingQueryPoint?qPosStr:"",
mas01cr@239 337 COM_POINTNN,
mas01cr@239 338 pointNNStr,
mas01cr@239 339 COM_TRACKNN,
mas01cr@239 340 trackNNStr,
mas01mc@307 341 COM_RADIUS,
mas01mc@307 342 radiusStr,
mas01cr@239 343 COM_SEQLEN,
mas01cr@239 344 seqLenStr,
mas01cr@239 345 COM_ABSOLUTE_THRESH,
mas01mc@310 346 absolute_thresholdStr,
mas01mc@314 347 lsh_exact?COM_LSH_EXACT:""
mas01cr@239 348 };
mas01cr@239 349
mas01mc@310 350 const unsigned argc = 22;
mas01mc@310 351
mas01mc@310 352
mas01cr@239 353 try {
mas01cr@359 354 audioDB(argc, argv, &adbQueryResponse);
mas01cr@239 355 return SOAP_OK;
mas01cr@239 356 } catch (char *err) {
mas01cr@239 357 soap_receiver_fault(soap, err, "");
mas01cr@239 358 return SOAP_FAULT;
mas01cr@239 359 }
mas01cr@239 360 }
mas01mc@354 361
mas01mc@354 362 // Query an audioDB database by vector (serialized)
mas01mc@354 363 int adb__shingleQuery(struct soap* soap, xsd__string dbName, struct adb__queryVector qVector, xsd__string keyList, xsd__string timesFileName, xsd__int queryType, xsd__int queryPos, xsd__int pointNN, xsd__int trackNN, xsd__int sequenceLength, xsd__double radius, xsd__double absolute_threshold, xsd__double relative_threshold, xsd__int exhaustive, xsd__int lsh_exact, struct adb__queryResponse &adbQueryResponse){
mas01mc@354 364
mas01mc@354 365 // open a tmp file on the server, write shingle, query as a file with query point 0
mas01mc@354 366 // and shingle length l/dim
mas01mc@354 367 char tmpFileName[] = "/tmp/adb_XXXXXX";
mas01mc@354 368 int tmpFid = mkstemp(tmpFileName);
mas01mc@354 369 if(tmpFid==-1){
mas01mc@354 370 cerr << "Cannot make tmpfile <" << tmpFileName << "> on server" << endl;
mas01mc@354 371 return SOAP_FAULT;
mas01mc@354 372 }
mas01mc@354 373
mas01mc@354 374 FILE* tmpFile = fdopen(tmpFid, "r+b");
mas01mc@354 375 if(!tmpFile){
mas01mc@354 376 cerr << "error opening <" << tmpFileName << "> for write" << endl;
mas01mc@354 377 return SOAP_FAULT;
mas01mc@354 378 }
mas01mc@354 379
mas01mc@354 380 if(fwrite(&qVector.dim, sizeof(int), 1, tmpFile)!=1){
mas01mc@354 381 cerr << "error writing tmp file dim <"<< tmpFileName << ">" << endl;
mas01mc@354 382 return SOAP_FAULT;
mas01mc@354 383 }
mas01mc@354 384
mas01mc@354 385 if(fwrite(qVector.v, sizeof(double), qVector.__sizev, tmpFile)!=(size_t)qVector.__sizev){
mas01mc@354 386 cerr << "error writing tmp file doubles <" << tmpFileName << ">" << endl;
mas01mc@354 387 return SOAP_FAULT;
mas01mc@354 388 }
mas01mc@354 389
mas01mc@354 390 // Close the file so that a new FD can be opened
mas01mc@354 391 fclose(tmpFile);
mas01mc@354 392
mas01mc@354 393 char tmpFileName2[] = "/tmp/adbP_XXXXXX";
mas01mc@354 394 int tmpFid2 = 0;
mas01mc@354 395 FILE* tmpFile2 = NULL;
mas01mc@354 396
mas01mc@354 397 // Check if powers have been passed and write accordingly
mas01mc@354 398 if(qVector.__sizep){
mas01mc@354 399 tmpFid2 = mkstemp(tmpFileName2);
mas01mc@354 400 tmpFile2 = fdopen(tmpFid2, "r+b");
mas01mc@354 401 if(!tmpFile2){
mas01mc@354 402 cerr << "error opening power file <" << tmpFileName2 << "> for write" << endl;
mas01mc@354 403 return SOAP_FAULT;
mas01mc@354 404 }
mas01mc@354 405 int pSize=1;
mas01mc@354 406 if(fwrite(&pSize, sizeof(int), 1, tmpFile2)!=1){
mas01mc@354 407 cerr << "error writing tmp power file dim <"<< tmpFileName2 << ">" << endl;
mas01mc@354 408 return SOAP_FAULT;
mas01mc@354 409 }
mas01mc@354 410
mas01mc@354 411 if(fwrite(qVector.p, sizeof(double), qVector.__sizep, tmpFile2)!=(size_t)qVector.__sizep){
mas01mc@354 412 cerr << "error writing tmp power file doubles <" << tmpFileName2 << ">" << endl;
mas01mc@354 413 return SOAP_FAULT;
mas01mc@354 414 }
mas01mc@354 415 fclose(tmpFile2);
mas01mc@354 416 }
mas01mc@354 417
mas01mc@354 418 // fix up sequenceLength if it isn't provided, we know what the caller wants by the size of the shingle
mas01mc@354 419 // and the feature dimensionality
mas01mc@354 420 if(!sequenceLength)
mas01mc@354 421 sequenceLength = qVector.__sizev/qVector.dim;
mas01mc@354 422
mas01mc@354 423 int retVal = adb__query(soap, dbName, tmpFileName, keyList, timesFileName, qVector.__sizep?tmpFileName2:0,
mas01mc@354 424 queryType, queryPos, pointNN, trackNN, sequenceLength, radius,
mas01mc@354 425 absolute_threshold, relative_threshold, exhaustive, lsh_exact, adbQueryResponse);
mas01mc@354 426
mas01mc@354 427 return retVal;
mas01mc@354 428 }
mas01mc@354 429
mas01cr@239 430 /* Server loop */
mas01cr@239 431 void audioDB::startServer(){
mas01cr@239 432 struct soap soap;
mas01cr@239 433 int m, s; // master and slave sockets
mas01cr@239 434 soap_init(&soap);
mas01cr@239 435 // FIXME: largely this use of SO_REUSEADDR is to make writing (and
mas01cr@239 436 // running) test cases more convenient, so that multiple test runs
mas01cr@239 437 // in close succession don't fail because of a bin() error.
mas01cr@239 438 // Investigate whether there are any potential drawbacks in this,
mas01cr@239 439 // and also whether there's a better way to write the tests. --
mas01cr@239 440 // CSR, 2007-10-03
mas01cr@239 441 soap.bind_flags |= SO_REUSEADDR;
mas01cr@239 442 m = soap_bind(&soap, NULL, port, 100);
mas01cr@239 443 if (m < 0)
mas01cr@239 444 soap_print_fault(&soap, stderr);
mas01cr@239 445 else
mas01cr@239 446 {
mas01cr@239 447 fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
mas01mc@308 448 // Make a global Web Services LSH Index (SINGLETON)
mas01mc@313 449 if(WS_load_index && dbName && !index_exists(dbName, radius, sequenceLength)){
mas01mc@313 450 error("Can't find requested index file:", index_get_name(dbName,radius,sequenceLength));
mas01mc@313 451 }
mas01mc@308 452 if(WS_load_index && dbName && index_exists(dbName, radius, sequenceLength)){
mas01mc@308 453 char* indexName = index_get_name(dbName, radius, sequenceLength);
mas01mc@308 454 fprintf(stderr, "Loading LSH hashtables: %s...\n", indexName);
mas01mc@308 455 lsh = new LSH(indexName, true);
mas01mc@308 456 assert(lsh);
mas01mc@308 457 SERVER_LSH_INDEX_SINGLETON = lsh;
mas01mc@308 458 fprintf(stderr, "LSH INDEX READY\n");
mas01mc@308 459 fflush(stderr);
mas01mc@308 460 delete[] indexName;
mas01mc@308 461 }
mas01mc@324 462
mas01mc@324 463 // Server-side path prefix to databases and features
mas01mc@324 464 if(adb_root)
mas01mc@324 465 SERVER_ADB_ROOT = (char*)adb_root; // Server-side database root
mas01mc@324 466 if(adb_feature_root)
mas01mc@324 467 SERVER_ADB_FEATURE_ROOT = (char*)adb_feature_root; // Server-side features root
mas01mc@338 468
mas01mc@338 469 isServer = 1; // From this point, errors are reported via SOAP to the client
mas01cr@239 470 for (int i = 1; ; i++)
mas01cr@239 471 {
mas01cr@239 472 s = soap_accept(&soap);
mas01cr@239 473 if (s < 0)
mas01cr@239 474 {
mas01cr@239 475 soap_print_fault(&soap, stderr);
mas01cr@239 476 break;
mas01cr@239 477 }
mas01cr@239 478 /* FIXME: find a way to play nice with logging when run from
mas01cr@239 479 /etc/init.d scripts: at present this just goes nowhere */
mas01cr@239 480 fprintf(stderr, "%d: accepted connection from IP=%lu.%lu.%lu.%lu socket=%d\n", i,
mas01cr@239 481 (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, s);
mas01cr@239 482 if (soap_serve(&soap) != SOAP_OK) // process RPC request
mas01cr@239 483 soap_print_fault(&soap, stderr); // print error
mas01cr@239 484 fprintf(stderr, "request served\n");
mas01cr@239 485 soap_destroy(&soap); // clean up class instances
mas01cr@239 486 soap_end(&soap); // clean up everything and close socket
mas01cr@239 487 }
mas01cr@239 488 }
mas01cr@239 489 soap_done(&soap); // close master socket and detach environment
mas01cr@239 490 }