annotate soap.cpp @ 277:abfb26e08d9c audiodb-debian

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