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

Go to the SVN repository for this file.

1 /* $Id: dispatcher.cpp 101062 2023-10-24 18:55:30Z vasilche $
2  * ===========================================================================
3  * PUBLIC DOMAIN NOTICE
4  * National Center for Biotechnology Information
5  *
6  * This software/database is a "United States Government Work" under the
7  * terms of the United States Copyright Act. It was written as part of
8  * the author's official duties as a United States Government employee and
9  * thus cannot be copyrighted. This software/database is freely available
10  * to the public for use. The National Library of Medicine and the U.S.
11  * Government have not placed any restriction on its use or reproduction.
12  *
13  * Although all reasonable efforts have been taken to ensure the accuracy
14  * and reliability of the software and data, the NLM and the U.S.
15  * Government do not and cannot warrant the performance or results that
16  * may be obtained by using this software or data. The NLM and the U.S.
17  * Government disclaim all warranties, express or implied, including
18  * warranties of performance, merchantability or fitness for any particular
19  * purpose.
20  *
21  * Please cite the author in any work or product based on this material.
22  * ===========================================================================
23  *
24  * Author: Anton Butanaev, Eugene Vasilchenko
25  *
26  * File Description: Base data reader interface
27  *
28  */
29 
30 #include <ncbi_pch.hpp>
37 #include <objtools/error_codes.hpp>
42 
43 
44 #define NCBI_USE_ERRCODE_X Objtools_Rd_Disp
45 
47 
49 
51 
52 NCBI_PARAM_DECL(bool, GENBANK, ALLOW_INCOMPLETE_COMMANDS);
53 NCBI_PARAM_DEF_EX(bool, GENBANK, ALLOW_INCOMPLETE_COMMANDS, false,
54  eParam_NoThread, GENBANK_ALLOW_INCOMPLETE_COMMANDS);
55 
56 static
58 {
59  static CSafeStatic<NCBI_PARAM_TYPE(GENBANK, ALLOW_INCOMPLETE_COMMANDS)> s_Value;
60  return s_Value->Get();
61 }
62 
63 
64 /////////////////////////////////////////////////////////////////////////////
65 // CReadDispatcher
66 /////////////////////////////////////////////////////////////////////////////
67 
68 
70 {
71  CGBRequestStatistics("resolved", "string ids"),
72  CGBRequestStatistics("resolved", "seq-ids"),
73  CGBRequestStatistics("resolved", "gis"),
74  CGBRequestStatistics("resolved", "accs"),
75  CGBRequestStatistics("resolved", "labels"),
76  CGBRequestStatistics("resolved", "taxids"),
77  CGBRequestStatistics("resolved", "blob ids"),
78  CGBRequestStatistics("resolved", "blob state"),
79  CGBRequestStatistics("resolved", "blob versions"),
80  CGBRequestStatistics("loaded", "blob data"),
81  CGBRequestStatistics("loaded", "SNP data"),
82  CGBRequestStatistics("loaded", "split data"),
83  CGBRequestStatistics("loaded", "chunk data"),
84  CGBRequestStatistics("parsed", "blob data"),
85  CGBRequestStatistics("parsed", "SNP data"),
86  CGBRequestStatistics("parsed", "split data"),
87  CGBRequestStatistics("parsed", "chunk data"),
88  CGBRequestStatistics("attached", "blob data"),
89  CGBRequestStatistics("attached", "SNP data"),
90  CGBRequestStatistics("attached", "split data"),
91  CGBRequestStatistics("attached", "chunk data"),
92  CGBRequestStatistics("loaded", "sequence hash"),
93  CGBRequestStatistics("loaded", "sequence length"),
94  CGBRequestStatistics("loaded", "sequence type")
95 };
96 
98  const char* entity)
99  : m_Action(action), m_Entity(entity),
100  m_Count(0), m_Time(0), m_Size(0)
101 {
102 }
103 
105 {
107  NCBI_THROW_FMT(CLoaderException, eOtherError,
108  "CGBRequestStatistics::GetStatistics: "
109  "invalid statistics type: "<<type);
110  }
111  return sx_Statistics[type];
112 }
113 
115 {
116  size_t count = GetCount();
117  if ( count > 0 ) {
118  double time = GetTime();
119  double size = GetSize();
120  if ( size <= 0 ) {
121  LOG_POST_X(5, "GBLoader: " << GetAction() << ' ' <<
122  count << ' ' << GetEntity() << " in " <<
123  setiosflags(ios::fixed) <<
124  setprecision(3) <<
125  (time) << " s (" <<
126  (time*1000/count) << " ms/one)");
127  }
128  else {
129  LOG_POST_X(6, "GBLoader: " << GetAction() << ' ' <<
130  count << ' ' << GetEntity() << " in " <<
131  setiosflags(ios::fixed) <<
132  setprecision(3) <<
133  (time) << " s (" <<
134  (time*1000/count) << " ms/one)" <<
135  setprecision(2) << " (" <<
136  (size/1024.0) << " kB " <<
137  (size/time/1024) << " kB/s)");
138  }
139  }
140 }
141 
142 
144 {
145  for ( int type = eStat_First; type <= eStat_Last; ++type ) {
147  }
148 }
149 
150 inline
152 {
153  static CSafeStatic<NCBI_PARAM_TYPE(GENBANK, READER_STATS)> s_Value;
154  return s_Value->Get();
155 }
156 
157 
159 {
162 }
163 
164 
166 {
167  if ( CollectStatistics() > 0 ) {
169  }
170 }
171 
172 
174 {
175  if ( !reader ) {
176  return;
177  }
178 
179  m_Readers[level] = reader;
180  reader->m_Dispatcher = this;
181 }
182 
183 
185 {
186  if ( !writer ) {
187  return;
188  }
189 
190  m_Writers[level] = writer;
191 }
192 
193 
195 {
196  if ( !processor ) {
197  return;
198  }
199 
200  m_Processors[processor->GetType()] = processor;
201 }
202 
203 
205  CWriter::EType type) const
206 {
207  ITERATE ( TWriters, i, m_Writers ) {
208  if ( i->first >= result.GetLevel() ) {
209  break;
210  }
211  if ( i->second->CanWrite(type) ) {
212  return const_cast<CWriter*>(i->second.GetPointer());
213  }
214  }
215  return 0;
216 }
217 
218 
220 {
222  if ( iter == m_Processors.end() ) {
223  NCBI_THROW_FMT(CLoaderException, eLoaderFailed,
224  "CReadDispatcher::GetProcessor: "
225  "processor unknown: "<<type);
226  }
227  return *iter->second;
228 }
229 
230 
232 {
233  if ( m_Readers.empty() ) {
234  NCBI_THROW(CLoaderException, eLoaderFailed, "no reader loaded");
235  }
236 }
237 
238 
240 {
241  for ( auto& rd : m_Readers ) {
242  if ( rd.second->HasHUPIncluded() ) {
243  return true;
244  }
245  }
246  return false;
247 }
248 
249 
251 {
253  rd->second->ResetCache();
254  }
256  wr->second->ResetCache();
257  }
258 }
259 
260 
262 {
263  return !sih || sih.Which() == CSeq_id::e_Local ||
264  (sih.Which() == CSeq_id::e_General &&
265  NStr::EqualNocase(sih.GetSeqId()->GetGeneral().GetDb(), "SRA"));
266 }
267 
268 
270  : m_Result(result)
271 {
272 }
273 
274 
276 {
277 }
278 
279 
281 {
282  return false;
283 }
284 
285 
287 {
288  return 1;
289 }
290 
291 
292 namespace {
293  class CCommandLoadSeq_idSeq_ids : public CReadDispatcherCommand
294  {
295  public:
296  typedef CSeq_id_Handle TKey;
297  typedef CLoadLockSeqIds TLock;
298  CCommandLoadSeq_idSeq_ids(CReaderRequestResult& result,
299  const TKey& key)
301  m_Key(key), m_Lock(result, key)
302  {
303  }
304 
305  bool IsDone(void)
306  {
307  return m_Lock.IsLoaded();
308  }
309  bool Execute(CReader& reader)
310  {
311  return reader.LoadSeq_idSeq_ids(GetResult(), m_Key);
312  }
313  string GetErrMsg(void) const
314  {
315  return "LoadSeq_idSeq_ids("+m_Key.AsString()+"): "
316  "data not found";
317  }
318  CGBRequestStatistics::EStatType GetStatistics(void) const
319  {
321  }
322  string GetStatisticsDescription(void) const
323  {
324  return "Seq-ids("+m_Key.AsString()+")";
325  }
326 
327  private:
328  TKey m_Key;
329  TLock m_Lock;
330  };
331 
332  class CCommandLoadSeq_idGi : public CReadDispatcherCommand
333  {
334  public:
335  typedef CSeq_id_Handle TKey;
336  typedef CLoadLockGi TLock;
337  CCommandLoadSeq_idGi(CReaderRequestResult& result,
338  const TKey& key)
340  m_Key(key), m_Lock(result, key)
341  {
342  }
343 
344  bool IsDone(void)
345  {
346  return m_Lock.IsLoadedGi();
347  }
348  bool Execute(CReader& reader)
349  {
350  return reader.LoadSeq_idGi(GetResult(), m_Key);
351  }
352  string GetErrMsg(void) const
353  {
354  return "LoadSeq_idGi("+m_Key.AsString()+"): "
355  "data not found";
356  }
357  CGBRequestStatistics::EStatType GetStatistics(void) const
358  {
360  }
361  string GetStatisticsDescription(void) const
362  {
363  return "gi("+m_Key.AsString()+")";
364  }
365 
366  private:
367  TKey m_Key;
368  TLock m_Lock;
369  };
370 
371  class CCommandLoadSeq_idAccVer : public CReadDispatcherCommand
372  {
373  public:
374  typedef CSeq_id_Handle TKey;
375  typedef CLoadLockAcc TLock;
376  CCommandLoadSeq_idAccVer(CReaderRequestResult& result,
377  const TKey& key)
379  m_Key(key), m_Lock(result, key)
380  {
381  }
382 
383  bool IsDone(void)
384  {
385  return m_Lock.IsLoadedAccVer();
386  }
387  bool Execute(CReader& reader)
388  {
389  return reader.LoadSeq_idAccVer(GetResult(), m_Key);
390  }
391  string GetErrMsg(void) const
392  {
393  return "LoadSeq_idAccVer("+m_Key.AsString()+"): "
394  "data not found";
395  }
396  CGBRequestStatistics::EStatType GetStatistics(void) const
397  {
399  }
400  string GetStatisticsDescription(void) const
401  {
402  return "acc("+m_Key.AsString()+")";
403  }
404 
405  private:
406  TKey m_Key;
407  TLock m_Lock;
408  };
409 
410  class CCommandLoadSeq_idLabel : public CReadDispatcherCommand
411  {
412  public:
413  typedef CSeq_id_Handle TKey;
414  typedef CLoadLockLabel TLock;
415  CCommandLoadSeq_idLabel(CReaderRequestResult& result,
416  const TKey& key)
418  m_Key(key), m_Lock(result, key)
419  {
420  }
421 
422  bool IsDone(void)
423  {
424  return m_Lock.IsLoadedLabel();
425  }
426  bool Execute(CReader& reader)
427  {
428  return reader.LoadSeq_idLabel(GetResult(), m_Key);
429  }
430  string GetErrMsg(void) const
431  {
432  return "LoadSeq_idLabel("+m_Key.AsString()+"): "
433  "data not found";
434  }
435  CGBRequestStatistics::EStatType GetStatistics(void) const
436  {
438  }
439  string GetStatisticsDescription(void) const
440  {
441  return "label("+m_Key.AsString()+")";
442  }
443 
444  private:
445  TKey m_Key;
446  TLock m_Lock;
447  };
448 
449  class CCommandLoadSeq_idTaxId : public CReadDispatcherCommand
450  {
451  public:
452  typedef CSeq_id_Handle TKey;
453  typedef CLoadLockTaxId TLock;
454  CCommandLoadSeq_idTaxId(CReaderRequestResult& result,
455  const TKey& key)
457  m_Key(key), m_Lock(result, key)
458  {
459  }
460 
461  bool IsDone(void)
462  {
463  return m_Lock.IsLoadedTaxId();
464  }
465  bool Execute(CReader& reader)
466  {
467  return reader.LoadSeq_idTaxId(GetResult(), m_Key);
468  }
469  bool MayBeSkipped(void) const
470  {
471  return true;
472  }
473  string GetErrMsg(void) const
474  {
475  return "LoadSeq_idTaxId("+m_Key.AsString()+"): "
476  "data not found";
477  }
478  CGBRequestStatistics::EStatType GetStatistics(void) const
479  {
481  }
482  string GetStatisticsDescription(void) const
483  {
484  return "taxid("+m_Key.AsString()+")";
485  }
486 
487  private:
488  TKey m_Key;
489  TLock m_Lock;
490  };
491 
492  class CCommandLoadSequenceHash : public CReadDispatcherCommand
493  {
494  public:
495  typedef CSeq_id_Handle TKey;
496  typedef CLoadLockHash TLock;
497  CCommandLoadSequenceHash(CReaderRequestResult& result,
498  const TKey& key)
500  m_Key(key), m_Lock(result, key)
501  {
502  }
503 
504  bool IsDone(void)
505  {
506  return m_Lock.IsLoadedHash();
507  }
508  bool Execute(CReader& reader)
509  {
510  return reader.LoadSequenceHash(GetResult(), m_Key);
511  }
512  bool MayBeSkipped(void) const
513  {
514  return true;
515  }
516  string GetErrMsg(void) const
517  {
518  return "LoadSequenceHash("+m_Key.AsString()+"): "
519  "data not found";
520  }
521  CGBRequestStatistics::EStatType GetStatistics(void) const
522  {
524  }
525  string GetStatisticsDescription(void) const
526  {
527  return "hash("+m_Key.AsString()+")";
528  }
529 
530  private:
531  TKey m_Key;
532  TLock m_Lock;
533  };
534 
535  class CCommandLoadSequenceLength : public CReadDispatcherCommand
536  {
537  public:
538  typedef CSeq_id_Handle TKey;
539  typedef CLoadLockLength TLock;
540  CCommandLoadSequenceLength(CReaderRequestResult& result,
541  const TKey& key)
543  m_Key(key), m_Lock(result, key)
544  {
545  }
546 
547  bool IsDone(void)
548  {
549  return m_Lock.IsLoadedLength();
550  }
551  bool Execute(CReader& reader)
552  {
553  return reader.LoadSequenceLength(GetResult(), m_Key);
554  }
555  bool MayBeSkipped(void) const
556  {
557  return true;
558  }
559  string GetErrMsg(void) const
560  {
561  return "LoadSequenceLength("+m_Key.AsString()+"): "
562  "data not found";
563  }
564  CGBRequestStatistics::EStatType GetStatistics(void) const
565  {
567  }
568  string GetStatisticsDescription(void) const
569  {
570  return "length("+m_Key.AsString()+")";
571  }
572 
573  private:
574  TKey m_Key;
575  TLock m_Lock;
576  };
577 
578  class CCommandLoadSequenceType : public CReadDispatcherCommand
579  {
580  public:
581  typedef CSeq_id_Handle TKey;
582  typedef CLoadLockType TLock;
583  CCommandLoadSequenceType(CReaderRequestResult& result,
584  const TKey& key)
586  m_Key(key), m_Lock(result, key)
587  {
588  }
589 
590  bool IsDone(void)
591  {
592  return m_Lock.IsLoadedType();
593  }
594  bool Execute(CReader& reader)
595  {
596  return reader.LoadSequenceType(GetResult(), m_Key);
597  }
598  bool MayBeSkipped(void) const
599  {
600  return true;
601  }
602  string GetErrMsg(void) const
603  {
604  return "LoadSequenceType("+m_Key.AsString()+"): "
605  "data not found";
606  }
607  CGBRequestStatistics::EStatType GetStatistics(void) const
608  {
610  }
611  string GetStatisticsDescription(void) const
612  {
613  return "type("+m_Key.AsString()+")";
614  }
615 
616  private:
617  TKey m_Key;
618  TLock m_Lock;
619  };
620 
621  bool s_Blob_idsLoaded(CLoadLockBlobIds& ids,
623  const CSeq_id_Handle& seq_id)
624  {
625  if ( ids.IsLoaded() ) {
626  return true;
627  }
628  // check if seq-id is known as absent
629  CLoadLockSeqIds seq_ids(result, seq_id, eAlreadyLoaded);
630  if ( seq_ids && !seq_ids.GetData().IsFound() ) {
631  // mark blob-ids as absent too
632  ids.SetNoBlob_ids(seq_ids.GetState());
633  return true;
634  }
635  return false;
636  }
637 
638  class CCommandLoadSeq_idBlob_ids : public CReadDispatcherCommand
639  {
640  public:
641  typedef CSeq_id_Handle TKey;
642  typedef CLoadLockBlobIds TLock;
643  CCommandLoadSeq_idBlob_ids(CReaderRequestResult& result,
644  const TKey& key,
645  const SAnnotSelector* sel)
647  m_Key(key), m_Selector(sel),
648  m_Lock(result, key, sel)
649  {
650  }
651 
652  bool IsDone(void)
653  {
654  return s_Blob_idsLoaded(m_Lock, GetResult(), m_Key);
655  }
656  bool Execute(CReader& reader)
657  {
658  return reader.LoadSeq_idBlob_ids(GetResult(),
659  m_Key, m_Selector);
660  }
661  string GetErrMsg(void) const
662  {
663  return "LoadSeq_idBlob_ids("+m_Key.AsString()+"): "
664  "data not found";
665  }
666  CGBRequestStatistics::EStatType GetStatistics(void) const
667  {
669  }
670  string GetStatisticsDescription(void) const
671  {
672  return "blob-ids("+m_Key.AsString()+")";
673  }
674 
675  private:
676  TKey m_Key;
677  const SAnnotSelector* m_Selector;
678  TLock m_Lock;
679  };
680 
681  template<class CLoadLock>
682  bool sx_IsLoaded(size_t i,
684  const vector<CSeq_id_Handle>& ids,
685  const vector<bool>& loaded)
686  {
687  if ( loaded[i] || CReadDispatcher::CannotProcess(ids[i]) ) {
688  return true;
689  }
690  CLoadLock lock(result, ids[i]);
691  if ( lock.IsLoaded() && !lock.IsFound() ) {
692  return true;
693  }
694  return false;
695  }
696 
697  template<class CLoadLock>
698  bool sx_BulkIsDone(CReaderRequestResult& result,
699  const vector<CSeq_id_Handle>& ids,
700  const vector<bool>& loaded)
701  {
702  for ( size_t i = 0; i < ids.size(); ++i ) {
703  if ( sx_IsLoaded<CLoadLock>(i, result, ids, loaded) ) {
704  continue;
705  }
706  return false;
707  }
708  return true;
709  }
710 
711  template<class CLoadLock>
712  string sx_DescribeError(CReaderRequestResult& result,
713  const vector<CSeq_id_Handle>& ids,
714  const vector<bool>& loaded)
715  {
716  string ret;
717  for ( size_t i = 0; i < ids.size(); ++i ) {
718  if ( sx_IsLoaded<CLoadLock>(i, result, ids, loaded) ) {
719  continue;
720  }
721  if ( !ret.empty() ) {
722  ret += ", ";
723  }
724  ret += ids[i].AsString();
725  }
726  ret += " ["+NStr::SizetToString(ids.size())+"]";
727  return ret;
728  }
729 
730  class CCommandLoadAccVers : public CReadDispatcherCommand
731  {
732  public:
733  typedef vector<CSeq_id_Handle> TKey;
734  typedef vector<bool> TLoaded;
735  typedef vector<CSeq_id_Handle> TRet;
736  typedef CLoadLockAcc CLoadLock;
737  CCommandLoadAccVers(CReaderRequestResult& result,
738  const TKey& key, TLoaded& loaded, TRet& ret)
740  m_Key(key), m_Loaded(loaded), m_Ret(ret)
741  {
742  }
743 
744  bool Execute(CReader& reader)
745  {
746  return reader.LoadAccVers(GetResult(), m_Key, m_Loaded, m_Ret);
747  }
748  bool IsDone(void)
749  {
750  return sx_BulkIsDone<CLoadLock>(GetResult(), m_Key, m_Loaded);
751  }
752  string GetErrMsg(void) const
753  {
754  return "LoadAccVers("+
755  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
756  "): data not found";
757  }
758  string GetStatisticsDescription(void) const
759  {
760  return "accs("+
761  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
762  ")";
763  }
764  CGBRequestStatistics::EStatType GetStatistics(void) const
765  {
767  }
768  size_t GetStatisticsCount(void) const
769  {
770  return m_Key.size();
771  }
772 
773  private:
774  const TKey& m_Key;
775  TLoaded& m_Loaded;
776  TRet& m_Ret;
777  };
778 
779  class CCommandLoadGis : public CReadDispatcherCommand
780  {
781  public:
782  typedef vector<CSeq_id_Handle> TKey;
783  typedef vector<bool> TLoaded;
784  typedef vector<TGi> TRet;
785  typedef CLoadLockGi CLoadLock;
786  CCommandLoadGis(CReaderRequestResult& result,
787  const TKey& key, TLoaded& loaded, TRet& ret)
789  m_Key(key), m_Loaded(loaded), m_Ret(ret)
790  {
791  }
792 
793  bool Execute(CReader& reader)
794  {
795  return reader.LoadGis(GetResult(), m_Key, m_Loaded, m_Ret);
796  }
797  bool IsDone(void)
798  {
799  return sx_BulkIsDone<CLoadLock>(GetResult(), m_Key, m_Loaded);
800  }
801  string GetErrMsg(void) const
802  {
803  return "LoadGis("+
804  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
805  "): data not found";
806  }
807  string GetStatisticsDescription(void) const
808  {
809  return "gis("+
810  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
811  ")";
812  }
813  CGBRequestStatistics::EStatType GetStatistics(void) const
814  {
816  }
817  size_t GetStatisticsCount(void) const
818  {
819  return m_Key.size();
820  }
821 
822  private:
823  const TKey& m_Key;
824  TLoaded& m_Loaded;
825  TRet& m_Ret;
826  };
827 
828  class CCommandLoadLabels : public CReadDispatcherCommand
829  {
830  public:
831  typedef vector<CSeq_id_Handle> TKey;
832  typedef vector<bool> TLoaded;
833  typedef vector<string> TRet;
834  typedef CLoadLockLabel CLoadLock;
835  CCommandLoadLabels(CReaderRequestResult& result,
836  const TKey& key, TLoaded& loaded, TRet& ret)
838  m_Key(key), m_Loaded(loaded), m_Ret(ret)
839  {
840  }
841 
842  bool Execute(CReader& reader)
843  {
844  return reader.LoadLabels(GetResult(), m_Key, m_Loaded, m_Ret);
845  }
846  bool IsDone(void)
847  {
848  return sx_BulkIsDone<CLoadLock>(GetResult(), m_Key, m_Loaded);
849  }
850  string GetErrMsg(void) const
851  {
852  return "LoadLabels("+
853  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
854  "): data not found";
855  }
856  string GetStatisticsDescription(void) const
857  {
858  return "labels("+
859  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
860  ")";
861  }
862  CGBRequestStatistics::EStatType GetStatistics(void) const
863  {
865  }
866  size_t GetStatisticsCount(void) const
867  {
868  return m_Key.size();
869  }
870 
871  private:
872  const TKey& m_Key;
873  TLoaded& m_Loaded;
874  TRet& m_Ret;
875  };
876 
877  class CCommandLoadTaxIds : public CReadDispatcherCommand
878  {
879  public:
880  typedef vector<CSeq_id_Handle> TKey;
881  typedef vector<bool> TLoaded;
882  typedef vector<TTaxId> TRet;
883  typedef CLoadLockTaxId CLoadLock;
884  CCommandLoadTaxIds(CReaderRequestResult& result,
885  const TKey& key, TLoaded& loaded, TRet& ret)
887  m_Key(key), m_Loaded(loaded), m_Ret(ret)
888  {
889  }
890 
891  bool Execute(CReader& reader)
892  {
893  return reader.LoadTaxIds(GetResult(), m_Key, m_Loaded, m_Ret);
894  }
895  bool MayBeSkipped(void) const
896  {
897  return true;
898  }
899  bool IsDone(void)
900  {
901  return sx_BulkIsDone<CLoadLock>(GetResult(), m_Key, m_Loaded);
902  }
903  string GetErrMsg(void) const
904  {
905  return "LoadTaxIds("+
906  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
907  "): data not found";
908  }
909  string GetStatisticsDescription(void) const
910  {
911  return "taxids("+
912  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
913  ")";
914  }
915  CGBRequestStatistics::EStatType GetStatistics(void) const
916  {
918  }
919  size_t GetStatisticsCount(void) const
920  {
921  return m_Key.size();
922  }
923 
924  private:
925  const TKey& m_Key;
926  TLoaded& m_Loaded;
927  TRet& m_Ret;
928  };
929 
930  class CCommandLoadHashes : public CReadDispatcherCommand
931  {
932  public:
933  typedef vector<CSeq_id_Handle> TKey;
934  typedef vector<bool> TLoaded;
935  typedef vector<bool> TKnown;
936  typedef vector<int> TRet;
937  typedef CLoadLockHash CLoadLock;
938  CCommandLoadHashes(CReaderRequestResult& result,
939  const TKey& key, TLoaded& loaded,
940  TRet& ret, TKnown& known)
942  m_Key(key), m_Loaded(loaded), m_Ret(ret), m_Known(known)
943  {
944  }
945 
946  bool Execute(CReader& reader)
947  {
948  return reader.LoadHashes(GetResult(), m_Key, m_Loaded,
949  m_Ret, m_Known);
950  }
951  bool MayBeSkipped(void) const
952  {
953  return true;
954  }
955  bool IsDone(void)
956  {
957  return sx_BulkIsDone<CLoadLock>(GetResult(), m_Key, m_Loaded);
958  }
959  string GetErrMsg(void) const
960  {
961  return "LoadHashes("+
962  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
963  "): data not found";
964  }
965  string GetStatisticsDescription(void) const
966  {
967  return "hashes("+
968  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
969  ")";
970  }
971  CGBRequestStatistics::EStatType GetStatistics(void) const
972  {
974  }
975  size_t GetStatisticsCount(void) const
976  {
977  return m_Key.size();
978  }
979 
980  private:
981  const TKey& m_Key;
982  TLoaded& m_Loaded;
983  TRet& m_Ret;
984  TKnown& m_Known;
985  };
986 
987  class CCommandLoadLengths : public CReadDispatcherCommand
988  {
989  public:
990  typedef vector<CSeq_id_Handle> TKey;
991  typedef vector<bool> TLoaded;
992  typedef vector<TSeqPos> TRet;
993  typedef CLoadLockLength CLoadLock;
994  CCommandLoadLengths(CReaderRequestResult& result,
995  const TKey& key, TLoaded& loaded, TRet& ret)
997  m_Key(key), m_Loaded(loaded), m_Ret(ret)
998  {
999  }
1000 
1001  bool Execute(CReader& reader)
1002  {
1003  return reader.LoadLengths(GetResult(), m_Key, m_Loaded, m_Ret);
1004  }
1005  bool MayBeSkipped(void) const
1006  {
1007  return true;
1008  }
1009  bool IsDone(void)
1010  {
1011  return sx_BulkIsDone<CLoadLock>(GetResult(), m_Key, m_Loaded);
1012  }
1013  string GetErrMsg(void) const
1014  {
1015  return "LoadLengths("+
1016  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
1017  "): data not found";
1018  }
1019  string GetStatisticsDescription(void) const
1020  {
1021  return "lengths("+
1022  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
1023  ")";
1024  }
1025  CGBRequestStatistics::EStatType GetStatistics(void) const
1026  {
1028  }
1029  size_t GetStatisticsCount(void) const
1030  {
1031  return m_Key.size();
1032  }
1033 
1034  private:
1035  const TKey& m_Key;
1036  TLoaded& m_Loaded;
1037  TRet& m_Ret;
1038  };
1039 
1040  class CCommandLoadTypes : public CReadDispatcherCommand
1041  {
1042  public:
1043  typedef vector<CSeq_id_Handle> TKey;
1044  typedef vector<bool> TLoaded;
1045  typedef vector<CSeq_inst::EMol> TRet;
1046  typedef CLoadLockType CLoadLock;
1047  CCommandLoadTypes(CReaderRequestResult& result,
1048  const TKey& key, TLoaded& loaded, TRet& ret)
1050  m_Key(key), m_Loaded(loaded), m_Ret(ret)
1051  {
1052  }
1053 
1054  bool Execute(CReader& reader)
1055  {
1056  return reader.LoadTypes(GetResult(), m_Key, m_Loaded, m_Ret);
1057  }
1058  bool MayBeSkipped(void) const
1059  {
1060  return true;
1061  }
1062  bool IsDone(void)
1063  {
1064  return sx_BulkIsDone<CLoadLock>(GetResult(), m_Key, m_Loaded);
1065  }
1066  string GetErrMsg(void) const
1067  {
1068  return "LoadTypes("+
1069  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
1070  "): data not found";
1071  }
1072  string GetStatisticsDescription(void) const
1073  {
1074  return "types("+
1075  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
1076  ")";
1077  }
1078  CGBRequestStatistics::EStatType GetStatistics(void) const
1079  {
1081  }
1082  size_t GetStatisticsCount(void) const
1083  {
1084  return m_Key.size();
1085  }
1086 
1087  private:
1088  const TKey& m_Key;
1089  TLoaded& m_Loaded;
1090  TRet& m_Ret;
1091  };
1092 
1093  class CCommandLoadStates : public CReadDispatcherCommand
1094  {
1095  public:
1096  typedef vector<CSeq_id_Handle> TKey;
1097  typedef vector<bool> TLoaded;
1098  typedef vector<int> TRet;
1099  typedef CLoadLockBlobIds CLoadLock;
1100  CCommandLoadStates(CReaderRequestResult& result,
1101  const TKey& key, TLoaded& loaded, TRet& ret)
1103  m_Key(key), m_Loaded(loaded), m_Ret(ret)
1104  {
1105  }
1106 
1107  bool Execute(CReader& reader)
1108  {
1109  return reader.LoadStates(GetResult(), m_Key, m_Loaded, m_Ret);
1110  }
1111  bool IsDone(void)
1112  {
1113  return sx_BulkIsDone<CLoadLock>(GetResult(), m_Key, m_Loaded);
1114  }
1115  string GetErrMsg(void) const
1116  {
1117  return "LoadStates("+
1118  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
1119  "): data not found";
1120  }
1121  string GetStatisticsDescription(void) const
1122  {
1123  return "states("+
1124  sx_DescribeError<CLoadLock>(GetResult(), m_Key, m_Loaded)+
1125  ")";
1126  }
1127  CGBRequestStatistics::EStatType GetStatistics(void) const
1128  {
1130  }
1131  size_t GetStatisticsCount(void) const
1132  {
1133  return m_Key.size();
1134  }
1135 
1136  private:
1137  const TKey& m_Key;
1138  TLoaded& m_Loaded;
1139  TRet& m_Ret;
1140  };
1141 
1142  static const size_t kMaxErrorSeqIds = 100;
1143 
1144  string sx_ErrorSeqIds(CReaderRequestResult& result, const vector<CBlob_id>& keys)
1145  {
1146  string ret = "; seq-ids: { ";
1147  if (result.GetRequestedId()) {
1148  ret += result.GetRequestedId().AsString();
1149  }
1150  else {
1151  size_t total = 0;
1152  for (auto key : keys) {
1153  CTSE_LoadLock lock = result.GetTSE_LoadLock(key);
1154  CTSE_Info::TSeqIds ids;
1155  lock->GetBioseqsIds(ids);
1156  if (!ids.empty()) {
1157  int cnt = 0;
1158  for (auto& id : ids) {
1159  if (++total > kMaxErrorSeqIds) continue;
1160  if (cnt++ > 0) ret += ", ";
1161  ret += id.AsString();
1162  }
1163  }
1164  }
1165  if (total == 0) return "";
1166  if (total > kMaxErrorSeqIds) {
1167  ret += ", ... (+" + NStr::NumericToString(total - kMaxErrorSeqIds) + " more)";
1168  }
1169  }
1170  ret += " }";
1171  return ret;
1172  }
1173 
1174  class CCommandLoadBlobState : public CReadDispatcherCommand
1175  {
1176  public:
1177  typedef CBlob_id TKey;
1178  typedef CLoadLockBlobState TLock;
1179  CCommandLoadBlobState(CReaderRequestResult& result,
1180  const TKey& key)
1182  m_Key(key), m_Lock(result, key)
1183  {
1184  }
1185 
1186  bool IsDone(void)
1187  {
1188  return m_Lock.IsLoadedBlobState();
1189  }
1190  bool Execute(CReader& reader)
1191  {
1192  return reader.LoadBlobState(GetResult(), m_Key);
1193  }
1194  string GetErrMsg(void) const
1195  {
1196  return "LoadBlobVersion("+m_Key.ToString()+")" +
1197  sx_ErrorSeqIds(GetResult(), {m_Key}) + ": data not found";
1198  }
1199  CGBRequestStatistics::EStatType GetStatistics(void) const
1200  {
1202  }
1203  string GetStatisticsDescription(void) const
1204  {
1205  return "blob-version("+m_Key.ToString()+")";
1206  }
1207 
1208  private:
1209  TKey m_Key;
1210  TLock m_Lock;
1211  };
1212 
1213  class CCommandLoadBlobVersion : public CReadDispatcherCommand
1214  {
1215  public:
1216  typedef CBlob_id TKey;
1217  typedef CLoadLockBlobVersion TLock;
1218  CCommandLoadBlobVersion(CReaderRequestResult& result,
1219  const TKey& key)
1221  m_Key(key), m_Lock(result, key)
1222  {
1223  }
1224 
1225  bool IsDone(void)
1226  {
1227  return m_Lock.IsLoadedBlobVersion();
1228  }
1229  bool Execute(CReader& reader)
1230  {
1231  return reader.LoadBlobVersion(GetResult(), m_Key);
1232  }
1233  string GetErrMsg(void) const
1234  {
1235  return "LoadBlobVersion("+m_Key.ToString()+")" +
1236  sx_ErrorSeqIds(GetResult(), {m_Key}) + ": "
1237  "data not found";
1238  }
1239  CGBRequestStatistics::EStatType GetStatistics(void) const
1240  {
1242  }
1243  string GetStatisticsDescription(void) const
1244  {
1245  return "blob-version("+m_Key.ToString()+")";
1246  }
1247 
1248  private:
1249  TKey m_Key;
1250  TLock m_Lock;
1251  };
1252 
1253  bool s_AllBlobsAreLoaded(CReaderRequestResult& result,
1254  const CLoadLockBlobIds& blobs,
1256  const SAnnotSelector* sel)
1257  {
1258  _ASSERT(blobs.IsLoaded());
1259 
1260  CFixedBlob_ids blob_ids = blobs.GetBlob_ids();
1261  ITERATE ( CFixedBlob_ids, it, blob_ids ) {
1262  const CBlob_Info& info = *it;
1263  if ( !info.Matches(mask, sel) ) {
1264  continue;
1265  }
1266  CLoadLockBlob blob(result, *info.GetBlob_id());
1267  if ( !blob.IsLoadedBlob() ) {
1268  return false;
1269  }
1270  }
1271  return true;
1272  }
1273 
1274  class CCommandLoadBlobs : public CReadDispatcherCommand
1275  {
1276  public:
1277  typedef CLoadLockBlobIds TIds;
1278  typedef CReadDispatcher::TContentsMask TMask;
1279  CCommandLoadBlobs(CReaderRequestResult& result,
1280  TIds ids, TMask mask, const SAnnotSelector* sel)
1282  m_Ids(ids), m_Mask(mask), m_Selector(sel)
1283  {
1284  }
1285 
1286  bool IsDone(void)
1287  {
1288  return s_AllBlobsAreLoaded(GetResult(),
1289  m_Ids, m_Mask, m_Selector);
1290  }
1291  bool Execute(CReader& reader)
1292  {
1293  return reader.LoadBlobs(GetResult(),
1294  m_Ids, m_Mask, m_Selector);
1295  }
1296  string GetErrMsg(void) const
1297  {
1298  return "LoadBlobs(CLoadInfoBlob_ids): "
1299  "data not found";
1300  }
1301  CGBRequestStatistics::EStatType GetStatistics(void) const
1302  {
1304  }
1305  string GetStatisticsDescription(void) const
1306  {
1307  return "blobs(...)";
1308  }
1309 
1310  private:
1311  TIds m_Ids;
1312  TMask m_Mask;
1313  const SAnnotSelector* m_Selector;
1314  };
1315  class CCommandLoadSeq_idBlobs : public CReadDispatcherCommand
1316  {
1317  public:
1318  typedef CSeq_id_Handle TKey;
1319  typedef CLoadLockBlobIds TIds;
1320  typedef CReadDispatcher::TContentsMask TMask;
1321  CCommandLoadSeq_idBlobs(CReaderRequestResult& result,
1322  const TKey& key, TMask mask,
1323  const SAnnotSelector* sel)
1325  m_Key(key), m_Ids(result, key, sel),
1326  m_Mask(mask), m_Selector(sel)
1327  {
1328  }
1329 
1330  bool IsDone(void)
1331  {
1332  return s_Blob_idsLoaded(m_Ids, GetResult(), m_Key) &&
1333  s_AllBlobsAreLoaded(GetResult(),
1334  m_Ids, m_Mask, m_Selector);
1335  }
1336  bool Execute(CReader& reader)
1337  {
1338  return reader.LoadBlobs(GetResult(),
1339  m_Key, m_Mask, m_Selector);
1340  }
1341  string GetErrMsg(void) const
1342  {
1343  return "LoadBlobs("+m_Key.AsString()+"): "
1344  "data not found";
1345  }
1346  CGBRequestStatistics::EStatType GetStatistics(void) const
1347  {
1349  }
1350  string GetStatisticsDescription(void) const
1351  {
1352  return "blobs("+m_Key.AsString()+")";
1353  }
1354 
1355  private:
1356  TKey m_Key;
1357  TIds m_Ids;
1358  TMask m_Mask;
1359  const SAnnotSelector* m_Selector;
1360  };
1361 
1362  class CCommandLoadBlob : public CReadDispatcherCommand
1363  {
1364  public:
1365  typedef CBlob_id TKey;
1366  typedef CLoadLockBlob TLock;
1367  CCommandLoadBlob(CReaderRequestResult& result,
1368  const TKey& key,
1369  const CBlob_Info* blob_info = 0)
1371  m_Key(key),
1372  m_Lock(result, key),
1373  m_BlobInfo(blob_info)
1374  {
1375  }
1376 
1377  bool IsDone(void)
1378  {
1379  return m_Lock.IsLoadedBlob();
1380  }
1381  bool Execute(CReader& reader)
1382  {
1383  if ( m_BlobInfo ) {
1384  return reader.LoadBlob(GetResult(), *m_BlobInfo);
1385  }
1386  else {
1387  return reader.LoadBlob(GetResult(), m_Key);
1388  }
1389  }
1390  string GetErrMsg(void) const
1391  {
1392  return "LoadBlob("+m_Key.ToString()+")" +
1393  sx_ErrorSeqIds(GetResult(), {m_Key}) + ": "
1394  "data not found";
1395  }
1396  CGBRequestStatistics::EStatType GetStatistics(void) const
1397  {
1399  }
1400  string GetStatisticsDescription(void) const
1401  {
1402  return "blob("+m_Key.ToString()+")";
1403  }
1404 
1405  private:
1406  TKey m_Key;
1407  TLock m_Lock;
1408  const CBlob_Info* m_BlobInfo;
1409  };
1410 
1411  class CCommandLoadChunk : public CReadDispatcherCommand
1412  {
1413  public:
1414  typedef CBlob_id TKey;
1415  typedef CLoadLockBlob TLock;
1416  typedef int TChunkId;
1417  typedef CTSE_Chunk_Info TChunkInfo;
1418  CCommandLoadChunk(CReaderRequestResult& result,
1419  const TKey& key,
1420  TChunkId chunk_id)
1422  m_Key(key), m_Lock(result, key, chunk_id),
1423  m_ChunkId(chunk_id)
1424  {
1425  }
1426 
1427  bool IsDone(void)
1428  {
1429  return m_Lock.IsLoadedChunk();
1430  }
1431  bool Execute(CReader& reader)
1432  {
1433  return reader.LoadChunk(GetResult(), m_Key, m_ChunkId);
1434  }
1435  string GetErrMsg(void) const
1436  {
1437  return "LoadChunk("+m_Key.ToString()+", "+
1438  NStr::IntToString(m_ChunkId)+")" +
1439  sx_ErrorSeqIds(GetResult(), {m_Key}) + ": "
1440  "data not found";
1441  }
1442  CGBRequestStatistics::EStatType GetStatistics(void) const
1443  {
1445  }
1446  string GetStatisticsDescription(void) const
1447  {
1448  return "chunk("+m_Key.ToString()+"."+
1449  NStr::IntToString(m_ChunkId)+")";
1450  }
1451 
1452  private:
1453  TKey m_Key;
1454  TLock m_Lock;
1455  TChunkId m_ChunkId;
1456  };
1457 
1458  class CCommandLoadChunks : public CReadDispatcherCommand
1459  {
1460  public:
1461  typedef CBlob_id TKey;
1462  typedef CLoadLockBlob TLock;
1463  typedef int TChunkId;
1464  typedef vector<TChunkId> TChunkIds;
1465  typedef CTSE_Chunk_Info TChunkInfo;
1466  CCommandLoadChunks(CReaderRequestResult& result,
1467  const TKey& key,
1468  const TChunkIds chunk_ids)
1470  m_Key(key), m_Lock(result, key),
1471  m_ChunkIds(chunk_ids)
1472  {
1473  }
1474 
1475  bool IsDone(void)
1476  {
1477  ITERATE ( TChunkIds, it, m_ChunkIds ) {
1478  if ( !m_Lock.IsLoadedChunk(*it) ) {
1479  return false;
1480  }
1481  }
1482  return true;
1483  }
1484  bool Execute(CReader& reader)
1485  {
1486  return reader.LoadChunks(GetResult(), m_Key, m_ChunkIds);
1487  }
1488  string GetErrMsg(void) const
1489  {
1491  str << "LoadChunks(" << m_Key.ToString() << "; chunks: {";
1492  int cnt = 0;
1493  ITERATE ( TChunkIds, it, m_ChunkIds ) {
1494  if ( !m_Lock.IsLoadedChunk(*it) ) {
1495  if ( cnt++ ) str << ',';
1496  str << ' ' << *it;
1497  }
1498  }
1499  str << " })" + sx_ErrorSeqIds(GetResult(), {m_Key}) + ": data not found";
1500  return CNcbiOstrstreamToString(str);
1501  }
1502  CGBRequestStatistics::EStatType GetStatistics(void) const
1503  {
1505  }
1506  string GetStatisticsDescription(void) const
1507  {
1509  int cnt = 0;
1510  ITERATE ( TChunkIds, it, m_ChunkIds ) {
1511  int id = *it;
1512  if ( id >= 0 && id < kMax_Int ) {
1513  if ( !cnt ) {
1514  str << "chunk(" << m_Key.ToString() << '.';
1515  cnt = 1;
1516  }
1517  else {
1518  str << ',';
1519  }
1520  str << id;
1521  }
1522  }
1523  if ( !cnt ) {
1524  str << "blob(" << m_Key.ToString();
1525  }
1526  str << ')';
1527  return CNcbiOstrstreamToString(str);
1528  }
1529 
1530  private:
1531  TKey m_Key;
1532  TLock m_Lock;
1533  TChunkIds m_ChunkIds;
1534  };
1535 
1536  class CCommandLoadBlobSet : public CReadDispatcherCommand
1537  {
1538  public:
1539  typedef CReadDispatcher::TIds TIds;
1540  CCommandLoadBlobSet(CReaderRequestResult& result,
1541  const TIds& seq_ids)
1543  m_Ids(seq_ids)
1544  {
1545  }
1546 
1547  bool IsDone(void)
1548  {
1549  CReaderRequestResult& result = GetResult();
1550  ITERATE(TIds, id, m_Ids) {
1551  CLoadLockBlobIds blob_ids(result, *id, 0);
1552  if ( !blob_ids ) {
1553  return false;
1554  }
1555  if ( !s_Blob_idsLoaded(blob_ids, result, *id) ) {
1556  return false;
1557  }
1558  CFixedBlob_ids ids = blob_ids.GetBlob_ids();
1559  ITERATE ( CFixedBlob_ids, it, ids ) {
1560  if ( !it->Matches(fBlobHasCore, 0) ) {
1561  continue;
1562  }
1563  CLoadLockBlob blob(result, *it->GetBlob_id());
1564  if ( !blob.IsLoadedBlob() ) {
1565  return false;
1566  }
1567  }
1568  }
1569  return true;
1570  }
1571  bool Execute(CReader& reader)
1572  {
1573  return reader.LoadBlobSet(GetResult(), m_Ids);
1574  }
1575  string GetErrMsg(void) const
1576  {
1577  return "LoadBlobSet(" +
1578  NStr::SizetToString(m_Ids.size()) + " ids): "
1579  "data not found";
1580  }
1581  CGBRequestStatistics::EStatType GetStatistics(void) const
1582  {
1584  }
1585  string GetStatisticsDescription(void) const
1586  {
1587  return "blobs(" +
1588  NStr::SizetToString(m_Ids.size()) + " ids)";
1589  }
1590 
1591  private:
1592  TIds m_Ids;
1593  };
1594 }
1595 
1597 
1599 {
1601  : m_Command(command),
1602  m_SavedLevel(command.GetResult().GetLevel())
1603  {
1604  }
1605 
1607  {
1609  }
1610 
1613 };
1614 
1616 
1617 
1619  const CReader* asking_reader)
1620 {
1621  CheckReaders();
1622 
1623  if ( command.IsDone() ) {
1624  return;
1625  }
1626 
1627  SSaveResultLevel save_level(command);
1629  if ( asking_reader ) {
1630  // skip all readers before the asking one
1631  if ( rdr->second == asking_reader ) {
1632  // found the asking reader, start processing next readers
1633  asking_reader = 0;
1634  }
1635  continue;
1636  }
1637  CReader& reader = *rdr->second;
1638  command.GetResult().SetLevel(rdr->first);
1639  int retry_count = 0;
1640  int max_retry_count = reader.GetRetryCount();
1641  do {
1642  ++retry_count;
1643  try {
1645  if ( !command.Execute(reader) ) {
1646  retry_count = kMax_Int;
1647  }
1648  LogStat(command, r);
1649  }
1650  catch ( CLoaderException& exc ) {
1651  if ( exc.GetErrCode() == exc.eRepeatAgain ) {
1652  // no actual error, just restart
1653  --retry_count;
1654  LOG_POST_X(10, Info<<
1655  "CReadDispatcher: connection reopened "
1656  "due to inactivity timeout");
1657  }
1658  else if ( exc.GetErrCode() == exc.eNoConnection ) {
1659  LOG_POST_X(1, Warning<<
1660  "CReadDispatcher: Exception: "<<exc);
1661  retry_count = kMax_Int;
1662  }
1663  else {
1664  if ( retry_count >= max_retry_count &&
1665  !command.MayBeSkipped() &&
1666  !reader.MayBeSkippedOnErrors() ) {
1667  throw;
1668  }
1669  LOG_POST_X(2, Warning<<
1670  "CReadDispatcher: Exception: "<<exc);
1671  }
1672  }
1673  catch ( CException& exc ) {
1674  // error in the command
1675  if ( retry_count >= max_retry_count &&
1676  !command.MayBeSkipped() &&
1677  !reader.MayBeSkippedOnErrors() ) {
1678  throw;
1679  }
1680  LOG_POST_X(3, Warning <<
1681  "CReadDispatcher: Exception: "<<exc);
1682  }
1683  catch ( exception& exc ) {
1684  // error in the command
1685  if ( retry_count >= max_retry_count &&
1686  !command.MayBeSkipped() &&
1687  !reader.MayBeSkippedOnErrors() ) {
1688  throw;
1689  }
1690  LOG_POST_X(4, Warning <<
1691  "CReadDispatcher: Exception: "<<exc.what());
1692  }
1693  if ( command.IsDone() ) {
1694  return;
1695  }
1696  } while ( retry_count < max_retry_count );
1697  if ( !command.MayBeSkipped() &&
1698  !reader.MayBeSkippedOnErrors() &&
1700  NCBI_THROW(CLoaderException, eLoaderFailed, command.GetErrMsg());
1701  }
1702  }
1703 
1704  if ( !command.MayBeSkipped() &&
1706  NCBI_THROW(CLoaderException, eLoaderFailed, command.GetErrMsg());
1707  }
1708 }
1709 
1710 
1712  const CSeq_id_Handle& seq_id)
1713 {
1714  CCommandLoadSeq_idSeq_ids command(result, seq_id);
1715  Process(command);
1716 }
1717 
1718 
1720  const CSeq_id_Handle& seq_id)
1721 {
1722  CCommandLoadSeq_idGi command(result, seq_id);
1723  Process(command);
1724 }
1725 
1726 
1728  const CSeq_id_Handle& seq_id)
1729 {
1730  CCommandLoadSeq_idAccVer command(result, seq_id);
1731  Process(command);
1732 }
1733 
1734 
1736  const CSeq_id_Handle& seq_id)
1737 {
1738  CCommandLoadSeq_idLabel command(result, seq_id);
1739  Process(command);
1740 }
1741 
1742 
1744  const CSeq_id_Handle& seq_id)
1745 {
1746  CCommandLoadSeq_idTaxId command(result, seq_id);
1747  Process(command);
1748 }
1749 
1750 
1752  const CSeq_id_Handle& seq_id)
1753 {
1754  CCommandLoadSequenceHash command(result, seq_id);
1755  Process(command);
1756 }
1757 
1758 
1760  const CSeq_id_Handle& seq_id)
1761 {
1762  CCommandLoadSequenceLength command(result, seq_id);
1763  Process(command);
1764 }
1765 
1766 
1768  const CSeq_id_Handle& seq_id)
1769 {
1770  CCommandLoadSequenceType command(result, seq_id);
1771  Process(command);
1772 }
1773 
1774 
1776  const TIds& ids, TLoaded& loaded, TIds& ret)
1777 {
1778  CCommandLoadAccVers command(result, ids, loaded, ret);
1779  Process(command);
1780 }
1781 
1782 
1784  const TIds& ids, TLoaded& loaded, TGis& ret)
1785 {
1786  CCommandLoadGis command(result, ids, loaded, ret);
1787  Process(command);
1788 }
1789 
1790 
1792  const TIds& ids, TLoaded& loaded, TLabels& ret)
1793 {
1794  CCommandLoadLabels command(result, ids, loaded, ret);
1795  Process(command);
1796 }
1797 
1798 
1800  const TIds& ids, TLoaded& loaded, TTaxIds& ret)
1801 {
1802  CCommandLoadTaxIds command(result, ids, loaded, ret);
1803  Process(command);
1804 }
1805 
1806 
1808  const TIds& ids, TLoaded& loaded,
1809  THashes& ret, TKnown& known)
1810 {
1811  CCommandLoadHashes command(result, ids, loaded, ret, known);
1812  Process(command);
1813 }
1814 
1815 
1817  const TIds& ids, TLoaded& loaded, TLengths& ret)
1818 {
1819  CCommandLoadLengths command(result, ids, loaded, ret);
1820  Process(command);
1821 }
1822 
1823 
1825  const TIds& ids, TLoaded& loaded, TTypes& ret)
1826 {
1827  CCommandLoadTypes command(result, ids, loaded, ret);
1828  Process(command);
1829 }
1830 
1831 
1833  const TIds& ids, TLoaded& loaded, TStates& ret)
1834 {
1835  CCommandLoadStates command(result, ids, loaded, ret);
1836  Process(command);
1837 }
1838 
1839 
1841  const CSeq_id_Handle& seq_id,
1842  const SAnnotSelector* sel)
1843 {
1844  CCommandLoadSeq_idBlob_ids command(result, seq_id, sel);
1845  Process(command);
1846 }
1847 
1848 
1850  const TBlobId& blob_id)
1851 {
1852  CCommandLoadBlobState command(result, blob_id);
1853  Process(command);
1854 }
1855 
1857  const TBlobId& blob_id,
1858  const CReader* asking_reader)
1859 {
1860  CCommandLoadBlobVersion command(result, blob_id);
1861  Process(command, asking_reader);
1862 }
1863 
1865  const CSeq_id_Handle& seq_id,
1867  const SAnnotSelector* sel)
1868 {
1869  CCommandLoadSeq_idBlobs command(result, seq_id, mask, sel);
1870  Process(command);
1871 }
1872 
1873 
1875  const CLoadLockBlobIds& blobs,
1877  const SAnnotSelector* sel)
1878 {
1879  CCommandLoadBlobs command(result, blobs, mask, sel);
1880  Process(command);
1881 }
1882 
1883 
1885  const CBlob_id& blob_id)
1886 {
1887  CCommandLoadBlob command(result, blob_id);
1888  Process(command);
1889 }
1890 
1891 
1893  const CBlob_Info& blob_info)
1894 {
1895  CCommandLoadBlob command(result, *blob_info.GetBlob_id(), &blob_info);
1896  Process(command);
1897 }
1898 
1899 
1901  const TBlobId& blob_id, TChunkId chunk_id)
1902 {
1903  CCommandLoadChunk command(result, blob_id, chunk_id);
1904  Process(command);
1905 }
1906 
1907 
1909  const TBlobId& blob_id,
1910  const TChunkIds& chunk_ids)
1911 {
1912  CCommandLoadChunks command(result, blob_id, chunk_ids);
1913  Process(command);
1914 }
1915 
1916 
1918  const TIds& seq_ids)
1919 {
1920  CCommandLoadBlobSet command(result, seq_ids);
1921  Process(command);
1922 }
1923 
1924 
1927  const TIds& ids, TLoaded& loaded,
1928  TStates& ret)
1929 {
1930  if ( loaded[i] || CannotProcess(ids[i]) ) {
1931  return true;
1932  }
1933  CLoadLockBlobIds lock(result, ids[i]);
1934  if ( lock.IsLoaded() ) {
1935  CFixedBlob_ids blob_ids = lock.GetBlob_ids();
1936  if ( !blob_ids.IsFound() ) {
1937  ret[i] = lock.GetState();
1938  return true;
1939  }
1940  ITERATE ( CFixedBlob_ids, it, blob_ids ) {
1941  if ( it->Matches(fBlobHasCore, 0) ) {
1944  CLoadLockBlobState state_lock(result, *it->GetBlob_id());
1945  if ( state_lock.IsLoadedBlobState() ) {
1946  state = state_lock.GetBlobState();
1947  }
1948  }
1950  ret[i] = state;
1951  loaded[i] = true;
1952  return true;
1953  }
1954  return false;
1955  }
1956  }
1957  }
1958  else {
1959  CLoadLockSeqIds ids_lock(result, ids[i], eAlreadyLoaded);
1960  if ( ids_lock && !ids_lock.GetData().IsFound() ) {
1961  ret[i] = ids_lock.GetState();
1962  return true;
1963  }
1964  }
1965  return false;
1966 }
1967 
1968 
1970  CReaderRequestResultRecursion& recursion)
1971 {
1972  CReaderRequestResult& result = command.GetResult();
1973  double time = recursion.GetCurrentRequestTime();
1974  size_t count = command.GetStatisticsCount();
1975  CGBRequestStatistics& stat = sx_Statistics[command.GetStatistics()];
1976  stat.AddTime(time, count);
1977  if ( CollectStatistics() >= 2 ) {
1978  string descr = command.GetStatisticsDescription();
1979  const CSeq_id_Handle& idh = result.GetRequestedId();
1980  if ( idh ) {
1981  descr = descr + " for " + idh.AsString();
1982  }
1983  LOG_POST_X(8, setw(recursion.GetRecursionLevel()) << "" <<
1984  "Dispatcher: read " <<
1985  descr << " in " <<
1986  setiosflags(ios::fixed) <<
1987  setprecision(3) << (time*1000) << " ms");
1988  }
1989 }
1990 
1991 
1993  CReaderRequestResultRecursion& recursion,
1994  double size)
1995 {
1996  CReaderRequestResult& result = command.GetResult();
1997  double time = recursion.GetCurrentRequestTime();
1998  CGBRequestStatistics& stat = sx_Statistics[command.GetStatistics()];
1999  stat.AddTimeSize(time, size);
2000  if ( CollectStatistics() >= 2 ) {
2001  string descr = command.GetStatisticsDescription();
2002  const CSeq_id_Handle& idh = result.GetRequestedId();
2003  if ( idh ) {
2004  descr = descr + " for " + idh.AsString();
2005  }
2006  LOG_POST_X(9, setw(recursion.GetRecursionLevel()) << "" <<
2007  descr << " in " <<
2008  setiosflags(ios::fixed) <<
2009  setprecision(3) <<
2010  (time*1000) << " ms (" <<
2011  setprecision(2) <<
2012  (size/1024.0) << " kB " <<
2013  setprecision(2) <<
2014  (size/time/1024) << " kB/s)");
2015  }
2016 }
2017 
2018 
#define static
ncbi::TMaskedQueryRegions mask
#define false
Definition: bool.h:36
const CConstRef< CBlob_id > & GetBlob_id(void) const
bool IsFound(void) const
static const CGBRequestStatistics & GetStatistics(EStatType type)
Definition: dispatcher.cpp:104
double GetSize(void) const
Definition: statistics.hpp:88
void AddTimeSize(double time, double size)
Definition: statistics.hpp:102
const char * GetEntity(void) const
Definition: statistics.hpp:79
static void PrintStatistics(void)
Definition: dispatcher.cpp:143
void PrintStat(void) const
Definition: dispatcher.cpp:114
CGBRequestStatistics(const char *action, const char *entity)
Definition: dispatcher.cpp:97
const char * GetAction(void) const
Definition: statistics.hpp:76
double GetTime(void) const
Definition: statistics.hpp:85
size_t GetCount(void) const
Definition: statistics.hpp:82
void AddTime(double time, size_t count=1)
Definition: statistics.hpp:97
bool SetNoBlob_ids(const CFixedBlob_ids::TState &state, TExpirationTime expiration_time)
TData GetBlob_ids(void) const
TData::TState GetState(void) const
TData GetBlobState(void) const
bool IsLoadedBlobState(void) const
static bool IsFound(const TData &data)
TData::TState GetState(void) const
Data loader exceptions, used by GenBank loader.
CNcbiOstrstreamToString class helps convert CNcbiOstrstream to a string Sample usage:
Definition: ncbistre.hpp:802
static void RegisterAllProcessors(CReadDispatcher &dispatcher)
Definition: processors.cpp:299
virtual EType GetType(void) const =0
CReadDispatcherCommand(CReaderRequestResult &result)
Definition: dispatcher.cpp:269
virtual bool MayBeSkipped(void) const
Definition: dispatcher.cpp:280
virtual size_t GetStatisticsCount(void) const
Definition: dispatcher.cpp:286
CReaderRequestResult & GetResult(void) const
Definition: dispatcher.hpp:201
virtual ~CReadDispatcherCommand(void)
Definition: dispatcher.cpp:275
void LoadStates(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TStates &ret)
void ResetCaches(void)
Definition: dispatcher.cpp:250
void CheckReaders(void) const
Definition: dispatcher.cpp:231
void LoadBlobSet(CReaderRequestResult &result, const TIds &seq_ids)
void LoadChunks(CReaderRequestResult &result, const TBlobId &blob_id, const TChunkIds &chunk_ids)
TProcessors m_Processors
Definition: dispatcher.hpp:182
void LoadSeq_idLabel(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
CReader::TChunkId TChunkId
Definition: dispatcher.hpp:65
void LoadGis(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TGis &ret)
CReader::TContentsMask TContentsMask
Definition: dispatcher.hpp:61
static void LogStat(CReadDispatcherCommand &command, CReaderRequestResultRecursion &recursion)
vector< string > TLabels
Definition: dispatcher.hpp:109
void LoadBlobVersion(CReaderRequestResult &result, const TBlobId &blob_id, const CReader *asking_reader=0)
void InsertReader(TLevel level, CRef< CReader > reader)
Definition: dispatcher.cpp:173
const CProcessor & GetProcessor(CProcessor::EType type) const
Definition: dispatcher.cpp:219
CReader::TChunkIds TChunkIds
Definition: dispatcher.hpp:66
void LoadLabels(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TLabels &ret)
void LoadSeq_idGi(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
~CReadDispatcher(void)
Definition: dispatcher.cpp:165
vector< int > THashes
Definition: dispatcher.hpp:111
void InsertWriter(TLevel level, CRef< CWriter > writer)
Definition: dispatcher.cpp:184
static bool SetBlobState(size_t i, CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TStates &ret)
void LoadSequenceType(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
void LoadAccVers(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TIds &ret)
void LoadSequenceHash(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
void LoadLengths(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TLengths &ret)
vector< TBlobState > TStates
Definition: dispatcher.hpp:114
void LoadTaxIds(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TTaxIds &ret)
void LoadHashes(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, THashes &ret, TKnown &known)
vector< bool > TLoaded
Definition: dispatcher.hpp:106
bool HasReaderWithHUPIncluded() const
Definition: dispatcher.cpp:239
void LoadBlobState(CReaderRequestResult &result, const TBlobId &blob_id)
void LoadTypes(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TTypes &ret)
vector< bool > TKnown
Definition: dispatcher.hpp:107
void LoadSeq_idTaxId(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
void LoadSeq_idSeq_ids(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
vector< CSeq_id_Handle > TIds
Definition: dispatcher.hpp:68
TWriters m_Writers
Definition: dispatcher.hpp:181
vector< CSeq_inst::EMol > TTypes
Definition: dispatcher.hpp:113
void InsertProcessor(CRef< CProcessor > processor)
Definition: dispatcher.cpp:194
void LoadBlobs(CReaderRequestResult &result, const CSeq_id_Handle &seq_id, TContentsMask mask, const SAnnotSelector *sel)
CWriter * GetWriter(const CReaderRequestResult &result, CWriter::EType type) const
Definition: dispatcher.cpp:204
TReaders m_Readers
Definition: dispatcher.hpp:180
void LoadSeq_idAccVer(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
void Process(CReadDispatcherCommand &command, const CReader *asking_reader=0)
static int CollectStatistics(void)
Definition: dispatcher.cpp:151
void LoadSequenceLength(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
void LoadSeq_idBlob_ids(CReaderRequestResult &result, const CSeq_id_Handle &seq_id, const SAnnotSelector *sel)
vector< TTaxId > TTaxIds
Definition: dispatcher.hpp:110
void LoadChunk(CReaderRequestResult &result, const TBlobId &blob_id, TChunkId chunk_id)
vector< TGi > TGis
Definition: dispatcher.hpp:108
vector< TSeqPos > TLengths
Definition: dispatcher.hpp:112
void LoadBlob(CReaderRequestResult &result, const CBlob_id &blob_id)
static bool CannotProcess(const CSeq_id_Handle &sih)
Definition: dispatcher.cpp:261
double GetCurrentRequestTime(void) const
void SetLevel(TLevel level)
virtual bool LoadSeq_idSeq_ids(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)=0
virtual int GetRetryCount(void) const
Definition: reader.cpp:478
virtual bool LoadBlobSet(CReaderRequestResult &result, const TSeqIds &seq_ids)
Definition: reader.cpp:981
virtual bool LoadHashes(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, THashes &ret, TKnown &known)
Definition: reader.cpp:751
CReadDispatcher * m_Dispatcher
Definition: reader.hpp:344
virtual bool LoadStates(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TStates &ret)
Definition: reader.cpp:822
virtual bool LoadSequenceHash(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
Definition: reader.cpp:579
virtual bool LoadSeq_idTaxId(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
Definition: reader.cpp:547
virtual bool LoadLabels(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TLabels &ret)
Definition: reader.cpp:709
virtual bool LoadTypes(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TTypes &ret)
Definition: reader.cpp:798
virtual bool MayBeSkippedOnErrors(void) const
Definition: reader.cpp:484
virtual bool LoadTaxIds(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TTaxIds &ret)
Definition: reader.cpp:730
virtual bool LoadSequenceType(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
Definition: reader.cpp:628
virtual bool LoadBlob(CReaderRequestResult &result, const CBlob_id &blob_id)=0
virtual bool LoadSequenceLength(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
Definition: reader.cpp:596
virtual bool LoadChunks(CReaderRequestResult &result, const TBlobId &blob_id, const TChunkIds &chunk_ids)
Definition: reader.cpp:969
virtual bool LoadGis(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TGis &ret)
Definition: reader.cpp:685
virtual bool LoadAccVers(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TIds &ret)
Definition: reader.cpp:661
virtual bool LoadSeq_idGi(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
Definition: reader.cpp:490
virtual bool LoadSeq_idAccVer(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
Definition: reader.cpp:509
virtual bool LoadBlobState(CReaderRequestResult &result, const TBlobId &blob_id)=0
virtual bool LoadChunk(CReaderRequestResult &result, const TBlobId &blob_id, TChunkId chunk_id)
Definition: reader.cpp:961
virtual bool LoadLengths(CReaderRequestResult &result, const TIds &ids, TLoaded &loaded, TLengths &ret)
Definition: reader.cpp:777
virtual bool LoadBlobVersion(CReaderRequestResult &result, const TBlobId &blob_id)=0
virtual bool LoadSeq_idBlob_ids(CReaderRequestResult &result, const CSeq_id_Handle &seq_id, const SAnnotSelector *sel)
All LoadXxx() methods should return false if there is no requested data in the reader.
Definition: reader.cpp:860
virtual bool LoadBlobs(CReaderRequestResult &result, const CSeq_id_Handle &seq_id, TContentsMask mask, const SAnnotSelector *sel)
Definition: reader.cpp:879
virtual bool LoadSeq_idLabel(CReaderRequestResult &result, const CSeq_id_Handle &seq_id)
Definition: reader.cpp:528
CSafeStatic<>::
virtual void GetBioseqsIds(TSeqIds &ids) const
Definition: tse_info.cpp:691
vector< CSeq_id_Handle > TSeqIds
Definition: tse_info.hpp:351
bool IsLoaded(void) const
const_iterator end() const
Definition: map.hpp:152
bool empty() const
Definition: map.hpp:149
const_iterator find(const key_type &key) const
Definition: map.hpp:153
static bool s_AllowIncompleteCommands(void)
Definition: dispatcher.cpp:57
BEGIN_LOCAL_NAMESPACE
static CGBRequestStatistics sx_Statistics[CGBRequestStatistics::eStats_Count]
Definition: dispatcher.cpp:69
NCBI_PARAM_DEF_EX(bool, GENBANK, ALLOW_INCOMPLETE_COMMANDS, false, eParam_NoThread, GENBANK_ALLOW_INCOMPLETE_COMMANDS)
END_LOCAL_NAMESPACE
NCBI_PARAM_DECL(bool, GENBANK, ALLOW_INCOMPLETE_COMMANDS)
NCBI_DEFINE_ERR_SUBCODE_X(10)
static int type
Definition: getdata.c:31
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
#define NON_CONST_ITERATE(Type, Var, Cont)
Non constant version of ITERATE macro.
Definition: ncbimisc.hpp:822
#define LOG_POST_X(err_subcode, message)
Definition: ncbidiag.hpp:553
TErrCode GetErrCode(void) const
Get error code.
Definition: ncbiexpt.cpp:453
#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
void Warning(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1191
#define NCBI_THROW_FMT(exception_class, err_code, message)
The same as NCBI_THROW but with message processed as output to ostream.
Definition: ncbiexpt.hpp:719
virtual const char * what(void) const noexcept
Standard report (includes full backlog).
Definition: ncbiexpt.cpp:342
void Info(CExceptionArgs_Base &args)
Definition: ncbiexpt.hpp:1185
CConstRef< CSeq_id > GetSeqId(void) const
string AsString(void) const
CSeq_id::E_Choice Which(void) const
#define NCBI_PARAM_TYPE(section, name)
Generate typename for a parameter from its {section, name} attributes.
Definition: ncbi_param.hpp:149
@ eParam_NoThread
Do not use per-thread values.
Definition: ncbi_param.hpp:418
#define kMax_Int
Definition: ncbi_limits.h:184
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define END_SCOPE(ns)
End the previously defined scope.
Definition: ncbistl.hpp:75
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
#define BEGIN_SCOPE(ns)
Define a new scope.
Definition: ncbistl.hpp:72
static string SizetToString(size_t value, TNumToStringFlags flags=0, int base=10)
Convert size_t to string.
Definition: ncbistr.cpp:2751
static string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
Definition: ncbistr.hpp:5083
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
Definition: ncbistr.hpp:5352
static enable_if< is_arithmetic< TNumeric >::value||is_convertible< TNumeric, Int8 >::value, string >::type NumericToString(TNumeric value, TNumToStringFlags flags=0, int base=10)
Convert numeric value to string.
Definition: ncbistr.hpp:673
const TDb & GetDb(void) const
Get the Db member data.
Definition: Dbtag_.hpp:220
const TGeneral & GetGeneral(void) const
Get the variant data.
Definition: Seq_id_.cpp:369
@ e_General
for other databases
Definition: Seq_id_.hpp:105
@ e_Local
local use
Definition: Seq_id_.hpp:95
Definition of all error codes used in objtools libraries.
int i
static MDB_envinfo info
Definition: mdb_load.c:37
string Execute(const string &cmmd, const vector< string > &args, const string &data=kEmptyStr)
const struct ncbi::grid::netcache::search::fields::SIZE size
const struct ncbi::grid::netcache::search::fields::KEY key
string s_Value(TValue value)
const char * command
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
static unsigned cnt[256]
int TChunkId
Definition: blob_id.hpp:131
@ fBlobHasCore
Definition: blob_id.hpp:141
@ eAlreadyLoaded
static const char * str(char *buf, int n)
Definition: stats.c:84
SAnnotSelector –.
CReadDispatcherCommand & m_Command
SSaveResultLevel(CReadDispatcherCommand &command)
CReadDispatcher::TLevel m_SavedLevel
Definition: type.c:6
#define _ASSERT
else result
Definition: token2.c:20
Modified on Sat Dec 02 09:19:51 2023 by modify_doxy.py rev. 669887