mas01cr@239: #include "audioDB.h" mas01cr@239: #include "adb.nsmap" mas01cr@239: mas01cr@239: /* Command-line client definitions */ mas01cr@239: mas01cr@239: // FIXME: this can't propagate the sequence length argument (used for mas01cr@239: // dudCount). See adb__status() definition for the other half of mas01cr@239: // this. -- CSR, 2007-10-01 mas01cr@239: void audioDB::ws_status(const char*dbName, char* hostport){ mas01cr@239: struct soap soap; mas01cr@239: adb__statusResponse adbStatusResponse; mas01cr@239: mas01cr@239: // Query an existing adb database mas01cr@239: soap_init(&soap); mas01cr@239: if(soap_call_adb__status(&soap,hostport,NULL,(char*)dbName,adbStatusResponse)==SOAP_OK) { mas01cr@239: std::cout << "numFiles = " << adbStatusResponse.result.numFiles << std::endl; mas01cr@239: std::cout << "dim = " << adbStatusResponse.result.dim << std::endl; mas01cr@239: std::cout << "length = " << adbStatusResponse.result.length << std::endl; mas01cr@239: std::cout << "dudCount = " << adbStatusResponse.result.dudCount << std::endl; mas01cr@239: std::cout << "nullCount = " << adbStatusResponse.result.nullCount << std::endl; mas01cr@239: std::cout << "flags = " << adbStatusResponse.result.flags << std::endl; mas01cr@239: } else { mas01cr@239: soap_print_fault(&soap,stderr); mas01cr@239: } mas01cr@239: mas01cr@239: soap_destroy(&soap); mas01cr@239: soap_end(&soap); mas01cr@239: soap_done(&soap); mas01cr@239: } mas01cr@239: mas01mc@308: // WS_QUERY (CLIENT SIDE) mas01mc@307: void audioDB::ws_query(const char*dbName, const char *featureFileName, const char* hostport){ mas01cr@239: struct soap soap; mas01cr@239: adb__queryResponse adbQueryResponse; mas01cr@239: mas01cr@239: soap_init(&soap); mas01cr@239: if(soap_call_adb__query(&soap,hostport,NULL, mas01mc@307: (char*)dbName,(char*)featureFileName,(char*)trackFileName,(char*)timesFileName, mas01cr@239: queryType, queryPoint, pointNN, trackNN, sequenceLength, adbQueryResponse)==SOAP_OK){ mas01cr@239: //std::std::cerr << "result list length:" << adbQueryResponse.result.__sizeRlist << std::std::endl; mas01cr@239: for(int i=0; iqueryPoint, qPosStr); mas01cr@239: INTSTRINGIFY(parms->pointNN, pointNNStr); mas01mc@307: INTSTRINGIFY(parms->trackNN, trackNNStr); mas01mc@307: INTSTRINGIFY(parms->sequenceLength, seqLenStr); mas01cr@239: mas01cr@239: DOUBLESTRINGIFY(parms->relative_threshold, relative_thresholdStr); mas01cr@239: DOUBLESTRINGIFY(parms->absolute_threshold, absolute_thresholdStr); mas01mc@307: DOUBLESTRINGIFY(parms->radius, radiusStr); mas01mc@307: mas01mc@307: // WS queries only support 1-nearest neighbour point reporting mas01mc@307: // at the moment, until we figure out how to better serve results mas01mc@307: snprintf(qtypeStr, 256, "nsequence"); mas01mc@307: mas01mc@310: const char *argv[]={ mas01cr@239: "./audioDB", mas01cr@239: COM_QUERY, mas01mc@307: qtypeStr, mas01cr@239: COM_DATABASE, mas01cr@239: dbName, mas01mc@307: COM_QUERYKEY, mas01mc@307: ENSURE_STRING(qKey), mas01cr@239: COM_KEYLIST, mas01mc@307: ENSURE_STRING(parms->keyList), mas01mc@310: parms->usingQueryPoint?COM_QPOINT:COM_EXHAUSTIVE, mas01mc@310: parms->usingQueryPoint?qPosStr:"", mas01cr@239: COM_POINTNN, mas01cr@239: pointNNStr, mas01cr@239: COM_TRACKNN, mas01cr@239: trackNNStr, mas01mc@307: COM_RADIUS, mas01mc@307: radiusStr, mas01cr@239: COM_SEQLEN, mas01cr@239: seqLenStr, mas01cr@239: COM_ABSOLUTE_THRESH, mas01mc@310: absolute_thresholdStr, mas01mc@310: parms->lsh_exact?COM_LSH_EXACT:"" mas01cr@239: }; mas01cr@239: mas01mc@310: const unsigned argc = 22; mas01mc@310: mas01mc@310: mas01cr@239: try { mas01cr@239: audioDB(argc, (char* const*)argv, &adbQueryResponse); mas01cr@239: return SOAP_OK; mas01cr@239: } catch (char *err) { mas01cr@239: soap_receiver_fault(soap, err, ""); mas01cr@239: return SOAP_FAULT; mas01cr@239: } mas01cr@239: } mas01cr@239: mas01cr@239: /* Server loop */ mas01cr@239: void audioDB::startServer(){ mas01cr@239: struct soap soap; mas01cr@239: int m, s; // master and slave sockets mas01cr@239: soap_init(&soap); mas01cr@239: // FIXME: largely this use of SO_REUSEADDR is to make writing (and mas01cr@239: // running) test cases more convenient, so that multiple test runs mas01cr@239: // in close succession don't fail because of a bin() error. mas01cr@239: // Investigate whether there are any potential drawbacks in this, mas01cr@239: // and also whether there's a better way to write the tests. -- mas01cr@239: // CSR, 2007-10-03 mas01cr@239: soap.bind_flags |= SO_REUSEADDR; mas01cr@239: m = soap_bind(&soap, NULL, port, 100); mas01cr@239: if (m < 0) mas01cr@239: soap_print_fault(&soap, stderr); mas01cr@239: else mas01cr@239: { mas01cr@239: fprintf(stderr, "Socket connection successful: master socket = %d\n", m); mas01mc@308: // Make a global Web Services LSH Index (SINGLETON) mas01mc@308: if(WS_load_index && dbName && index_exists(dbName, radius, sequenceLength)){ mas01mc@308: char* indexName = index_get_name(dbName, radius, sequenceLength); mas01mc@308: fprintf(stderr, "Loading LSH hashtables: %s...\n", indexName); mas01mc@308: lsh = new LSH(indexName, true); mas01mc@308: assert(lsh); mas01mc@308: SERVER_LSH_INDEX_SINGLETON = lsh; mas01mc@308: fprintf(stderr, "LSH INDEX READY\n"); mas01mc@308: fflush(stderr); mas01mc@308: delete[] indexName; mas01mc@308: } mas01mc@308: mas01cr@239: for (int i = 1; ; i++) mas01cr@239: { mas01cr@239: s = soap_accept(&soap); mas01cr@239: if (s < 0) mas01cr@239: { mas01cr@239: soap_print_fault(&soap, stderr); mas01cr@239: break; mas01cr@239: } mas01cr@239: /* FIXME: find a way to play nice with logging when run from mas01cr@239: /etc/init.d scripts: at present this just goes nowhere */ mas01cr@239: fprintf(stderr, "%d: accepted connection from IP=%lu.%lu.%lu.%lu socket=%d\n", i, mas01cr@239: (soap.ip >> 24)&0xFF, (soap.ip >> 16)&0xFF, (soap.ip >> 8)&0xFF, soap.ip&0xFF, s); mas01cr@239: if (soap_serve(&soap) != SOAP_OK) // process RPC request mas01cr@239: soap_print_fault(&soap, stderr); // print error mas01cr@239: fprintf(stderr, "request served\n"); mas01cr@239: soap_destroy(&soap); // clean up class instances mas01cr@239: soap_end(&soap); // clean up everything and close socket mas01cr@239: } mas01cr@239: } mas01cr@239: soap_done(&soap); // close master socket and detach environment mas01cr@239: }