1 #ifndef READER_ID2_BASE__HPP_INCLUDED
2 #define READER_ID2_BASE__HPP_INCLUDED
3 
4 /*  $Id: reader_id2_base.hpp 630076 2021-04-26 17:10:55Z ivanov $
5 * ===========================================================================
6 *                            PUBLIC DOMAIN NOTICE
7 *               National Center for Biotechnology Information
8 *
9 *  This software/database is a "United States Government Work" under the
10 *  terms of the United States Copyright Act.  It was written as part of
11 *  the author's official duties as a United States Government employee and
12 *  thus cannot be copyrighted.  This software/database is freely available
13 *  to the public for use. The National Library of Medicine and the U.S.
14 *  Government have not placed any restriction on its use or reproduction.
15 *
16 *  Although all reasonable efforts have been taken to ensure the accuracy
17 *  and reliability of the software and data, the NLM and the U.S.
18 *  Government do not and cannot warrant the performance or results that
19 *  may be obtained by using this software or data. The NLM and the U.S.
20 *  Government disclaim all warranties, express or implied, including
21 *  warranties of performance, merchantability or fitness for any particular
22 *  purpose.
23 *
24 *  Please cite the author in any work or product based on this material.
25 * ===========================================================================
26 *
27 *  Author:  Eugene Vasilchenko
28 *
29 *  File Description: Data reader from ID2
30 *
31 */
32 
33 #include <objtools/data_loaders/genbank/reader.hpp>
34 #include <corelib/ncbitime.hpp>
35 
36 BEGIN_NCBI_SCOPE
37 
38 class CByteSourceReader;
39 class CObjectIStream;
40 class CObjectInfo;
41 
42 BEGIN_SCOPE(objects)
43 
44 class CSeq_id;
45 class CID2_Blob_Id;
46 
47 class CID2_Request;
48 class CID2_Request_Packet;
49 class CID2_Request_Get_Seq_id;
50 class CID2_Request_Get_Blob_Id;
51 class CID2_Request_Get_Blob;
52 class CID2_Request_Get_Blob_Info;
53 class CID2_Get_Blob_Details;
54 
55 class CID2_Error;
56 class CID2_Reply;
57 class CID2_Reply_Get_Seq_id;
58 class CID2_Reply_Get_Blob_Id;
59 class CID2_Reply_Get_Blob_Seq_ids;
60 class CID2_Reply_Get_Blob;
61 class CID2_Reply_Data;
62 class CID2S_Reply_Get_Split_Info;
63 class CID2S_Split_Info;
64 class CID2S_Reply_Get_Chunk;
65 class CID2S_Chunk_Id;
66 class CID2S_Chunk;
67 class CID2Processor;
68 class CID2ProcessorContext;
69 class CId2ReaderProcessorResolver;
70 class CReaderRequestResult;
71 struct SId2LoadedSet;
72 struct SId2PacketInfo;
73 struct SId2PacketReplies;
74 struct SId2ProcessingState;
75 
76 class NCBI_XREADER_EXPORT CId2ReaderBase : public CReader
77 {
78 public:
79     CId2ReaderBase(void);
80     ~CId2ReaderBase(void);
81 
82     // new interface
83     bool LoadSeq_idSeq_ids(CReaderRequestResult& result,
84                            const CSeq_id_Handle& seq_id);
85     bool LoadSeq_idGi(CReaderRequestResult& result,
86                       const CSeq_id_Handle& seq_id);
87     bool LoadSeq_idAccVer(CReaderRequestResult& result,
88                           const CSeq_id_Handle& seq_id);
89     bool LoadSeq_idLabel(CReaderRequestResult& result,
90                          const CSeq_id_Handle& seq_id);
91     bool LoadSeq_idTaxId(CReaderRequestResult& result,
92                          const CSeq_id_Handle& seq_id);
93     bool LoadSequenceHash(CReaderRequestResult& result,
94                           const CSeq_id_Handle& seq_id);
95     bool LoadSequenceLength(CReaderRequestResult& result,
96                             const CSeq_id_Handle& seq_id);
97     bool LoadSequenceType(CReaderRequestResult& result,
98                           const CSeq_id_Handle& seq_id);
99     bool LoadSeq_idBlob_ids(CReaderRequestResult& result,
100                             const CSeq_id_Handle& seq_id,
101                             const SAnnotSelector* sel);
102 
103     bool LoadAccVers(CReaderRequestResult& result,
104                      const TIds& ids, TLoaded& loaded, TIds& ret);
105     bool LoadGis(CReaderRequestResult& result,
106                  const TIds& ids, TLoaded& loaded, TGis& ret);
107     bool LoadLabels(CReaderRequestResult& result,
108                     const TIds& ids, TLoaded& loaded, TLabels& ret);
109     bool LoadTaxIds(CReaderRequestResult& result,
110                     const TIds& ids, TLoaded& loaded, TTaxIds& ret);
111     bool LoadHashes(CReaderRequestResult& result,
112                     const TIds& ids, TLoaded& loaded,
113                     THashes& ret, TKnown& known);
114     bool LoadLengths(CReaderRequestResult& result,
115                      const TIds& ids, TLoaded& loaded, TLengths& ret);
116     bool LoadTypes(CReaderRequestResult& result,
117                    const TIds& ids, TLoaded& loaded, TTypes& ret);
118     bool LoadStates(CReaderRequestResult& result,
119                     const TIds& ids, TLoaded& loaded, TStates& ret);
120 
121     bool LoadBlobState(CReaderRequestResult& result,
122                        const TBlobId& blob_id);
123     bool LoadBlobVersion(CReaderRequestResult& result,
124                          const TBlobId& blob_id);
125 
126     bool LoadBlobs(CReaderRequestResult& result,
127                    const CSeq_id_Handle& seq_id,
128                    TContentsMask mask,
129                    const SAnnotSelector* sel);
130     bool LoadBlobs(CReaderRequestResult& result,
131                    const CLoadLockBlobIds& blobs,
132                    TContentsMask mask,
133                    const SAnnotSelector* sel);
134     bool LoadBlob(CReaderRequestResult& result,
135                   const TBlobId& blob_id);
136     bool LoadChunk(CReaderRequestResult& result,
137                    const TBlobId& blob_id, TChunkId chunk_id);
138     bool LoadChunks(CReaderRequestResult& result,
139                     const TBlobId& blob_id,
140                     const TChunkIds& chunk_ids);
141     bool LoadBlobSet(CReaderRequestResult& result,
142                      const TSeqIds& seq_ids);
143 
144     static TBlobId GetBlobId(const CID2_Blob_Id& blob_id);
145 
146     enum EDebugLevel
147     {
148         eTraceError    = 1,
149         eTraceOpen     = 2,
150         eTraceConn     = 4,
151         eTraceASN      = 5,
152         eTraceBlob     = 8,
153         eTraceBlobData = 9
154     };
155     static int GetDebugLevel(void);
156     static bool GetVDB_CDD_Enabled();
157     static void SetVDB_CDD_Enabled(bool enabled = true);
158 
159 protected:
160     virtual string x_ConnDescription(TConn conn) const = 0;
161 
162     virtual void x_SendPacket(TConn conn, const CID2_Request_Packet& packet)=0;
163     virtual void x_ReceiveReply(TConn conn, CID2_Reply& reply) = 0;
164     void x_ReceiveReply(CObjectIStream& stream, TConn conn, CID2_Reply& reply);
165 
166     virtual void x_EndOfPacket(TConn conn);
167 
168     void x_SetResolve(CID2_Request_Get_Blob_Id& get_blob_id,
169                       const CSeq_id& seq_id);
170     void x_SetResolve(CID2_Blob_Id& blob_id, const CBlob_id& src);
171 
172     void x_SetDetails(CID2_Get_Blob_Details& details,
173                       TContentsMask mask);
174 
175     void x_SetExclude_blobs(CID2_Request_Get_Blob_Info& get_blob_info,
176                             const CSeq_id_Handle& idh,
177                             CReaderRequestResult& result);
178 
179     void x_ProcessRequest(CReaderRequestResult& result,
180                           CID2_Request& req,
181                           const SAnnotSelector* sel);
182     void x_ProcessPacket(CReaderRequestResult& result,
183                          CID2_Request_Packet& packet,
184                          const SAnnotSelector* sel);
185 
186     enum EErrorFlags {
187         fError_warning              = 1 << 0,
188         fError_no_data              = 1 << 1,
189         fError_bad_command          = 1 << 2,
190         fError_bad_connection       = 1 << 3,
191         fError_warning_dead         = 1 << 4,
192         fError_restricted           = 1 << 5,
193         fError_withdrawn            = 1 << 6,
194         fError_suppressed_perm      = 1 << 7,
195         fError_suppressed_temp      = 1 << 8,
196         fError_inactivity_timeout   = 1 << 9
197     };
198     typedef int TErrorFlags;
199     TErrorFlags x_GetError(CReaderRequestResult& result,
200                            const CID2_Error& error);
201     TErrorFlags x_GetMessageError(const CID2_Error& error);
202     static void sx_CheckErrorFlag(const CID2_Error& error,
203                                   TErrorFlags& error_flags,
204                                   EErrorFlags test_flag,
205                                   const char* marker1,
206                                   const char* marker2 = 0);
207     TErrorFlags x_GetError(CReaderRequestResult& result,
208                            const CID2_Reply& reply);
209     TErrorFlags x_GetMessageError(const CID2_Reply& reply);
210     TBlobState x_GetBlobStateFromID2(const CBlob_id& blob_id,
211                                      SId2LoadedSet& loaded_set,
212                                      int id2_state);
213     TBlobState x_GetBlobState(const CBlob_id& blob_id,
214                               SId2LoadedSet& loaded_set,
215                               const CID2_Reply& reply,
216                               TErrorFlags* errors_ptr = 0);
217 
218     void x_ProcessReply(CReaderRequestResult& result,
219                         SId2LoadedSet& loaded_set,
220                         const CID2_Reply& main_reply,
221                         const CID2_Request& main_request);
222     void x_ProcessEmptyReply(CReaderRequestResult& result,
223                              SId2LoadedSet& loaded_set,
224                              const CID2_Reply& main_reply,
225                              const CID2_Request& main_request);
226     void x_ProcessGetSeqId(CReaderRequestResult& result,
227                            SId2LoadedSet& loaded_set,
228                            const CID2_Reply& main_reply,
229                            const CID2_Request_Get_Seq_id& request,
230                            const CID2_Reply_Get_Seq_id* reply);
231     void x_ProcessGetSeqIdSeqId(CReaderRequestResult& result,
232                                 SId2LoadedSet& loaded_set,
233                                 const CID2_Reply& main_reply,
234                                 const CSeq_id_Handle& seq_id,
235                                 const CID2_Request_Get_Seq_id& request,
236                                 const CID2_Reply_Get_Seq_id* reply);
237     void x_ProcessGetBlobId(CReaderRequestResult& result,
238                             SId2LoadedSet& loaded_set,
239                             const CID2_Reply& main_reply,
240                             const CID2_Reply_Get_Blob_Id& reply);
241     void x_ProcessGetBlobSeqIds(CReaderRequestResult& result,
242                                 SId2LoadedSet& loaded_set,
243                                 const CID2_Reply& main_reply,
244                                 const CID2_Reply_Get_Blob_Seq_ids& reply);
245     void x_ProcessGetBlob(CReaderRequestResult& result,
246                           SId2LoadedSet& loaded_set,
247                           const CID2_Reply& main_reply,
248                           const CID2_Reply_Get_Blob& reply);
249     void x_ProcessGetSplitInfo(CReaderRequestResult& result,
250                                SId2LoadedSet& loaded_set,
251                                const CID2_Reply& main_reply,
252                                const CID2S_Reply_Get_Split_Info& reply);
253     void x_ProcessGetChunk(CReaderRequestResult& result,
254                            SId2LoadedSet& loaded_set,
255                            const CID2_Reply& main_reply,
256                            const CID2S_Reply_Get_Chunk& reply);
257 
258     void x_UpdateLoadedSet(CReaderRequestResult& result,
259                            SId2LoadedSet& data,
260                            const SAnnotSelector* sel);
261 
262     bool x_LoadSeq_idBlob_idsSet(CReaderRequestResult& result,
263                                  const TSeqIds& seq_ids);
264 
265     friend class CId2ReaderProcessorResolver;
266 
267     void x_DumpPacket(TConn conn, const CID2_Request_Packet& packet, const char* msg = "Sending");
268     void x_DumpReply(TConn conn, CID2_Reply& reply, const char* msg = "Received");
269     void x_SetContextData(CID2_Request& request);
270     void x_SendToConnection(TConn conn, CID2_Request_Packet& packet);
271     void x_SendID2Packet(CReaderRequestResult& result,
272                          SId2ProcessingState& state,
273                          CID2_Request_Packet& packet);
274     CRef<CID2_Reply> x_ReceiveFromConnection(TConn conn);
275     CRef<CID2_Reply> x_ReceiveID2ReplyStage(SId2ProcessingState& state, size_t pos);
276     CRef<CID2_Reply> x_ReceiveID2Reply(SId2ProcessingState& state);
277     void x_AssignSerialNumbers(SId2PacketInfo& info,
278                                CID2_Request_Packet& packet);
279     int x_GetReplyIndex(CReaderRequestResult& result,
280                         CConn* conn,
281                         SId2PacketInfo& packet,
282                         const CID2_Reply& reply);
283     bool x_DoneReply(SId2PacketInfo& info,
284                      int num,
285                      const CID2_Reply& reply);
286 
287     void x_DisableProcessors();
288 
289 private:
290     CAtomicCounter_WithAutoInit m_RequestSerialNumber;
291 
292     enum {
293         fAvoidRequest_nested_get_blob_info = 1<<0,
294         fAvoidRequest_for_Seq_id_label     = 1<<1,
295         fAvoidRequest_for_Seq_id_taxid     = 1<<2,
296         fAvoidRequest_for_Seq_id_hash      = 1<<3,
297         fAvoidRequest_for_Seq_id_length    = 1<<4,
298         fAvoidRequest_for_Seq_id_type      = 1<<5
299     };
300     typedef int TAvoidRequests;
301     TAvoidRequests m_AvoidRequest;
302 
303     struct SProcessorInfo {
304         CRef<CID2Processor> processor;
305         CRef<CID2ProcessorContext> context;
306     };
307     typedef vector<SProcessorInfo> TProcessors;
308     TProcessors m_Processors;
309 };
310 
311 
312 END_SCOPE(objects)
313 END_NCBI_SCOPE
314 
315 #endif // READER_ID2_BASE__HPP_INCLUDED
316