32 #include <unordered_map>
69 template <
class TRequest>
72 template <
class TRequest>
75 template <
class TRequest>
78 template <
class TRequest>
93 s_GetCommand<CPSG_Request_Biodata> (
"biodata",
"Request biodata info and data by bio ID"),
94 s_GetCommand<CPSG_Request_Blob> (
"blob",
"Request blob by blob ID"),
95 s_GetCommand<CPSG_Request_Resolve> (
"resolve",
"Request biodata info by bio ID",
SCommand::fParallel),
96 s_GetCommand<CPSG_Request_NamedAnnotInfo>(
"named_annot",
"Request named annotations info by bio ID(s)"),
97 s_GetCommand<CPSG_Request_Chunk> (
"chunk",
"Request blob data chunk by chunk ID"),
98 s_GetCommand<CPSG_Request_IpgResolve> (
"ipg_resolve",
"Request IPG info"),
99 s_GetCommand<SInteractive> (
"interactive",
"Interactive JSON-RPC mode",
SCommand::fParallel),
100 s_GetCommand<SPerformance> (
"performance",
"Performance testing",
SCommand::fHidden),
101 s_GetCommand<SJsonCheck> (
"json_check",
"JSON document validate",
SCommand::fHidden),
111 cmd_desc->SetUsageContext(
GetArguments().GetProgramBasename(),
"PSG client");
115 arg_desc->SetUsageContext(
"",
command.desc);
129 auto name = args.GetCommand();
135 return command.run(
this, args);
147 for (
auto i = data_flags.begin();
i != data_flags.end(); ++
i) {
150 for (
auto j =
i + 1; j != data_flags.end(); ++j) {
158 auto names = {
"First",
"Last",
"All" };
161 for (
string name :
names) {
164 for (
string excluded :
names) {
165 if (name != excluded) {
171 arg_desc.
AddAlias(
"latency",
"last-latency");
184 arg_desc.
AddFlag(
"include-hup",
"Include HUP data");
185 arg_desc.
AddFlag(
"https",
"Enable HTTPS");
187 arg_desc.
AddFlag(
"verbose",
"Verbose output");
192 const auto name = blob_only ?
"blob-only" :
"annot-only";
193 const auto comment = blob_only ?
"Output blob data only" :
"Output annot info only";
194 arg_desc.
AddFlag(name, comment);
200 template <
class TRequest>
207 arg_desc.
AddFlag(
"no-bio-id-resolution",
"Do not try to resolve provided bio ID(s) before use");
218 arg_desc.
AddAlias(
"id-file",
"input-file");
219 arg_desc.
AddFlag(
"server-mode",
"Output one response per line");
223 arg_desc.
AddFlag(
"no-bio-id-resolution",
"Do not try to resolve provided bio ID(s) before use");
248 arg_desc.
AddFlag(
"no-bio-id-resolution",
"Do not try to resolve provided bio ID(s) before use");
273 arg_desc.
AddFlag(
"server-mode",
"Output one response per line");
284 arg_desc.
AddFlag(
"server-mode",
"Output one JSON-RPC response per line and always output reply statuses");
285 arg_desc.
AddFlag(
"echo",
"Echo all incoming requests");
298 arg_desc.
AddFlag(
"local-queue",
"Whether user threads to use separate queues");
299 arg_desc.
AddFlag(
"report-immediately",
"Whether to report metrics immediately (or at the end)");
314 if (args[
"io-threads"].
HasValue()) {
315 auto io_threads = args[
"io-threads"].AsInteger();
316 TPSG_NumIo::SetDefault(io_threads);
319 if (args[
"requests-per-io"].
HasValue()) {
320 auto requests_per_io = args[
"requests-per-io"].AsInteger();
322 }
else if (parallel) {
326 if (args[
"max-streams"].
HasValue()) {
327 auto max_streams = args[
"max-streams"].AsInteger();
328 TPSG_MaxConcurrentStreams::SetDefault(max_streams);
332 auto use_cache = args[
"use-cache"].AsString();
337 auto timeout = args[
"timeout"].AsInteger();
338 TPSG_RequestTimeout::SetDefault(timeout);
342 TPSG_Https::SetDefault(
true);
345 if (args[
"debug-printout"].
HasValue()) {
346 auto debug_printout = args[
"debug-printout"].AsString();
354 template <
class TParams>
357 template <
class... TInitArgs>
360 args[
"service"].
HasValue() ? args[
"service"].AsString() :
string(),
363 std::forward<TInitArgs>(init_args)...
394 return (args.
Exist(
"blob-only") && args[
"blob-only"].HasValue()) ||
395 (args.
Exist(
"annot-only") && args[
"annot-only"].HasValue());
400 if (args.
Exist(
"output-fmt") && args[
"output-fmt"].HasValue()) {
401 const auto&
format = args[
"output-fmt"].AsString();
414 template <
class TParams>
417 template <
class... TInitArgs>
421 args[
"rate"].AsInteger(),
422 max(1,
min(10, args[
"worker-threads"].AsInteger())),
423 args[
"input-file"].AsString() ==
"-",
424 args[
"server-mode"].AsBoolean(),
425 std::forward<TInitArgs>(init_args)...
451 static_cast<size_t>(args[
"preview-size"].AsInt8()),
453 args[
"one-server"].HasValue(),
454 args[
"testing"].HasValue()
470 static_cast<size_t>(args[
"user-threads"].AsInteger()),
471 args[
"delay"].AsDouble(),
472 args[
"local-queue"].AsBoolean(),
473 args[
"report-immediately"].AsBoolean(),
499 void ForEachTSE(
TExclude exclude)
const;
503 auto GetSNPScaleLimit()
const {
return input[
"snp-scale-limit"].HasValue() ? objects::CSeq_id::GetSNPScaleLimit_Value(
input[
"snp-scale-limit"].AsString()) : CPSG_Request_NamedAnnotInfo::ESNPScaleLimit::eSNPScaleLimit_Default; }
504 void SetRequestFlags(shared_ptr<CPSG_Request> request)
const;
510 return [&](
const string& name) {
511 return input[name].HasValue();
517 const size_t n =
input.GetNExtra();
521 for (
size_t i = 1;
i <=
n; ++
i) {
525 rv.emplace_back(
input[
i].AsString());
534 const auto&
id =
input[
"ID"].AsString();
535 const auto& last_modified =
input[
"last-modified"];
536 return last_modified.HasValue() ?
CPSG_BlobId(
id, last_modified.AsInt8()) : id;
541 return {
input[
"ID2_CHUNK"].AsInteger(),
input[
"ID2_INFO"].AsString() };
548 auto blob_ids =
input[
"exclude-blob"].GetStringList();
550 for (
const auto& blob_id : blob_ids) {
562 template <
class TRequest>
565 auto request = SRequestBuilder::Build<TRequest>(args);
570 int CPsgClientApp::RunRequest<CPSG_Request_Resolve>(
const CArgs& args)
572 const auto single_request = args[
"ID"].HasValue();
574 if (single_request) {
575 auto request = SRequestBuilder::Build<CPSG_Request_Resolve>(args);
583 int CPsgClientApp::RunRequest<CPSG_Request_IpgResolve>(
const CArgs& args)
585 const auto single_request = args[
"protein"].HasValue() || args[
"ipg"].HasValue() || args[
"nucleotide"].HasValue();
587 if (single_request) {
588 auto request = SRequestBuilder::Build<CPSG_Request_IpgResolve>(args);
596 int CPsgClientApp::RunRequest<SInteractive>(
const CArgs& args)
601 GetRWConfig().SetValue(
"log",
"issued_subhit_limit", 0);
608 int CPsgClientApp::RunRequest<SPerformance>(
const CArgs& args)
615 int CPsgClientApp::RunRequest<SJsonCheck>(
const CArgs& args)
617 const auto&
schema = args[
"schema-file"];
622 template <
class TRequest>
625 return { std::move(name), std::move(desc), s_InitRequest<TRequest>, s_RunRequest<TRequest>,
flags };
628 int main(
int argc,
const char* argv[])
static const NStr::TNumToStringFlags kFlags
CCommandArgDescriptions –.
Bio-id (such as accession)
CNullable< string > TNucleotide
Request to the PSG server (see "CPSG_Request_*" below)
static int JsonCheck(istream *schema_is)
static int OneRequest(const SOneRequestParams ¶ms, shared_ptr< CPSG_Request > request)
static int ParallelProcessing(const TParams ¶ms, istream &is=cin)
static int Performance(const SPerformanceParams ¶ms)
static SCommand s_GetCommand(string name, string desc, SCommand::EFlags flags=SCommand::eDefault)
int RunRequest(const CArgs &args)
static void s_InitRequest(CArgDescriptions &arg_desc)
virtual int Run()
Run the application.
static int s_RunRequest(CPsgClientApp *that, const CArgs &args)
virtual void Init()
Initialize the application.
vector< SCommand > m_Commands
CTimeout – Timeout interval.
static const struct name_t names[]
virtual const CArgs & GetArgs(void) const
Get parsed command line arguments.
int AppMain(int argc, const char *const *argv, const char *const *envp=0, EAppDiagStream diag=eDS_Default, const char *conf=NcbiEmptyCStr, const string &name=NcbiEmptyString)
Main function (entry point) for the NCBI application.
virtual void SetupArgDescriptions(CArgDescriptions *arg_desc)
Setup the command line argument descriptions.
const CNcbiArguments & GetArguments(void) const
Get the application's cached unprocessed command-line arguments.
void AddFlag(const string &name, const string &comment, CBoolEnum< EFlagValue > set_value=eFlagHasValueIfSet, TFlags flags=0)
Add description for flag argument.
void AddExtra(unsigned n_mandatory, unsigned n_optional, const string &comment, EType type, TFlags flags=0)
Add description for the extra, unnamed positional arguments.
void SetConstraint(const string &name, const CArgAllow *constraint, EConstraintNegate negate=eConstraint)
Set additional user defined constraint on argument value.
void SetDependency(const string &arg1, EDependency dep, const string &arg2)
Define a dependency.
bool Exist(const string &name) const
Check existence of argument description.
void AddKey(const string &name, const string &synopsis, const string &comment, EType type, TFlags flags=0)
Add description for mandatory key.
void AddAlias(const string &alias, const string &arg_name)
Add argument alias.
void AddPositional(const string &name, const string &comment, EType type, TFlags flags=0)
Add description for mandatory positional argument.
void AddOptionalKey(const string &name, const string &synopsis, const string &comment, EType type, TFlags flags=0)
Add description for optional key without default value.
void AddOptionalPositional(const string &name, const string &comment, EType type, TFlags flags=0)
Add description for optional positional argument without default value.
void AddDefaultKey(const string &name, const string &synopsis, const string &comment, EType type, const string &default_value, TFlags flags=0, const string &env_var=kEmptyStr, const char *display_value=nullptr)
Add description for optional key with default value.
@ fAllowMultiple
Repeated key arguments are legal (use with AddKey)
@ fHidden
Hide it in Usage.
@ eHidden
Hide command in Usage.
@ eRequires
One argument requires another.
@ eExcludes
One argument excludes another.
@ eNoSortCommands
On PrintUsage, keep commands unsorted.
@ eCommandOptional
Command is not necessary.
@ eInt8
Convertible into an integer number (Int8 only)
@ eInputFile
Name of file (must exist and be readable)
@ eDouble
Convertible into a floating point number (double)
@ eDataSize
Integer number with possible "software" qualifiers (KB, KiB, et al)
@ eString
An arbitrary string.
@ eOutputFile
Name of file (must be writable)
@ eInteger
Convertible into an integer number (int or Int8)
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
ESerialDataFormat
Data file format.
@ eSerial_AsnText
ASN.1 text.
@ eSerial_AsnBinary
ASN.1 binary.
static string & ToLower(string &str)
Convert string to lower case – string& version.
@ eDefault
Default timeout (to be interpreted by the client code)
unsigned int
A callback function used to compare two keys in a database.
Defines the CNcbiApplication and CAppException classes for creating NCBI applications.
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
double f(double x_, const double &y_)
@ Default
Substitute always (default)
vector< CPSG_BioId > CPSG_BioIds
EPSG_BioIdResolution
Whether to try to resolve provided seq-ids before use.
@ Resolve
Try to resolve provided seq-ids.
@ NoResolve
Use provided seq-ids as is.
void s_AddLatencyOptions(CArgDescriptions &arg_desc)
void s_InitPsgOptions(CArgDescriptions &arg_desc)
void s_InitDataOnly(CArgDescriptions &arg_desc, bool blob_only=true)
void s_InitDataFlags(CArgDescriptions &arg_desc)
void s_SetPsgDefaults(const CArgs &args, bool parallel)
int main(int argc, const char *argv[])
static const char * schema
SBase(const CArgs &args, TInitArgs &&... init_args)
SBatchResolve(const CArgs &args)
SInteractive(const CArgs &args)
static size_t GetDataLimit(const CArgValue &value)
CLogLatencies::EWhich GetLatency(const CArgs &args)
static ESerialDataFormat GetDataOnlyOutputFormat(const CArgs &args)
SOneRequest(const CArgs &args)
static bool GetDataOnlyEnabled(const CArgs &args)
SParallelProcessing(const CArgs &args, TInitArgs &&... init_args)
SCommand(string n, string d, TInit i, TRun r, EFlags f)
function< void(CArgDescriptions &)> TInit
function< int(CPsgClientApp *, const CArgs &)> TRun
SIoRedirector(ios &what, ios &to)
static void SetDefault(const T &value)
static void SetImplicitDefault(const T &value)
Arbitrary request URL arguments.
SPSG_UserArgs GetUserArgs() const
CPSG_BioId GetBioId() const
auto GetAccSubstitution() const
auto GetBioIdType() const
vector< string > GetNamedAnnots() const
CTimeout GetResendTimeout() const
auto GetNucleotide() const
EPSG_BioIdResolution GetBioIdResolution() const
auto GetSNPScaleLimit() const
static CPSG_BioId::TType GetBioIdType(const string &type)
function< void(string)> TExclude
static EPSG_AccSubstitution GetAccSubstitution(const string &acc_substitution)
static SResolveParams GetResolveParams(const TInput &input)
static const initializer_list< SInfoFlag > & GetInfoFlags()
static const initializer_list< SDataFlag > & GetDataFlags()
function< bool(const string &)> TSpecified