fintp_routingengine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RoutingDbOp.h
Go to the documentation of this file.
1 /*
2 * FinTP - Financial Transactions Processing Application
3 * Copyright (C) 2013 Business Information Systems (Allevo) S.R.L.
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>
17 * or contact Allevo at : 031281 Bucuresti, 23C Calea Vitan, Romania,
18 * phone +40212554577, office@allevo.ro <mailto:office@allevo.ro>, www.allevo.ro.
19 */
20 
21 #ifndef ROUTINGDBOP_H
22 #define ROUTINGDBOP_H
23 
24 #include "RoutingEngineMain.h"
25 #include "DatabaseProvider.h"
26 #include "Database.h"
27 #include "RoutingStructures.h"
29 
31 {
32 #if defined( TESTDLL_EXPORT ) || defined ( TESTDLL_IMPORT )
33  friend class DbTestsUtil;
34 #endif
35 
36  friend class RoutingEngine;
37  friend class RoutingSchema;
38 
39  private :
40 
41  // default .ctor is private ( no instance required )
42  RoutingDbOp();
43 
44  static void Initialize();
45 
46  static pthread_once_t DatabaseKeysCreate;
47  static pthread_key_t DataKey;
48  static pthread_key_t ConfigKey;
49 
50  static void CreateKeys();
51  static void DeleteData( void* data );
52  static void DeleteConfig( void* data );
53 
54  static DatabaseProviderFactory *m_DatabaseProvider;
55 
56  static Database* getData();
57  static Database* getConfig();
58  static DatabaseProviderFactory* getProvider() { return m_DatabaseProvider; }
59 
60  static void createProvider( const NameValueCollection& configSection );
61 
62  static map< long, RoutingQueue >* m_QueueIdCache;
63  static map< string, string >* m_ReplyQueueCache;
64  static map< string, string >* m_DuplicateQueueCache;
65  static map< string, string >* m_DuplicateReplyQueueCache;
66  static map< string, string >* m_DelayedReplyQueueCache;
67 
68  static pthread_mutex_t m_SyncRoot;
69 
70  static ConnectionString m_ConfigConnectionString;
71  static ConnectionString m_DataConnectionString;
72 
73  // fill queues cache
74  static void GetQueues();
75 
76  public:
78  {
81  Sepa_Sts_Reply
82  };
83  // destructor
84  ~RoutingDbOp();
85  static void Terminate();
86  static void TerminateSelf();
87 
88  // static methods
89  static void SetConfigDataSection( const NameValueCollection& dataSection );
90  static void SetConfigCfgSection( const NameValueCollection& cfgSection );
91 
92  static bool isConnected();
93 
94  // configs
95  static string GetActiveRoutingSchemaName();
96  static DataSet* GetActiveRoutingSchemas();
97  static DataSet* ReadRoutingRules( const string& schemaName );
98  static DataSet* ReadRoutingRule( const long ruleId );
99 
100  // cot
101  static DataSet* GetCOTMarkers();
102 
103  // archiving
104  static unsigned long Archive();
105 
106  // routing jobs
107  static DataSet* GetRoutingJob( const string& jobId );
108  static DataSet* ReadJobParams( const string& jobId );
109  static void CommitJob( const string& jobId, const bool isolate = true );
110  static void AbortJob( const string& jobId );
111  static void RollbackJob( const string& jobId );
112  static void DeferJob( const string& jobId, const long deferedQueue, const string& routingPoint, const string& function, const int userId );
113  static void ResumeJobs( const long deferedQueue );
114  static void InsertJob( const string& jobId, const string& routingPoint, const string& function, const int userId );
115  //static void AddRoutingJob( const string routingPoint, const string routingKey, const string routingFunc );
116 
117  // batching
118  static BatchManagerBase::BATCH_STATUS BatchJob( const string& jobId, const string& sequence,
119  const string& batchId, const string& correlId, const string& feedback, const string& xformItem, const string& amountBDP, const string& amountADP );
120  static BatchManagerBase::BATCH_STATUS GetBatchStatus( const string& batchId, const string& batchUID, string& comBatchId, const int userId,
121  const unsigned long batchCount, const string& batchAmount, const long serviceId, const string& routingPoint );
122  static void UpdateBatchCode( const string& batchId, const string& code );
123 
124  static void TerminateBatch( const string& batchId, const string& batchType, const BatchManagerBase::BATCH_STATUS status, const string& reason );
125  static void TerminateRapidBatch( const string& batchId, const int userId, const string& tableName, const string& responder );
126  //static DataSet* GetBatchJobs( const string batchId );
127  static unsigned long GetBatchCount( const string& batchId ){ return 0; }
128  static DataSet* GetBatchMessages( const string& batchId, const bool isReply, const string& issuer, int ddbtSettledReply = 0 );
129  static DataSet* GetBatchMessages( const string& batchId, const string& tableName, const string& spName = "GetMessagesInAssembly" );
130  static DataSet* GetBatchPart( const int userId, const string& receiver, const int serviceId, const string& queue );
131  static void RemoveBatchMessages( const string& batchId, const string& tableName, const string& spName = "DeleteMessagesInAssembly" );
132  static void UpdateOriginalBatchMessages( const string& batchid, const string& code = RoutingMessageEvaluator::FEEDBACKFTP_REFUSE );
133  static string GetBatchType( const string& batchId, const string& tableName = "BATCHJOBS", const string& sender = "" );
134  static void InsertIncomingBatch( const string& batchId, const string& messageId, const string& messageNamespace );
135  static string GetOriginalRef( const string& reference, const string& batchId );
136 
137  // message functions
138  static DataSet* GetRoutingMessage( const string& tableName, const string& messageId );
139  /*static void MoveRoutingMessage( string sourceTable, string destTable, string messageId );*/
140  static void MoveRoutingMessage( const string& sourceTable, const string& destTable, const string& messageId,
141  const string& payload, const string& batchId, const string& correlationId, const string& sessionId,
142  const string& requestorService, const string& responderService, const string& requestType,
143  const unsigned long priority, const short holdstatus, const long sequence, const string& feedback );
144  /*Only replies are truly deleted, other messages are only marked as deleted*/
145  static void DeleteRoutingMessage( const string& tableName, const string& messageId, bool isReply = false );
146  static void InsertRoutingMessage( const string& tableName, const string& messageId, const string& payload, const string& batchId,
147  const string& correlationId, const string& sessionId, const string& requestorService, const string& responderService,
148  const string& requestType, const unsigned long priority, const short holdstatus, const long sequence, const string& feedback );
149  static void UpdateRoutingMessage( const string& tableName, const string& messageId, const string& payload, const string& batchId,
150  const string& correlationId, const string& sessionId, const string& requestorService, const string& responderService,
151  const string& requestType, unsigned long priority, short holdstatus, long sequence, const string& feedback );
152  static string GetOriginalPayload( const string& correlationId );
153  static string GetOriginalMessageId( const string& correlationId );
154 
155  //reports support
156  static void InsertBusinessMessage( const string& messageType, const string& senderApp, const string& receiverApp, const string& messageId, const string& correlationId, const vector<string>& keywords, const vector<string>& keywordValues );
157  static void InsertBusinessMessage( const string& messageId, const string& correlationId, int crtQueue, const string& messageType,
158  const string& senderBIC, const string& receiverBIC, const string& currDate, const string& currType, const string& currAmmount,
159  const string& senderApp, const string& receiverApp, const string& trn, const string& relref, const string& mur,
160  const string& iban, const string& ibanpl, const string& senderCorr, const string& receiverCorr, const int userid,
161  const string& edToEdId, const string& orgInstrId, const string& orgTxId, const string& addMsgInf );
162  static void UpdateBusinessMessageResponder( const string& messageId, const string& receiverApp );
163  static void UpdateBusinessMessageUserId( const string& correlationId, const int userId );
164  static void UpdateBusinessMessageValueDate( const string& correlationId, const string& newDate );
165  static void UpdateBusinessMessageAck( const string& id, bool batch );
166  static void UpdateLiquidities( const string& correlationId );
167  static void UpdateBMAssembleResponder( const string& batchId, const string& receiverApp );
168 
169  //aggregation
170  static bool AggregationRequestOp( const string& aggregationTable, const RoutingAggregationCode& request, bool& trim );
171  static void InsertAggregationRequest( const string& aggregationTable, const RoutingAggregationCode& request );
172  static bool UpdateAggregationRequest( const string& aggregationTable, const RoutingAggregationCode& request, bool trim = false );
173  static bool GetAggregationFields( const string& aggregationTable, RoutingAggregationCode& request, bool trim = false );
174 
175  static string GetReplyQueue( const string& senderApp );
176  static string GetDuplicateQueue( const string& senderApp );
177  static string GetDuplicateReplyQueue( const string& senderApp );
178  static string GetDelayedReplyQueue( const string& senderApp );
179 
180  //keywords
181  static DataSet* GetKeywordMappings();
182  static DataSet* GetKeywords();
183 
184  // services - duplicate detection
185  static map< string, bool > GetDuplicateServices();
186  static int GetDuplicates( const string& service, const string& messageId );
187  static void PurgeHashes( const int hours );
188  static unsigned int GetNextSequence( const long serviceId );
189 
190  //queue functions
191  static string GetQueueName( const long queueId );
192  static long GetQueueId( const string& queueName );
193  static RoutingQueue& GetQueue( const long queueId );
194  static RoutingQueue& GetQueue( const string& queueName );
195  static void ChangeQueueHoldStatus( const string& queueName, const bool holdStatus );
196 
197  static map< long, RoutingQueue >* GetQueueCache()
198  {
199  if ( m_QueueIdCache == NULL )
200  throw runtime_error( "Unable to obtain queue definitions from the database [queue cache empty]" );
201  return m_QueueIdCache;
202  }
203 
204  static map< string, string >* GetReplyQueueCache()
205  {
206  if ( m_ReplyQueueCache == NULL )
207  throw runtime_error( "Unable to obtain reply queue definitions from the database [reply queue cache empty]" );
208  return m_ReplyQueueCache;
209  }
210 
211  static map< string, string >* GetDuplicateQueueCache()
212  {
213  if ( m_DuplicateQueueCache == NULL )
214  throw runtime_error( "Unable to obtain duplicate queue definitions from the database [duplicate queue cache empty]" );
215  return m_DuplicateQueueCache;
216  }
217 
218  static map< string, string >* GetDuplicateReplyQueueCache()
219  {
220  if ( m_DuplicateReplyQueueCache == NULL )
221  throw runtime_error( "Unable to obtain duplicate replies queue definitions, from the database [duplicate reply queue cache empty]" );
222  return m_DuplicateQueueCache;
223  }
224 
225  static map< string, string >* GetDelayedReplyQueueCache()
226  {
227  if ( m_DelayedReplyQueueCache == NULL )
228  throw runtime_error( "Unable to obtain delayed replies queue definitions, from the database [delayed reply queue cache empty]" );
229  return m_DelayedReplyQueueCache;
230  }
231 
232  // call runtime procedures
233  // SP signature : procName( messageId in varchar2, result out number )
234  // returns true if result>0, false otherwise
235  static bool CallBoolProcedure( const string& procName, const string& messageId, const string& messageTable );
236  static DataSet* GetDelayedMessages( const string& tableName, const string& tokenId );
237  static void UpdateDelayedId( const string& tableName, const string& messageId, const string& delayedId );
238  static DataSet* GetEnrichData( const string& tableName, const string& filterId );
239 };
240 #endif