annotate soap.cpp @ 345:30384a82983a

Quieten newer compilers with MORE CONST CORRECTNESS. (except, haha, gengetopt doesn't generate const-correct function prototypes. Happy happy joy joy. Put in an explicit cast when calling cmdline_parser().) Adjust gengetopt.in and Makefile to support both old (2.19) and new (2.22) versions of gengetopt. This only really means that we've lost -H as a help switch; --help still works.
author mas01cr
date Wed, 08 Oct 2008 11:06:11 +0000
parents cdb31e8b94e3
children 75a59f58319e 4871a3ed9e36
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@345 146 const char *const 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@345 163 const char* const 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@333 285
mas01cr@239 286 try {
mas01cr@239 287 audioDB(argc, (char* const*)argv, &adbQueryResponse);
mas01cr@333 288 delete [] argv;
mas01cr@239 289 return SOAP_OK;
mas01cr@239 290 } catch (char *err) {
mas01cr@239 291 soap_receiver_fault(soap, err, "");
mas01cr@333 292 delete [] argv;
mas01cr@239 293 return SOAP_FAULT;
mas01cr@239 294 }
mas01cr@239 295 }
mas01cr@239 296
mas01mc@314 297 int adb__sequenceQueryByKey(struct soap* soap,xsd__string dbName,
mas01mc@314 298 xsd__string trackKey,
mas01mc@328 299 xsd__string featureFileName,
mas01mc@314 300 xsd__int queryType,
mas01mc@328 301 xsd__string keyFileName,
mas01mc@314 302 xsd__string timesFileName,
mas01mc@314 303 xsd__int queryPoint,
mas01mc@314 304 xsd__int pointNN,
mas01mc@314 305 xsd__int trackNN,
mas01mc@314 306 xsd__int sequenceLength,
mas01mc@314 307 xsd__double radius,
mas01mc@314 308 xsd__double absolute_threshold,
mas01mc@314 309 xsd__int usingQueryPoint,
mas01mc@314 310 xsd__int lsh_exact,
mas01mc@314 311 struct adb__queryResponse& adbQueryResponse){
mas01mc@307 312 char qtypeStr[256];
mas01cr@239 313
mas01mc@331 314 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 315
mas01mc@314 316 INTSTRINGIFY(queryPoint, qPosStr);
mas01mc@314 317 INTSTRINGIFY(pointNN, pointNNStr);
mas01mc@314 318 INTSTRINGIFY(trackNN, trackNNStr);
mas01mc@314 319 INTSTRINGIFY(sequenceLength, seqLenStr);
mas01mc@314 320 DOUBLESTRINGIFY(absolute_threshold, absolute_thresholdStr);
mas01mc@314 321 DOUBLESTRINGIFY(radius, radiusStr);
mas01mc@307 322
mas01mc@307 323 // WS queries only support 1-nearest neighbour point reporting
mas01mc@307 324 // at the moment, until we figure out how to better serve results
mas01mc@307 325 snprintf(qtypeStr, 256, "nsequence");
mas01mc@310 326 const char *argv[]={
mas01cr@239 327 "./audioDB",
mas01cr@239 328 COM_QUERY,
mas01mc@307 329 qtypeStr,
mas01cr@239 330 COM_DATABASE,
mas01cr@239 331 dbName,
mas01mc@330 332 (trackKey&&strlen(trackKey))?COM_QUERYKEY:COM_FEATURES,
mas01mc@330 333 (trackKey&&strlen(trackKey))?ENSURE_STRING(trackKey):ENSURE_STRING(featureFileName),
mas01cr@239 334 COM_KEYLIST,
mas01mc@328 335 ENSURE_STRING(keyFileName),
mas01mc@314 336 usingQueryPoint?COM_QPOINT:COM_EXHAUSTIVE,
mas01mc@314 337 usingQueryPoint?qPosStr:"",
mas01cr@239 338 COM_POINTNN,
mas01cr@239 339 pointNNStr,
mas01cr@239 340 COM_TRACKNN,
mas01cr@239 341 trackNNStr,
mas01mc@307 342 COM_RADIUS,
mas01mc@307 343 radiusStr,
mas01cr@239 344 COM_SEQLEN,
mas01cr@239 345 seqLenStr,
mas01cr@239 346 COM_ABSOLUTE_THRESH,
mas01mc@310 347 absolute_thresholdStr,
mas01mc@314 348 lsh_exact?COM_LSH_EXACT:""
mas01cr@239 349 };
mas01cr@239 350
mas01mc@310 351 const unsigned argc = 22;
mas01mc@310 352
mas01mc@310 353
mas01cr@239 354 try {
mas01cr@239 355 audioDB(argc, (char* const*)argv, &adbQueryResponse);
mas01cr@239 356 return SOAP_OK;
mas01cr@239 357 } catch (char *err) {
mas01cr@239 358 soap_receiver_fault(soap, err, "");
mas01cr@239 359 return SOAP_FAULT;
mas01cr@239 360 }
mas01cr@239 361 }
mas01cr@239 362
mas01cr@239 363 /* Server loop */
mas01cr@239 364 void audioDB::startServer(){
mas01cr@239 365 struct soap soap;
mas01cr@239 366 int m, s; // master and slave sockets
mas01cr@239 367 soap_init(&soap);
mas01cr@239 368 // FIXME: largely this use of SO_REUSEADDR is to make writing (and
mas01cr@239 369 // running) test cases more convenient, so that multiple test runs
mas01cr@239 370 // in close succession don't fail because of a bin() error.
mas01cr@239 371 // Investigate whether there are any potential drawbacks in this,
mas01cr@239 372 // and also whether there's a better way to write the tests. --
mas01cr@239 373 // CSR, 2007-10-03
mas01cr@239 374 soap.bind_flags |= SO_REUSEADDR;
mas01cr@239 375 m = soap_bind(&soap, NULL, port, 100);
mas01cr@239 376 if (m < 0)
mas01cr@239 377 soap_print_fault(&soap, stderr);
mas01cr@239 378 else
mas01cr@239 379 {
mas01cr@239 380 fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
mas01mc@308 381 // Make a global Web Services LSH Index (SINGLETON)
mas01mc@313 382 if(WS_load_index && dbName && !index_exists(dbName, radius, sequenceLength)){
mas01mc@313 383 error("Can't find requested index file:", index_get_name(dbName,radius,sequenceLength));
mas01mc@313 384 }
mas01mc@308 385 if(WS_load_index && dbName && index_exists(dbName, radius, sequenceLength)){
mas01mc@308 386 char* indexName = index_get_name(dbName, radius, sequenceLength);
mas01mc@308 387 fprintf(stderr, "Loading LSH hashtables: %s...\n", indexName);
mas01mc@308 388 lsh = new LSH(indexName, true);
mas01mc@308 389 assert(lsh);
mas01mc@308 390 SERVER_LSH_INDEX_SINGLETON = lsh;
mas01mc@308 391 fprintf(stderr, "LSH INDEX READY\n");
mas01mc@308 392 fflush(stderr);
mas01mc@308 393 delete[] indexName;
mas01mc@308 394 }
mas01mc@324 395
mas01mc@324 396 // Server-side path prefix to databases and features
mas01mc@324 397 if(adb_root)
mas01mc@324 398 SERVER_ADB_ROOT = (char*)adb_root; // Server-side database root
mas01mc@324 399 if(adb_feature_root)
mas01mc@324 400 SERVER_ADB_FEATURE_ROOT = (char*)adb_feature_root; // Server-side features root
mas01mc@338 401
mas01mc@338 402 isServer = 1; // From this point, errors are reported via SOAP to the client
mas01cr@239 403 for (int i = 1; ; i++)
mas01cr@239 404 {
mas01cr@239 405 s = soap_accept(&soap);
mas01cr@239 406 if (s < 0)
mas01cr@239 407 {
mas01cr@239 408 soap_print_fault(&soap, stderr);
mas01cr@239 409 break;
mas01cr@239 410 }
mas01cr@239 411 /* FIXME: find a way to play nice with logging when run from
mas01cr@239 412 /etc/init.d scripts: at present this just goes nowhere */
mas01cr@239 413 fprintf(stderr, "%d: accepted connection from IP=%lu.%lu.%lu.%lu socket=%d\n", i,
mas01cr@239 414 (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, s);
mas01cr@239 415 if (soap_serve(&soap) != SOAP_OK) // process RPC request
mas01cr@239 416 soap_print_fault(&soap, stderr); // print error
mas01cr@239 417 fprintf(stderr, "request served\n");
mas01cr@239 418 soap_destroy(&soap); // clean up class instances
mas01cr@239 419 soap_end(&soap); // clean up everything and close socket
mas01cr@239 420 }
mas01cr@239 421 }
mas01cr@239 422 soap_done(&soap); // close master socket and detach environment
mas01cr@239 423 }