void sendtag(char key, char * tagstring, struct hash data) { unsigned nsplt = 0; int result = 0; char ** splt = NULL; if(tagstring) { unsigned length = strlen(tagstring); /* remove trailing commas */ while(tagstring[length-1] == ',') tagstring[--length] = 0; splt = split(tagstring, ",\n", & nsplt); } switch(key) { case 'a': result = xmlrpc("tagArtist", "sas", value(& data, "creator"), splt, "set"); break; case 'l': result = xmlrpc( "tagAlbum", "ssas", value(& data, "creator"), value(& data, "album"), splt, "set" ); break; case 't': result = xmlrpc( "tagTrack", "ssas", value(& data, "creator"), value(& data, "title"), splt, "set" ); break; } if(!enabled(QUIET)) puts(result ? "Tagged." : "Sorry, failed."); purge(splt); splt = NULL; }
int main(int argc, char* argv[]) { try { log_init("rpcbenchclient.properties"); cxxtools::Arg<std::string> ip(argc, argv, 'i'); cxxtools::Arg<unsigned> threads(argc, argv, 't', 4); cxxtools::Arg<unsigned> concurrentRequestsPerThread(argc, argv, 'c', 4); cxxtools::Arg<bool> xmlrpc(argc, argv, 'x'); cxxtools::Arg<bool> binary(argc, argv, 'b'); cxxtools::Arg<bool> json(argc, argv, 'j'); cxxtools::Arg<bool> jsonhttp(argc, argv, 'J'); cxxtools::Arg<unsigned short> port(argc, argv, 'p', binary ? 7003 : json ? 7004 : 7002); BenchClient::numRequests(cxxtools::Arg<unsigned>(argc, argv, 'n', 10000)); BenchClient::vectorSize(cxxtools::Arg<unsigned>(argc, argv, 'v', 0)); BenchClient::objectsSize(cxxtools::Arg<unsigned>(argc, argv, 'o', 0)); if (!xmlrpc && !binary && !json && !jsonhttp) { std::cerr << "usage: " << argv[0] << " [options]\n" "options:\n" " -l ip set ip address of server (default: localhost)\n" " -p number set port number of server (default: 7002 for http, 7003 for binary and 7004 for json)\n" " -x use xmlrpc protocol\n" " -b use binary rpc protocol\n" " -j use json rpc protocol\n" " -J use json rpc over http protocol\n" " -c number concurrent request per thread (default: 4)\n" " -t number set number of threads (default: 4)\n" " -n number set number of requests (default: 10000)\n" "one protocol must be selected\n" << std::endl; return -1; } BenchClients clients; XmlRpcClientCreator xmlRpcClientCreator(ip, port, "/xmlrpc"); JsonHttpClientCreator jsonHttpClientCreator(ip, port, "/jsonrpc"); JsonRpcClientCreator jsonRpcClientCreator(ip, port); BinRpcClientCreator binRpcClientCreator(ip, port); ClientCreator& clientCreator = binary ? static_cast<ClientCreator&>(binRpcClientCreator) : json ? static_cast<ClientCreator&>(jsonRpcClientCreator) : jsonhttp ? static_cast<ClientCreator&>(jsonHttpClientCreator) : static_cast<ClientCreator&>(xmlRpcClientCreator); while (clients.size() < threads) { clients.push_back(new BenchClient(clientCreator, concurrentRequestsPerThread)); } cxxtools::Clock cl; cl.start(); for (BenchClients::iterator it = clients.begin(); it != clients.end(); ++it) (*it)->start(); for (BenchClients::iterator it = clients.begin(); it != clients.end(); ++it) (*it)->join(); cxxtools::Timespan t = cl.stop(); std::cout << BenchClient::numRequests() << " requests in " << t.totalMSecs()/1e3 << " s => " << (BenchClient::requestsStarted() / (t.totalMSecs()/1e3)) << "#/s\n" << BenchClient::requestsFinished() << " finished " << BenchClient::requestsFailed() << " failed" << std::endl; for (BenchClients::iterator it = clients.begin(); it != clients.end(); ++it) delete *it; } catch (const std::exception& e) { std::cerr << e.what() << std::endl; } }