NCBI C++ ToolKit
asnval.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: asnval.cpp 101080 2023-10-26 17:06:38Z stakhovv $
2  * ===========================================================================
3  *
4  * PUBLIC DOMAIN NOTICE
5  * National Center for Biotechnology Information
6  *
7  * This software/database is a "United States Government Work" under the
8  * terms of the United States Copyright Act. It was written as part of
9  * the author's official duties as a United States Government employee and
10  * thus cannot be copyrighted. This software/database is freely available
11  * to the public for use. The National Library of Medicine and the U.S.
12  * Government have not placed any restriction on its use or reproduction.
13  *
14  * Although all reasonable efforts have been taken to ensure the accuracy
15  * and reliability of the software and data, the NLM and the U.S.
16  * Government do not and cannot warrant the performance or results that
17  * may be obtained by using this software or data. The NLM and the U.S.
18  * Government disclaim all warranties, express or implied, including
19  * warranties of performance, merchantability or fitness for any particular
20  * purpose.
21  *
22  * Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author: Jonathan Kans, Clifford Clausen, Aaron Ucko
27  *
28  * File Description:
29  * validator
30  *
31  */
32 
33 #include <ncbi_pch.hpp>
34 #include <common/ncbi_source_ver.h>
35 #include <corelib/ncbistd.hpp>
36 #include <corelib/ncbistre.hpp>
37 #include <corelib/ncbiapp.hpp>
38 #include <corelib/ncbiargs.hpp>
39 
40 #include <serial/objistr.hpp>
41 
43 #include <connect/ncbi_util.h>
44 
45 // Objects includes
48 
49 // Object Manager includes
52 
54 #include "app_config.hpp"
55 #include "thread_state.hpp"
56 #include <util/message_queue.hpp>
57 #include <future>
58 
59 #include <common/test_assert.h> /* This header must go last */
60 
61 using namespace ncbi;
63 USING_SCOPE(validator);
65 
66 template<class _T>
68 {
69 public:
70  using token_type = _T;
71  TThreadPoolLimited(unsigned num_slots, unsigned queue_depth = 0):
72  m_tasks_semaphose{num_slots, num_slots},
73  m_product_queue{queue_depth == 0 ? num_slots : queue_depth}
74  {}
75 
76  // acquire new slot to run on
77  void acquire() {
78  m_running++;
79  m_tasks_semaphose.Wait();
80  }
81 
82  // release a slot and send a product down to the queue
83  void release(token_type&& token) {
84  m_tasks_semaphose.Post();
85  m_product_queue.push_back(std::move(token));
86 
87  size_t current = m_running.fetch_sub(1);
88  if (current == 1)
89  { // the last task completed, singal main thread to finish
90  m_product_queue.push_back({});
91  }
92  }
93 
94  auto GetNext() {
95  return m_product_queue.pop_front();
96  }
97 
98 private:
99  std::atomic<size_t> m_running = 0; // number of started threads
101  CMessageQueue<token_type> m_product_queue{8}; // the queue of threads products
102  std::future<void> m_consumer;
103 };
104 
106 {
107 
108 public:
109  CAsnvalApp();
110  ~CAsnvalApp();
111 
112  void Init() override;
113  int Run() override;
114 
115 private:
116  void Setup(const CArgs& args);
117  void x_AliasLogFile();
118 
119  CThreadExitData xValidate(const string& filename, bool save_output);
120  void xValidateThread(const string& filename, bool save_output);
121  CThreadExitData xCombinedWriterTask(std::ostream* ofile);
122 
124 
125  void ValidateOneDirectory(string dir_name, bool recurse);
126  TPool m_queue{8};
127 
128  unique_ptr<CAppConfig> mAppConfig;
129  unique_ptr<edit::CRemoteUpdater> mRemoteUpdater;
130  size_t m_NumFiles = 0;
131 };
132 
133 CThreadExitData CAsnvalApp::xValidate(const string& filename, bool save_output)
134 {
135  CAsnvalThreadState mContext(*mAppConfig, mRemoteUpdater->GetUpdateFunc());
136  auto result = mContext.ValidateOneFile(filename);
137  if (save_output) {
138  CAsnvalOutput out(*mAppConfig, filename);
139  result.mReported += out.Write(result.mEval);
140  result.mEval.clear();
141  }
142  return result;
143 }
144 
145 void CAsnvalApp::xValidateThread(const string& filename, bool save_output)
146 {
147  CThreadExitData result = xValidate(filename, save_output);
148 
149  std::promise<CThreadExitData> prom;
150  prom.set_value(std::move(result));
151  auto fut = prom.get_future();
152 
153  m_queue.release(std::move(fut));
154 }
155 
156 string s_GetSeverityLabel(EDiagSev sev, bool is_xml)
157 {
158  static const string str_sev[] = {
159  "NOTE", "WARNING", "ERROR", "REJECT", "FATAL", "MAX"
160  };
161  if (sev < 0 || sev > eDiagSevMax) {
162  return "NONE";
163  }
164  if (sev == 0 && is_xml) {
165  return "INFO";
166  }
167 
168  return str_sev[sev];
169 }
170 
171 
173 {
175  SetVersion(vers);
176 }
177 
178 
180 {
181 }
182 
183 
185 {
186  const CArgs& args = GetArgs();
187 
188  if (args["L"]) {
189  if (args["logfile"]) {
190  if (NStr::Equal(args["L"].AsString(), args["logfile"].AsString())) {
191  // no-op
192  } else {
193  NCBI_THROW(CException, eUnknown, "Cannot specify both -L and -logfile");
194  }
195  } else {
196  SetLogFile(args["L"].AsString());
197  }
198  }
199 }
200 
202 {
203  // Prepare command line descriptions
204 
205  // Create
206  unique_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
207 
208  arg_desc->AddOptionalKey
209  ("indir", "Directory", "Path to ASN.1 Files",
211 
212  arg_desc->AddOptionalKey
213  ("i", "InFile", "Single Input File",
215  arg_desc->AddOptionalKey(
216  "o", "OutFile", "Single Output File",
218  arg_desc->AddOptionalKey(
219  "f", "Filter", "Substring Filter",
221  arg_desc->AddDefaultKey
222  ("x", "String", "File Selection Substring", CArgDescriptions::eString, ".ent");
223  arg_desc->AddFlag("u", "Recurse");
224  arg_desc->AddDefaultKey(
225  "R", "SevCount", "Severity for Error in Return Code\n\
226 \tinfo(0)\n\
227 \twarning(1)\n\
228 \terror(2)\n\
229 \tcritical(3)\n\
230 \tfatal(4)\n\
231 \ttrace(5)",
233  arg_desc->AddDefaultKey(
234  "Q", "SevLevel", "Lowest Severity for Error to Show\n\
235 \tinfo(0)\n\
236 \twarning(1)\n\
237 \terror(2)\n\
238 \tcritical(3)\n\
239 \tfatal(4)\n\
240 \ttrace(5)",
242  arg_desc->AddDefaultKey(
243  "P", "SevLevel", "Highest Severity for Error to Show\n\
244 \tinfo(0)\n\
245 \twarning(1)\n\
246 \terror(2)\n\
247 \tcritical(3)\n\
248 \tfatal(4)\n\
249 \ttrace(5)",
252  arg_desc->SetConstraint("Q", constraint);
253  arg_desc->SetConstraint("P", constraint);
254  arg_desc->SetConstraint("R", constraint);
255  arg_desc->AddOptionalKey(
256  "E", "String", "Only Error Code to Show",
258 
259  arg_desc->AddDefaultKey("a", "a",
260  "ASN.1 Type\n\
261 \ta Automatic\n\
262 \tc Catenated\n\
263 \te Seq-entry\n\
264 \tb Bioseq\n\
265 \ts Bioseq-set\n\
266 \tm Seq-submit\n\
267 \td Seq-desc",
269  "",
271 
272  arg_desc->AddFlag("b", "Input is in binary format; obsolete",
274  arg_desc->AddFlag("c", "Batch File is Compressed; obsolete",
276 
277  arg_desc->AddFlag("quiet", "Do not log progress");
278 
280  arg_desc->AddFlag("annot", "Verify Seq-annots only");
281 
282  arg_desc->AddOptionalKey(
283  "L", "OutFile", "Log File",
285 
286  arg_desc->AddDefaultKey("v", "Verbosity",
287  "Verbosity\n"
288  "\t1 Standard Report\n"
289  "\t2 Accession / Severity / Code(space delimited)\n"
290  "\t3 Accession / Severity / Code(tab delimited)\n"
291  "\t4 XML Report",
294  arg_desc->SetConstraint("v", v_constraint);
295 
296  arg_desc->AddFlag("cleanup", "Perform BasicCleanup before validating (to match C Toolkit)");
297  arg_desc->AddFlag("batch", "Process NCBI release file (Seq-submit or Bioseq-set only)");
298  arg_desc->AddFlag("huge", "Execute in huge-file mode");
299  arg_desc->AddFlag("disable-huge", "Explicitly disable huge-files mode");
300  arg_desc->SetDependency("disable-huge",
302  "huge");
303 
304  arg_desc->AddOptionalKey(
305  "D", "String", "Path to lat_lon country data files",
307 
311 
312  // Program description
313  arg_desc->SetUsageContext("", "ASN Validator");
314 
315  // Pass argument descriptions to the application
316  SetupArgDescriptions(arg_desc.release());
317 
318  x_AliasLogFile();
319 }
320 
321 
322 //LCOV_EXCL_START
323 //unable to exercise with our test framework
324 void CAsnvalApp::ValidateOneDirectory(string dir_name, bool recurse)
325 {
326  const CArgs& args = GetArgs();
327 
328  CDir dir(dir_name);
329 
330  string suffix = ".ent";
331  if (args["x"]) {
332  suffix = args["x"].AsString();
333  }
334  string mask = "*" + suffix;
335 
337 
338  for (CDir::TEntry ii : files) {
339  string fname = ii->GetName();
340  if (ii->IsFile() &&
341  (!args["f"] || NStr::Find(fname, args["f"].AsString()) != NPOS)) {
342  string fpath = CDirEntry::MakePath(dir_name, fname);
343 
344  bool separate_outputs = !args["o"];
345 
346  m_queue.acquire();
347  // start thread detached, it will post results to the queue itself
348  std::thread([this, fpath, separate_outputs]()
349  { xValidateThread(fpath, separate_outputs); })
350  .detach();
351  }
352  }
353  if (recurse) {
354  CDir::TEntries subdirs(dir.GetEntries("", CDir::eDir));
355  for (CDir::TEntry ii : subdirs) {
356  string subdir = ii->GetName();
357  if (ii->IsDir() && !NStr::Equal(subdir, ".") && !NStr::Equal(subdir, "..")) {
358  string subname = CDirEntry::MakePath(dir_name, subdir);
359  ValidateOneDirectory(subname, recurse);
360  }
361  }
362  }
363 
364 }
365 //LCOV_EXCL_STOP
366 
367 
369 {
370  CThreadExitData combined_exit_data;
371 
372  std::list<CConstRef<CValidError>> eval;
373 
374  CAsnvalOutput out(*mAppConfig, combined_file);
375 
376  while(true)
377  {
378  auto fut = m_queue.GetNext();
379  if (!fut.valid())
380  break;
381 
382  auto exit_data = fut.get();
383 
384  m_NumFiles++;
385 
386  combined_exit_data.mReported += exit_data.mReported;
387 
388  combined_exit_data.mNumRecords += exit_data.mNumRecords;
389  if (exit_data.mLongest > combined_exit_data.mLongest) {
390  combined_exit_data.mLongest = exit_data.mLongest;
391  combined_exit_data.mLongestId = exit_data.mLongestId;
392  }
393 
394  if (combined_file && !exit_data.mEval.empty()) {
395  combined_exit_data.mReported += out.Write(exit_data.mEval);
396  }
397  }
398 
399  return combined_exit_data;
400 }
401 
403 {
404  const CArgs& args = GetArgs();
405  Setup(args);
406 
407  mRemoteUpdater.reset(new edit::CRemoteUpdater(nullptr)); //m_logger));
408 
409  CTime expires = GetFullVersion().GetBuildInfo().GetBuildTime();
410  if (!expires.IsEmpty())
411  {
412  expires.AddYear();
414  {
415  NcbiCerr << "This copy of " << GetProgramDisplayName()
416  << " is more than 1 year old. Please download the current version if it is newer." << endl;
417  }
418  }
419 
420  time_t start_time = time(NULL);
421 
422  std::ostream* ValidErrorStream = nullptr;
423  if (args["o"]) { // combined output
424  ValidErrorStream = &args["o"].AsOutputFile();
425  }
426 
427  if (args["D"]) {
428  string lat_lon_path = args["D"].AsString();
429  if (! lat_lon_path.empty()) {
430  SetEnvironment( "NCBI_LAT_LON_DATA_PATH", lat_lon_path );
431  }
432  }
433 
434  if (args["b"]) {
435  cerr << "Warning: -b is deprecated; do not use" << endl;
436  }
437 
438  CThreadExitData exit_data;
439  bool exception_caught = false;
440  try {
441  if (args["indir"]) {
442 
443  auto writer_task = std::async([this, ValidErrorStream] { return xCombinedWriterTask(ValidErrorStream); });
444 
445  ValidateOneDirectory(args["indir"].AsString(), args["u"]);
446 
447  exit_data = writer_task.get(); // this will wait writer task completion
448 
449  } else {
450  string in_filename = (args["i"]) ? args["i"].AsString() : "";
451  exit_data = xValidate(in_filename, ValidErrorStream==nullptr);
452  m_NumFiles++;
453  if (ValidErrorStream) {
454  CAsnvalOutput out(*mAppConfig, ValidErrorStream);
455  exit_data.mReported += out.Write({exit_data.mEval});
456  }
457  }
458  } catch (CException& e) {
459  ERR_POST(Error << e);
460  exception_caught = true;
461  }
462  if (m_NumFiles == 0) {
463  ERR_POST("No matching files found");
464  }
465 
466  time_t stop_time = time(NULL);
467  if (! mAppConfig->mQuiet ) {
468  LOG_POST_XX(Corelib_App, 1, "Finished in " << stop_time - start_time << " seconds");
469  LOG_POST_XX(Corelib_App, 1, "Longest processing time " << exit_data.mLongest << " seconds on " << exit_data.mLongestId);
470  LOG_POST_XX(Corelib_App, 1, "Total number of records " << exit_data.mNumRecords);
471  }
472 
473  if (exit_data.mReported > 0 || exception_caught) {
474  return 1;
475  } else {
476  return 0;
477  }
478 }
479 
480 
481 void CAsnvalApp::Setup(const CArgs& args)
482 {
483  // Setup application registry and logs for CONNECT library
484  // CORE_SetLOG(LOG_cxx2c());
485  // CORE_SetREG(REG_cxx2c(&GetConfig(), false));
486  // Setup MT-safety for CONNECT library
487  // CORE_SetLOCK(MT_LOCK_cxx2c());
488 
489  mAppConfig.reset(new CAppConfig(args, GetConfig()));
490 
491  // Create object manager
495 }
496 
497 
499 {
500  m_Output.PutString(" <message severity=\"");
501  m_Output.PutString(s_GetSeverityLabel(item.GetSeverity(), true));
502  if (item.IsSetAccnver()) {
503  m_Output.PutString("\" seq-id=\"");
504  WriteString(item.GetAccnver(), eStringTypeVisible);
505  }
506 
507  if (item.IsSetFeatureId()) {
508  m_Output.PutString("\" feat-id=\"");
509  WriteString(item.GetFeatureId(), eStringTypeVisible);
510  }
511 
512  if (item.IsSetLocation()) {
513  m_Output.PutString("\" interval=\"");
514  string loc = item.GetLocation();
515  if (NStr::StartsWith(loc, "(") && NStr::EndsWith(loc, ")")) {
516  loc = "[" + loc.substr(1, loc.length() - 2) + "]";
517  }
518  WriteString(loc, eStringTypeVisible);
519  }
520 
521  m_Output.PutString("\" code=\"");
522  WriteString(item.GetErrGroup(), eStringTypeVisible);
523  m_Output.PutString("_");
524  WriteString(item.GetErrCode(), eStringTypeVisible);
525  m_Output.PutString("\">");
526 
527  WriteString(item.GetMsg(), eStringTypeVisible);
528 
529  m_Output.PutString("</message>");
530  m_Output.PutEol();
531 }
532 
533 
534 /////////////////////////////////////////////////////////////////////////////
535 // MAIN
536 
537 int main(int argc, const char* argv[])
538 {
539  #ifdef _DEBUG
540  // this code converts single argument into multiple, just to simplify testing
541  list<string> split_args;
542  vector<const char*> new_argv;
543 
544  if (argc==2 && argv && argv[1] && strchr(argv[1], ' '))
545  {
546  NStr::Split(argv[1], " ", split_args);
547 
548  auto it = split_args.begin();
549  while (it != split_args.end())
550  {
551  auto next = it; ++next;
552  if (next != split_args.end() &&
553  ((it->front() == '"' && it->back() != '"') ||
554  (it->front() == '\'' && it->back() != '\'')))
555  {
556  it->append(" "); it->append(*next);
557  next = split_args.erase(next);
558  } else it = next;
559  }
560  for (auto& rec: split_args)
561  {
562  if (rec.front()=='\'' && rec.back()=='\'')
563  rec=rec.substr(1, rec.length()-2);
564  }
565  argc = 1 + split_args.size();
566  new_argv.reserve(argc);
567  new_argv.push_back(argv[0]);
568  for (const string& s : split_args)
569  {
570  new_argv.push_back(s.c_str());
571  std::cerr << s.c_str() << " ";
572  }
573  std::cerr << "\n";
574 
575 
576  argv = new_argv.data();
577  }
578  #endif
579  return CAsnvalApp().AppMain(argc, argv);
580 }
USING_SCOPE(objects)
string s_GetSeverityLabel(EDiagSev sev, bool is_xml)
Definition: asnval.cpp:156
int main(int argc, const char *argv[])
Definition: asnval.cpp:537
ncbi::TMaskedQueryRegions mask
AutoPtr –.
Definition: ncbimisc.hpp:401
CArgAllow_Integers –.
Definition: ncbiargs.hpp:1751
CArgAllow –.
Definition: ncbiargs.hpp:1488
CArgDescriptions –.
Definition: ncbiargs.hpp:541
CArgs –.
Definition: ncbiargs.hpp:379
int Run() override
Run the application.
Definition: asnval.cpp:402
void xValidateThread(const string &filename, bool save_output)
Definition: asnval.cpp:145
void Setup(const CArgs &args)
Definition: asnval.cpp:481
CThreadExitData xValidate(const string &filename, bool save_output)
Definition: asnval.cpp:133
void ValidateOneDirectory(string dir_name, bool recurse)
Definition: asnval.cpp:324
CThreadExitData xCombinedWriterTask(std::ostream *ofile)
Definition: asnval.cpp:368
unique_ptr< edit::CRemoteUpdater > mRemoteUpdater
Definition: asnval.cpp:129
void Init() override
Initialize the application.
Definition: asnval.cpp:201
CAsnvalApp()
Definition: asnval.cpp:172
void x_AliasLogFile()
Definition: asnval.cpp:184
~CAsnvalApp()
Definition: asnval.cpp:179
unique_ptr< CAppConfig > mAppConfig
Definition: asnval.cpp:128
CThreadExitData ValidateOneFile(const std::string &filename)
static void SetupObjectManager(const CArgs &args, objects::CObjectManager &obj_mgr, TLoaders loaders=fDefault)
Set up the standard object manager data loaders according to the arguments provided above.
static void AddArgumentDescriptions(CArgDescriptions &arg_desc, TLoaders loaders=fDefault)
Add a standard set of arguments used to configure the object manager.
CDir –.
Definition: ncbifile.hpp:1695
CSemaphore –.
Definition: ncbimtx.hpp:1375
CTime –.
Definition: ncbitime.hpp:296
void Print(const CValidErrItem &item)
Definition: asnval.cpp:498
const string GetErrCode() const
const string GetErrGroup() const
EDiagSev GetSeverity() const
static void SetupArgDescriptions(CArgDescriptions *arg_desc)
Setup core splign argument descriptions for the application.
CVersionInfo –.
void release(token_type &&token)
Definition: asnval.cpp:83
CSemaphore m_tasks_semaphose
Definition: asnval.cpp:100
TThreadPoolLimited(unsigned num_slots, unsigned queue_depth=0)
Definition: asnval.cpp:71
std::future< CThreadExitData > token_type
Definition: asnval.cpp:70
std::future< void > m_consumer
Definition: asnval.cpp:102
Include a standard set of the NCBI C++ Toolkit most basic headers.
std::ofstream out("events_result.xml")
main entry point for tests
static time_t start_time
Definition: timeout.c:14
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
Definition: dlist.tmpl.h:56
static void Init(void)
Definition: cursor6.c:76
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.
Definition: ncbiapp.cpp:819
@ fHidden
Hide it in Usage.
Definition: ncbiargs.hpp:662
@ eExcludes
One argument excludes another.
Definition: ncbiargs.hpp:957
@ eInputFile
Name of file (must exist and be readable)
Definition: ncbiargs.hpp:595
@ eString
An arbitrary string.
Definition: ncbiargs.hpp:589
@ eOutputFile
Name of file (must be writable)
Definition: ncbiargs.hpp:596
@ eInteger
Convertible into an integer number (int or Int8)
Definition: ncbiargs.hpp:592
#define NULL
Definition: ncbistd.hpp:225
bool SetLogFile(const string &file_name, EDiagFileType file_type=eDiagFile_All, bool quick_flush=true)
Set log files.
Definition: ncbidiag.cpp:7528
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
Definition: ncbidiag.hpp:186
EDiagSev
Severity level for the posted diagnostics.
Definition: ncbidiag.hpp:650
#define LOG_POST_XX(error_name, err_subcode, message)
Definition: ncbidiag.hpp:569
@ eDiagSevMin
Verbosity level for min. severity.
Definition: ncbidiag.hpp:660
@ eDiagSevMax
Verbosity level for max. severity.
Definition: ncbidiag.hpp:661
void Error(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1197
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
Definition: ncbiexpt.hpp:704
TEntries GetEntries(const string &mask=kEmptyStr, TGetEntriesFlags flags=0) const
Get directory entries based on the specified "mask".
Definition: ncbifile.cpp:3846
static string MakePath(const string &dir=kEmptyStr, const string &base=kEmptyStr, const string &ext=kEmptyStr)
Assemble a path from basic components.
Definition: ncbifile.cpp:413
list< TEntry > TEntries
Definition: ncbifile.hpp:1750
@ eDir
Directory.
Definition: ncbifile.hpp:784
@ eFile
Regular file.
Definition: ncbifile.hpp:783
@ eUnknown
Definition: app_popup.hpp:72
@ eStringTypeVisible
VisibleString (in ASN.1 sense)
Definition: serialdef.hpp:186
static CRef< CObjectManager > GetInstance(void)
Return the existing object manager or create one.
#define NcbiCerr
Definition: ncbistre.hpp:544
static list< string > & Split(const CTempString str, const CTempString delim, list< string > &arr, TSplitFlags flags=0, vector< SIZE_TYPE > *token_pos=NULL)
Split a string using specified delimiters.
Definition: ncbistr.cpp:3461
static bool EndsWith(const CTempString str, const CTempString end, ECase use_case=eCase)
Check if a string ends with a specified suffix value.
Definition: ncbistr.hpp:5430
#define NPOS
Definition: ncbistr.hpp:133
static SIZE_TYPE Find(const CTempString str, const CTempString pattern, ECase use_case=eCase, EDirection direction=eForwardSearch, SIZE_TYPE occurrence=0)
Find the pattern in the string.
Definition: ncbistr.cpp:2891
static bool StartsWith(const CTempString str, const CTempString start, ECase use_case=eCase)
Check if a string starts with a specified prefix value.
Definition: ncbistr.hpp:5412
static bool Equal(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2, ECase use_case=eCase)
Test for equality of a substring with another string.
Definition: ncbistr.hpp:5384
void Run(void)
Enter the main loop.
@ eCurrent
Use current time. See also CCurrentTime.
Definition: ncbitime.hpp:300
bool IsSetFeatureId(void) const
Check if a value has been assigned to FeatureId data member.
const TAccnver & GetAccnver(void) const
Get the Accnver member data.
bool IsSetLocation(void) const
Check if a value has been assigned to Location data member.
bool IsSetAccnver(void) const
Check if a value has been assigned to Accnver data member.
const TLocation & GetLocation(void) const
Get the Location member data.
const TMsg & GetMsg(void) const
Get the Msg member data.
const TFeatureId & GetFeatureId(void) const
Get the FeatureId member data.
static char * subname
Definition: mdb_load.c:26
Definition: fix_pub.hpp:45
const struct ncbi::grid::netcache::search::fields::EXPIRES expires
Magic spell ;-) needed for some weird compilers... very empiric.
#define NCBI_SC_VERSION_PROXY
#define NCBI_TEAMCITY_BUILD_NUMBER_PROXY
Defines the CNcbiApplication and CAppException classes for creating NCBI applications.
#define GetArgs
Avoid preprocessor name clash with the NCBI C Toolkit.
Definition: ncbiapp_api.hpp:54
Defines command line argument related classes.
NCBI C++ stream class wrappers for triggering between "new" and "old" C++ stream libraries.
The Object manager core.
static const char * suffix[]
Definition: pcregrep.c:408
std::list< CConstRef< CValidError > > mEval
else result
Definition: token2.c:20
Modified on Wed Apr 17 13:10:19 2024 by modify_doxy.py rev. 669887