diff --git a/testApp/remote/eget.cpp b/testApp/remote/eget.cpp index bb37be1..6ca4a9c 100644 --- a/testApp/remote/eget.cpp +++ b/testApp/remote/eget.cpp @@ -996,6 +996,7 @@ void printValues(shared_vector const & names, vector: Ser default provider name, default is '%s'\n" " -q: Quiet mode, print only error messages\n" " -d: Enable debug output\n" " -F : Use as an alternate output field separator\n" @@ -1030,10 +1032,14 @@ void usage (void) "#! Get the archive history of quad45:bdes;history between 2 times, from the archive service\n" "> eget -s archiveService -a entity=quad45:bdes;history -a starttime=2012-02-12T10:04:56 -a endtime=2012-02-01T10:04:56\n" "\n" - , DEFAULT_REQUEST, DEFAULT_TIMEOUT); + "#! Get polynomials for bunch of quads using a stdin to give a list of PV names\n" + "> eget -s names -a pattern=QUAD:LTU1:8%%:POLYCOEF | eget -\n" + "\n" + , DEFAULT_REQUEST, DEFAULT_TIMEOUT, DEFAULT_PROVIDER); } + class ChannelGetRequesterImpl : public ChannelGetRequester { private: @@ -1440,15 +1446,17 @@ int main (int argc, char *argv[]) bool serviceRequest = false; bool pvRequestProvidedByUser = false; bool onlyQuery = false; + bool read_stdin = false; string service; //string urlEncodedRequest; vector< pair > parameters; bool monitor = false; bool quiet = false; + string defaultProvider = DEFAULT_PROVIDER; setvbuf(stdout,NULL,_IOLBF,BUFSIZ); /* Set stdout to line buffering */ - while ((opt = getopt(argc, argv, ":hr:s:a:w:zntTmxqdcF:")) != -1) { + while ((opt = getopt(argc, argv, ":hr:s:a:w:zntTmxp:qdcF:-")) != -1) { switch (opt) { case 'h': /* Print usage */ usage(); @@ -1511,6 +1519,19 @@ int main (int argc, char *argv[]) break; case 'x': /* Column-major order mode */ columnMajor = true; + break; + case 'p': /* Provider name */ + defaultProvider = optarg; + + // for now no only pva/ca schema is supported + // TODO + if (defaultProvider != "pva" && defaultProvider != "ca") + { + std::cerr << "invalid default provider '" << defaultProvider << "', only 'pva' and 'ca' are supported" << std::endl; + // TODO + return 1; + } + break; case 'q': /* Quiet mode */ quiet = true; @@ -1524,6 +1545,9 @@ int main (int argc, char *argv[]) case 'F': /* Store this for output formatting */ fieldSeparator = (char) *optarg; break; + case '-': /* Store this for output formatting */ + read_stdin = true; + break; case '?': fprintf(stderr, "Unrecognized option: '-%c'. ('eget -h' for help.)\n", @@ -1541,7 +1565,12 @@ int main (int argc, char *argv[]) } int nPvs = argc - optind; /* Remaining arg list are PV names */ - if (nPvs < 1 && !serviceRequest) + if (nPvs > 0) + { + // do not allow (not supported) reading stdin and command line specified pvs + read_stdin = false; + } + else if (nPvs < 1 && !serviceRequest && !read_stdin) { fprintf(stderr, "No PV name(s) specified. ('eget -h' for help.)\n"); return 1; @@ -1560,7 +1589,7 @@ int main (int argc, char *argv[]) fprintf(stderr, "PV name(s) specified and service query requested. ('eget -h' for help.)\n"); return 1; } - + SET_LOG_LEVEL(debug ? logLevelDebug : logLevelError); std::cout << std::boolalpha; @@ -1600,7 +1629,7 @@ int main (int argc, char *argv[]) // TODO if (uri.protocol != "pva" && uri.protocol != "ca") { - std::cerr << "invalid URI scheme '" << uri.protocol << "', only 'pva' and 'ca' is supported" << std::endl; + std::cerr << "invalid URI scheme '" << uri.protocol << "', only 'pva' and 'ca' are supported" << std::endl; // TODO return 1; } @@ -1620,7 +1649,6 @@ int main (int argc, char *argv[]) } else { - // TODO URI support for (int n = 0; optind < argc; n++, optind++) { URI uri; @@ -1632,7 +1660,7 @@ int main (int argc, char *argv[]) // TODO if (uri.protocol != "pva" && uri.protocol != "ca") { - std::cerr << "invalid URI scheme '" << uri.protocol << "', only 'pva' and 'ca' is supported" << std::endl; + std::cerr << "invalid URI scheme '" << uri.protocol << "', only 'pva' and 'ca' are supported" << std::endl; // TODO return 1; } @@ -1652,9 +1680,8 @@ int main (int argc, char *argv[]) } else { - // defaults to "pva" pvs.push_back(argv[optind]); - providerNames.push_back("pva"); + providerNames.push_back(defaultProvider); } } } @@ -1675,24 +1702,83 @@ int main (int argc, char *argv[]) for (int n = 0; n < nPvs; n++) { shared_ptr channelRequesterImpl(new ChannelRequesterImpl(quiet)); - // TODO no privder check + // TODO no provider check channels[n] = getChannelAccess()->getProvider(providerNames[n])->createChannel(pvs[n], channelRequesterImpl); } // TODO maybe unify for nPvs == 1?! - bool collectValues = (mode == ValueOnlyMode) && nPvs > 1; + bool collectValues = (mode == ValueOnlyMode) && nPvs > 1 && !read_stdin; vector collectedValues; - collectedValues.reserve(nPvs); shared_vector collectedNames; - collectedNames.reserve(nPvs); - - // for now a simple iterating sync implementation, guarantees order - for (int n = 0; n < nPvs; n++) + if (collectValues) { + collectedValues.reserve(nPvs); + collectedNames.reserve(nPvs); + } + + // for now a simple iterating sync implementation, guarantees order + int n = -1; + while (true) + { + Channel::shared_pointer channel; + + if (!read_stdin) + { + if (++n >= nPvs) + break; + channel = channels[n]; + } + else + { + string cn; + string cp; + std::cin >> cn; + if (!std::cin) + break; + + URI uri; + bool validURI = URI::parse(cn.c_str(), uri); + if (validURI) + { + // TODO this is copy&pase code from above, clean it up + // for now no only pva/ca schema is supported, without authority + // TODO + if (uri.protocol != "pva" && uri.protocol != "ca") + { + std::cerr << "invalid URI scheme '" << uri.protocol << "', only 'pva' and 'ca' are supported" << std::endl; + // TODO + return 1; + } + + // authority = uri.host; + + if (uri.path.length() <= 1) + { + std::cerr << "invalid URI, empty path" << std::endl; + // TODO + return 1; + } + + // skip trailing '/' + cn = uri.path.substr(1); + cp = uri.protocol; + } + else + { + // leave cn as it is, use default provider + cp = defaultProvider; + } + + + + shared_ptr channelRequesterImpl(new ChannelRequesterImpl(quiet)); + // TODO no provider check + channel = getChannelAccess()->getProvider(cp)->createChannel(cn, channelRequesterImpl); + } + if (monitor) { - Channel::shared_pointer channel = channels[n]; shared_ptr monitorRequesterImpl(new MonitorRequesterImpl(channel->getChannelName())); channel->createMonitor(monitorRequesterImpl, pvRequest); } @@ -1703,7 +1789,6 @@ int main (int argc, char *argv[]) Channel::shared_pointer channel = provider->createChannel(pvs[n], channelRequesterImpl); */ - Channel::shared_pointer channel = channels[n]; shared_ptr channelRequesterImpl = dynamic_pointer_cast(channel->getChannelRequester()); if (channelRequesterImpl->waitUntilConnected(timeOut))