annotate soap.cpp @ 249:1da9a9ed55a3

Slightly refactored the new trackSequenceQueryNNReporter so that it is a derived class of trackAveragingReporter. This reduces code duplication significantly. The reporter is still accessed via the nsequence QUERY directive from the command line.
author mas01mc
date Sun, 17 Feb 2008 16:39:57 +0000
parents 2cc06e5b05a5
children d1b8b2dec37e
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;
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 }