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