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