1 #ifndef PUBSEQ_GATEWAY_UTILS__HPP 2 #define PUBSEQ_GATEWAY_UTILS__HPP 3 4 /* $Id: pubseq_gateway_utils.hpp 629837 2021-04-22 12:47:49Z ivanov $ 5 * =========================================================================== 6 * 7 * PUBLIC DOMAIN NOTICE 8 * National Center for Biotechnology Information 9 * 10 * This software/database is a "United States Government Work" under the 11 * terms of the United States Copyright Act. It was written as part of 12 * the author's official duties as a United States Government employee and 13 * thus cannot be copyrighted. This software/database is freely available 14 * to the public for use. The National Library of Medicine and the U.S. 15 * Government have not placed any restriction on its use or reproduction. 16 * 17 * Although all reasonable efforts have been taken to ensure the accuracy 18 * and reliability of the software and data, the NLM and the U.S. 19 * Government do not and cannot warrant the performance or results that 20 * may be obtained by using this software or data. The NLM and the U.S. 21 * Government disclaim all warranties, express or implied, including 22 * warranties of performance, merchantability or fitness for any particular 23 * purpose. 24 * 25 * Please cite the author in any work or product based on this material. 26 * 27 * =========================================================================== 28 * 29 * Authors: Sergey Satskiy 30 * 31 * File Description: 32 * 33 */ 34 35 #include <corelib/request_status.hpp> 36 #include <corelib/ncbidiag.hpp> 37 #include <connect/services/json_over_uttp.hpp> 38 #include <objtools/pubseq_gateway/impl/cassandra/blob_record.hpp> 39 #include <objtools/pubseq_gateway/impl/cassandra/bioseq_info/record.hpp> 40 41 #include "pubseq_gateway_types.hpp" 42 #include "psgs_request.hpp" 43 44 USING_NCBI_SCOPE; 45 USING_IDBLOB_SCOPE; 46 47 #include <string> 48 #include <chrono> 49 using namespace std; 50 51 class CPSGS_Request; 52 class CPSGS_Reply; 53 54 55 // Used to report errors like bad request or LMDB cache error from a lower 56 // level code to an upper one. 57 struct SResolveInputSeqIdError 58 { SResolveInputSeqIdErrorSResolveInputSeqIdError59 SResolveInputSeqIdError() : 60 m_ErrorCode(CRequestStatus::e200_Ok) 61 {} 62 63 SResolveInputSeqIdError(const SResolveInputSeqIdError &) = default; 64 SResolveInputSeqIdError(SResolveInputSeqIdError &&) = default; 65 SResolveInputSeqIdError & operator=(const SResolveInputSeqIdError &) = default; 66 SResolveInputSeqIdError & operator=(SResolveInputSeqIdError &&) = default; 67 68 HasErrorSResolveInputSeqIdError69 bool HasError(void) const 70 { 71 return !m_ErrorMessage.empty(); 72 } 73 ResetSResolveInputSeqIdError74 void Reset(void) 75 { 76 m_ErrorMessage.clear(); 77 m_ErrorCode = CRequestStatus::e200_Ok; 78 } 79 80 string m_ErrorMessage; 81 CRequestStatus::ECode m_ErrorCode; 82 }; 83 84 85 86 87 struct SBioseqResolution 88 { SBioseqResolutionSBioseqResolution89 SBioseqResolution() : 90 m_ResolutionResult(ePSGS_NotResolved), 91 m_CassQueryCount(0), 92 m_AdjustmentTried(false), 93 m_AccessionAdjustmentResult(ePSGS_NotRequired) 94 {} 95 96 SBioseqResolution(const SBioseqResolution &) = default; 97 SBioseqResolution(SBioseqResolution &&) = default; 98 SBioseqResolution & operator=(const SBioseqResolution &) = default; 99 SBioseqResolution & operator=(SBioseqResolution &&) = default; 100 101 IsValidSBioseqResolution102 bool IsValid(void) const 103 { 104 return m_ResolutionResult != ePSGS_NotResolved; 105 } 106 ResetSBioseqResolution107 void Reset(void) 108 { 109 m_ResolutionResult = ePSGS_NotResolved; 110 m_BioseqInfo.Reset(); 111 112 m_AdjustmentTried = false; 113 m_AccessionAdjustmentResult = ePSGS_NotRequired; 114 m_AdjustmentError.clear(); 115 } 116 117 EPSGS_AccessionAdjustmentResult 118 AdjustAccession(shared_ptr<CPSGS_Request> request, 119 shared_ptr<CPSGS_Reply> reply); 120 121 EPSGS_ResolutionResult m_ResolutionResult; 122 size_t m_CassQueryCount; 123 124 // In case of the SI2CSI the only key fields are filled 125 CBioseqInfoRecord m_BioseqInfo; 126 127 // It could be a parsing error, retrieval error etc. 128 SResolveInputSeqIdError m_Error; 129 130 // The accession adjustment should happened exactly once so the results 131 // of the call are saved for the use on the other stages 132 bool m_AdjustmentTried; 133 EPSGS_AccessionAdjustmentResult m_AccessionAdjustmentResult; 134 string m_AdjustmentError; 135 }; 136 137 138 139 // Bioseq messages 140 string GetBioseqInfoHeader(size_t item_id, 141 const string & processor_id, 142 size_t bioseq_info_size, 143 SPSGS_ResolveRequest::EPSGS_OutputFormat output_format); 144 string GetBioseqMessageHeader(size_t item_id, 145 const string & processor_id, 146 size_t msg_size, 147 CRequestStatus::ECode status, 148 int code, 149 EDiagSev severity); 150 string GetBioseqCompletionHeader(size_t item_id, 151 const string & processor_id, 152 size_t chunk_count); 153 154 // Blob prop messages 155 string GetBlobPropHeader(size_t item_id, 156 const string & processor_id, 157 const string & blob_id, 158 size_t blob_prop_size, 159 CBlobRecord::TTimestamp last_modified=-1); 160 string GetBlobPropMessageHeader(size_t item_id, 161 const string & processor_id, 162 size_t msg_size, 163 CRequestStatus::ECode status, 164 int code, 165 EDiagSev severity); 166 string GetBlobPropCompletionHeader(size_t item_id, 167 const string & processor_id, 168 size_t chunk_count); 169 string GetTSEBlobPropHeader(size_t item_id, 170 const string & processor_id, 171 int64_t id2_chunk, 172 const string & id2_info, 173 size_t blob_prop_size); 174 string GetTSEBlobPropMessageHeader(size_t item_id, 175 const string & processor_id, 176 int64_t id2_chunk, 177 const string & id2_info, 178 size_t msg_size, 179 CRequestStatus::ECode status, 180 int code, 181 EDiagSev severity); 182 string GetTSEBlobPropCompletionHeader(size_t item_id, 183 const string & processor_id, 184 size_t chunk_count); 185 186 // Blob chunk messages 187 string GetBlobChunkHeader(size_t item_id, 188 const string & processor_id, 189 const string & blob_id, 190 size_t chunk_size, 191 size_t chunk_number, 192 CBlobRecord::TTimestamp last_modified=-1); 193 string GetBlobCompletionHeader(size_t item_id, 194 const string & processor_id, 195 size_t chunk_count); 196 string GetBlobMessageHeader(size_t item_id, 197 const string & processor_id, 198 const string & blob_id, 199 size_t msg_size, 200 CRequestStatus::ECode status, 201 int code, 202 EDiagSev severity, 203 CBlobRecord::TTimestamp last_modified=-1); 204 string GetBlobExcludeHeader(size_t item_id, 205 const string & processor_id, 206 const string & blob_id, 207 EPSGS_BlobSkipReason skip_reason, 208 CBlobRecord::TTimestamp last_modified=-1); 209 string GetTSEBlobExcludeHeader(size_t item_id, 210 const string & processor_id, 211 int64_t id2_chunk, 212 const string & id2_info, 213 EPSGS_BlobSkipReason skip_reason); 214 string GetTSEBlobChunkHeader(size_t item_id, 215 const string & processor_id, 216 size_t chunk_size, 217 size_t chunk_number, 218 int64_t id2_chunk, 219 const string & id2_info); 220 string GetTSEBlobMessageHeader(size_t item_id, 221 const string & processor_id, 222 int64_t id2_chunk, 223 const string & id2_info, 224 size_t msg_size, 225 CRequestStatus::ECode status, 226 int code, 227 EDiagSev severity); 228 string GetTSEBlobCompletionHeader(size_t item_id, 229 const string & processor_id, 230 size_t chunk_count); 231 232 // Named annotation messages 233 string GetNamedAnnotationHeader(size_t item_id, 234 const string & processor_id, 235 const string & annot_name, 236 size_t annotation_size); 237 string GetNamedAnnotationMessageHeader(size_t item_id, 238 const string & processor_id, 239 size_t msg_size, 240 CRequestStatus::ECode status, 241 int code, 242 EDiagSev severity); 243 string GetNamedAnnotationMessageCompletionHeader(size_t item_id, 244 const string & processor_id, 245 size_t chunk_count); 246 string GetNamedAnnotationCompletionHeader(size_t item_id, 247 const string & processor_id, 248 size_t chunk_count); 249 250 251 // Reply messages 252 string GetReplyCompletionHeader(size_t chunk_count); 253 string GetReplyMessageHeader(size_t msg_size, 254 CRequestStatus::ECode status, int code, 255 EDiagSev severity); 256 257 // Processor messages 258 string GetProcessorMessageHeader(size_t item_id, 259 const string & processor_id, 260 size_t msg_size, 261 CRequestStatus::ECode status, 262 int code, 263 EDiagSev severity); 264 string GetProcessorMessageCompletionHeader(size_t item_id, 265 const string & processor_id, 266 size_t chunk_count); 267 268 // Public comments 269 string GetPublicCommentHeader(size_t item_id, 270 const string & processor_id, 271 const string & blob_id, 272 CBlobRecord::TTimestamp last_modified, 273 size_t msg_size); 274 string GetPublicCommentHeader(size_t item_id, 275 const string & processor_id, 276 int64_t id2_chunk, 277 const string & id2_info, 278 size_t msg_size); 279 string GetPublicCommentCompletionHeader(size_t item_id, 280 const string & processor_id, 281 size_t chunk_count); 282 283 284 // Reset the request context if necessary 285 class CRequestContextResetter 286 { 287 public: 288 CRequestContextResetter(); 289 ~CRequestContextResetter(); 290 291 private: 292 bool m_NeedReset; 293 }; 294 295 296 string FormatPreciseTime(const chrono::system_clock::time_point & t_point); 297 string GetCassStartupDataStateMessage(EPSGS_StartupDataState state); 298 299 #endif 300