quickfix_ruby 1.14.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +7 -0
  2. data/ext/quickfix/Acceptor.cpp +248 -0
  3. data/ext/quickfix/Acceptor.h +127 -0
  4. data/ext/quickfix/Allocator.h +9 -0
  5. data/ext/quickfix/Application.h +127 -0
  6. data/ext/quickfix/AtomicCount.h +109 -0
  7. data/ext/quickfix/DOMDocument.h +74 -0
  8. data/ext/quickfix/DataDictionary.cpp +618 -0
  9. data/ext/quickfix/DataDictionary.h +539 -0
  10. data/ext/quickfix/DataDictionaryProvider.cpp +71 -0
  11. data/ext/quickfix/DataDictionaryProvider.h +70 -0
  12. data/ext/quickfix/DatabaseConnectionID.h +105 -0
  13. data/ext/quickfix/DatabaseConnectionPool.h +91 -0
  14. data/ext/quickfix/Dictionary.cpp +162 -0
  15. data/ext/quickfix/Dictionary.h +94 -0
  16. data/ext/quickfix/Event.h +95 -0
  17. data/ext/quickfix/Exceptions.h +299 -0
  18. data/ext/quickfix/Field.h +672 -0
  19. data/ext/quickfix/FieldConvertors.h +863 -0
  20. data/ext/quickfix/FieldMap.cpp +238 -0
  21. data/ext/quickfix/FieldMap.h +244 -0
  22. data/ext/quickfix/FieldNumbers.h +46 -0
  23. data/ext/quickfix/FieldTypes.cpp +64 -0
  24. data/ext/quickfix/FieldTypes.h +698 -0
  25. data/ext/quickfix/Fields.h +31 -0
  26. data/ext/quickfix/FileLog.cpp +200 -0
  27. data/ext/quickfix/FileLog.h +112 -0
  28. data/ext/quickfix/FileStore.cpp +332 -0
  29. data/ext/quickfix/FileStore.h +129 -0
  30. data/ext/quickfix/FixFieldNumbers.h +1537 -0
  31. data/ext/quickfix/FixFields.h +1538 -0
  32. data/ext/quickfix/FixValues.h +3281 -0
  33. data/ext/quickfix/FlexLexer.h +188 -0
  34. data/ext/quickfix/Group.cpp +64 -0
  35. data/ext/quickfix/Group.h +73 -0
  36. data/ext/quickfix/HtmlBuilder.h +186 -0
  37. data/ext/quickfix/HttpConnection.cpp +739 -0
  38. data/ext/quickfix/HttpConnection.h +78 -0
  39. data/ext/quickfix/HttpMessage.cpp +149 -0
  40. data/ext/quickfix/HttpMessage.h +133 -0
  41. data/ext/quickfix/HttpParser.cpp +49 -0
  42. data/ext/quickfix/HttpParser.h +54 -0
  43. data/ext/quickfix/HttpServer.cpp +169 -0
  44. data/ext/quickfix/HttpServer.h +78 -0
  45. data/ext/quickfix/Initiator.cpp +289 -0
  46. data/ext/quickfix/Initiator.h +149 -0
  47. data/ext/quickfix/Log.cpp +77 -0
  48. data/ext/quickfix/Log.h +179 -0
  49. data/ext/quickfix/Message.cpp +580 -0
  50. data/ext/quickfix/Message.h +370 -0
  51. data/ext/quickfix/MessageCracker.h +188 -0
  52. data/ext/quickfix/MessageSorters.cpp +105 -0
  53. data/ext/quickfix/MessageSorters.h +156 -0
  54. data/ext/quickfix/MessageStore.cpp +146 -0
  55. data/ext/quickfix/MessageStore.h +174 -0
  56. data/ext/quickfix/Mutex.h +131 -0
  57. data/ext/quickfix/MySQLConnection.h +194 -0
  58. data/ext/quickfix/MySQLLog.cpp +275 -0
  59. data/ext/quickfix/MySQLLog.h +145 -0
  60. data/ext/quickfix/MySQLStore.cpp +331 -0
  61. data/ext/quickfix/MySQLStore.h +142 -0
  62. data/ext/quickfix/NullStore.cpp +54 -0
  63. data/ext/quickfix/NullStore.h +99 -0
  64. data/ext/quickfix/OdbcConnection.h +266 -0
  65. data/ext/quickfix/OdbcLog.cpp +252 -0
  66. data/ext/quickfix/OdbcLog.h +117 -0
  67. data/ext/quickfix/OdbcStore.cpp +338 -0
  68. data/ext/quickfix/OdbcStore.h +113 -0
  69. data/ext/quickfix/PUGIXML_DOMDocument.cpp +112 -0
  70. data/ext/quickfix/PUGIXML_DOMDocument.h +81 -0
  71. data/ext/quickfix/Parser.cpp +103 -0
  72. data/ext/quickfix/Parser.h +57 -0
  73. data/ext/quickfix/PostgreSQLConnection.h +176 -0
  74. data/ext/quickfix/PostgreSQLLog.cpp +276 -0
  75. data/ext/quickfix/PostgreSQLLog.h +144 -0
  76. data/ext/quickfix/PostgreSQLStore.cpp +334 -0
  77. data/ext/quickfix/PostgreSQLStore.h +141 -0
  78. data/ext/quickfix/Queue.h +75 -0
  79. data/ext/quickfix/QuickfixRuby.cpp +252066 -0
  80. data/ext/quickfix/QuickfixRuby.h +34 -0
  81. data/ext/quickfix/Responder.h +43 -0
  82. data/ext/quickfix/Session.cpp +1487 -0
  83. data/ext/quickfix/Session.h +335 -0
  84. data/ext/quickfix/SessionFactory.cpp +274 -0
  85. data/ext/quickfix/SessionFactory.h +86 -0
  86. data/ext/quickfix/SessionID.h +170 -0
  87. data/ext/quickfix/SessionSettings.cpp +189 -0
  88. data/ext/quickfix/SessionSettings.h +171 -0
  89. data/ext/quickfix/SessionState.h +231 -0
  90. data/ext/quickfix/Settings.cpp +100 -0
  91. data/ext/quickfix/Settings.h +53 -0
  92. data/ext/quickfix/SharedArray.h +150 -0
  93. data/ext/quickfix/SocketAcceptor.cpp +222 -0
  94. data/ext/quickfix/SocketAcceptor.h +75 -0
  95. data/ext/quickfix/SocketConnection.cpp +238 -0
  96. data/ext/quickfix/SocketConnection.h +103 -0
  97. data/ext/quickfix/SocketConnector.cpp +116 -0
  98. data/ext/quickfix/SocketConnector.h +67 -0
  99. data/ext/quickfix/SocketInitiator.cpp +260 -0
  100. data/ext/quickfix/SocketInitiator.h +81 -0
  101. data/ext/quickfix/SocketMonitor.cpp +335 -0
  102. data/ext/quickfix/SocketMonitor.h +111 -0
  103. data/ext/quickfix/SocketServer.cpp +177 -0
  104. data/ext/quickfix/SocketServer.h +100 -0
  105. data/ext/quickfix/ThreadedSocketAcceptor.cpp +258 -0
  106. data/ext/quickfix/ThreadedSocketAcceptor.h +98 -0
  107. data/ext/quickfix/ThreadedSocketConnection.cpp +209 -0
  108. data/ext/quickfix/ThreadedSocketConnection.h +82 -0
  109. data/ext/quickfix/ThreadedSocketInitiator.cpp +268 -0
  110. data/ext/quickfix/ThreadedSocketInitiator.h +84 -0
  111. data/ext/quickfix/TimeRange.cpp +173 -0
  112. data/ext/quickfix/TimeRange.h +258 -0
  113. data/ext/quickfix/Utility.cpp +537 -0
  114. data/ext/quickfix/Utility.h +219 -0
  115. data/ext/quickfix/Values.h +62 -0
  116. data/ext/quickfix/config.h +0 -0
  117. data/ext/quickfix/config_windows.h +0 -0
  118. data/ext/quickfix/extconf.rb +12 -0
  119. data/ext/quickfix/index.h +37 -0
  120. data/ext/quickfix/pugiconfig.hpp +72 -0
  121. data/ext/quickfix/pugixml.cpp +10765 -0
  122. data/ext/quickfix/pugixml.hpp +1341 -0
  123. data/ext/quickfix/strptime.h +7 -0
  124. data/lib/quickfix40.rb +274 -0
  125. data/lib/quickfix41.rb +351 -0
  126. data/lib/quickfix42.rb +1184 -0
  127. data/lib/quickfix43.rb +3504 -0
  128. data/lib/quickfix44.rb +10721 -0
  129. data/lib/quickfix50.rb +13426 -0
  130. data/lib/quickfix50sp1.rb +15629 -0
  131. data/lib/quickfix50sp2.rb +17068 -0
  132. data/lib/quickfix_fields.rb +19853 -0
  133. data/lib/quickfix_ruby.rb +82 -0
  134. data/lib/quickfixt11.rb +70 -0
  135. data/spec/FIX40.xml +862 -0
  136. data/spec/FIX41.xml +1285 -0
  137. data/spec/FIX42.xml +2746 -0
  138. data/spec/FIX43.xml +4229 -0
  139. data/spec/FIX44.xml +6596 -0
  140. data/spec/FIX50.xml +8137 -0
  141. data/spec/FIX50SP1.xml +9496 -0
  142. data/spec/FIX50SP2.xml +10011 -0
  143. data/spec/FIXT11.xml +313 -0
  144. data/test/test_DataDictionaryTestCase.rb +268 -0
  145. data/test/test_DictionaryTestCase.rb +112 -0
  146. data/test/test_FieldBaseTestCase.rb +24 -0
  147. data/test/test_MessageTestCase.rb +368 -0
  148. data/test/test_SessionSettingsTestCase.rb +41 -0
  149. metadata +193 -0
@@ -0,0 +1,194 @@
1
+ /* -*- C++ -*- */
2
+
3
+ /****************************************************************************
4
+ ** Copyright (c) 2001-2014
5
+ **
6
+ ** This file is part of the QuickFIX FIX Engine
7
+ **
8
+ ** This file may be distributed under the terms of the quickfixengine.org
9
+ ** license as defined by quickfixengine.org and appearing in the file
10
+ ** LICENSE included in the packaging of this file.
11
+ **
12
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14
+ **
15
+ ** See http://www.quickfixengine.org/LICENSE for licensing information.
16
+ **
17
+ ** Contact ask@quickfixengine.org if any conditions of this licensing are
18
+ ** not clear to you.
19
+ **
20
+ ****************************************************************************/
21
+
22
+ #ifndef HAVE_MYSQL
23
+ #error MySQLConnection.h included, but HAVE_MYSQL not defined
24
+ #endif
25
+
26
+ #ifdef HAVE_MYSQL
27
+ #ifndef FIX_MYSQLCONNECTION_H
28
+ #define FIX_MYSQLCONNECTION_H
29
+
30
+ #ifdef _MSC_VER
31
+ #pragma warning( disable : 4503 4355 4786 4290 )
32
+ #pragma comment( lib, "libMySQL" )
33
+ #endif
34
+
35
+ #include <mysql.h>
36
+ #include <errmsg.h>
37
+ #include "DatabaseConnectionID.h"
38
+ #include "DatabaseConnectionPool.h"
39
+ #include "Mutex.h"
40
+
41
+ #undef MYSQL_PORT
42
+
43
+ namespace FIX
44
+ {
45
+ class MySQLQuery
46
+ {
47
+ public:
48
+ MySQLQuery( const std::string& query )
49
+ : m_result( 0 ), m_query( query )
50
+ {}
51
+
52
+ ~MySQLQuery()
53
+ {
54
+ if( m_result )
55
+ mysql_free_result( m_result );
56
+ }
57
+
58
+ bool execute( MYSQL* pConnection )
59
+ {
60
+ int retry = 0;
61
+
62
+ do
63
+ {
64
+ if( m_result ) mysql_free_result( m_result );
65
+ int errcode = mysql_query( pConnection, m_query.c_str() );
66
+ m_result = mysql_store_result( pConnection );
67
+ if( errcode == 0 )
68
+ return true;
69
+ m_status = mysql_errno( pConnection );
70
+ m_reason = mysql_error( pConnection );
71
+ mysql_ping( pConnection );
72
+ retry++;
73
+ } while( retry <= 1 );
74
+ return success();
75
+ }
76
+
77
+ bool success()
78
+ {
79
+ return m_status == 0;
80
+ }
81
+
82
+ int rows()
83
+ {
84
+ return (int)mysql_num_rows( m_result );
85
+ }
86
+
87
+ const std::string& reason()
88
+ {
89
+ return m_reason;
90
+ }
91
+
92
+ char* getValue( int row, int column )
93
+ {
94
+ if( m_rows.empty() )
95
+ {
96
+ MYSQL_ROW row = 0;
97
+ while( (row = mysql_fetch_row( m_result )) )
98
+ m_rows.push_back(row);
99
+ }
100
+ return m_rows[row][column];
101
+ }
102
+
103
+ void throwException() throw( IOException )
104
+ {
105
+ if( !success() )
106
+ throw IOException( "Query failed [" + m_query + "] " + reason() );
107
+ }
108
+
109
+ private:
110
+ MYSQL_RES* m_result;
111
+ int m_status;
112
+ std::string m_query;
113
+ std::string m_reason;
114
+ std::vector<MYSQL_ROW> m_rows;
115
+ };
116
+
117
+ class MySQLConnection
118
+ {
119
+ public:
120
+ MySQLConnection
121
+ ( const DatabaseConnectionID& id )
122
+ : m_connectionID( id )
123
+ {
124
+ connect();
125
+ }
126
+
127
+ MySQLConnection
128
+ ( const std::string& database, const std::string& user,
129
+ const std::string& password, const std::string& host, short port )
130
+ : m_connectionID( database, user, password, host, port )
131
+ {
132
+ connect();
133
+ }
134
+
135
+ ~MySQLConnection()
136
+ {
137
+ if( m_pConnection )
138
+ mysql_close( m_pConnection );
139
+ }
140
+
141
+ const DatabaseConnectionID& connectionID()
142
+ {
143
+ return m_connectionID;
144
+ }
145
+
146
+ bool connected()
147
+ {
148
+ Locker locker( m_mutex );
149
+ return mysql_ping( m_pConnection ) == 0;
150
+ }
151
+
152
+ bool reconnect()
153
+ {
154
+ Locker locker( m_mutex );
155
+ return mysql_ping( m_pConnection ) == 0;
156
+ }
157
+
158
+ bool execute( MySQLQuery& pQuery )
159
+ {
160
+ Locker locker( m_mutex );
161
+ return pQuery.execute( m_pConnection );
162
+ }
163
+
164
+ private:
165
+ void connect()
166
+ {
167
+ short port = m_connectionID.getPort();
168
+ m_pConnection = mysql_init( NULL );
169
+ if( !mysql_real_connect
170
+ ( m_pConnection, m_connectionID.getHost().c_str(), m_connectionID.getUser().c_str(),
171
+ m_connectionID.getPassword().c_str(), m_connectionID.getDatabase().c_str(), port, 0, 0 ) )
172
+ {
173
+ if( !connected() )
174
+ throw ConfigError( std::string("Unable to connect to database [") + mysql_error(m_pConnection) + "]" );
175
+ }
176
+ #if( MYSQL_VERSION_ID > 50000 )
177
+ my_bool reconnect = 1;
178
+ mysql_options( m_pConnection, MYSQL_OPT_RECONNECT, static_cast<char*>(&reconnect) );
179
+ #endif
180
+ }
181
+
182
+ MYSQL* m_pConnection;
183
+ DatabaseConnectionID m_connectionID;
184
+ Mutex m_mutex;
185
+ };
186
+
187
+ typedef DatabaseConnectionPool<MySQLConnection>
188
+ MySQLConnectionPool;
189
+ typedef std::auto_ptr< MySQLConnectionPool >
190
+ MySQLConnectionPoolPtr;
191
+ }
192
+
193
+ #endif //FIX_MYSQLCONNECTION_H
194
+ #endif //HAVE_MYSQL
@@ -0,0 +1,275 @@
1
+ /****************************************************************************
2
+ ** Copyright (c) 2001-2014
3
+ **
4
+ ** This file is part of the QuickFIX FIX Engine
5
+ **
6
+ ** This file may be distributed under the terms of the quickfixengine.org
7
+ ** license as defined by quickfixengine.org and appearing in the file
8
+ ** LICENSE included in the packaging of this file.
9
+ **
10
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
11
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
12
+ **
13
+ ** See http://www.quickfixengine.org/LICENSE for licensing information.
14
+ **
15
+ ** Contact ask@quickfixengine.org if any conditions of this licensing are
16
+ ** not clear to you.
17
+ **
18
+ ****************************************************************************/
19
+
20
+ #ifdef _MSC_VER
21
+ #include "stdafx.h"
22
+ #else
23
+ #include "config.h"
24
+ #endif
25
+
26
+ #ifdef HAVE_MYSQL
27
+
28
+ #include "MySQLLog.h"
29
+ #include "SessionID.h"
30
+ #include "SessionSettings.h"
31
+ #include "Utility.h"
32
+ #include "strptime.h"
33
+ #include <fstream>
34
+
35
+ namespace FIX
36
+ {
37
+
38
+ const std::string MySQLLogFactory::DEFAULT_DATABASE = "quickfix";
39
+ const std::string MySQLLogFactory::DEFAULT_USER = "root";
40
+ const std::string MySQLLogFactory::DEFAULT_PASSWORD = "";
41
+ const std::string MySQLLogFactory::DEFAULT_HOST = "localhost";
42
+ const short MySQLLogFactory::DEFAULT_PORT = 0;
43
+
44
+ MySQLLog::MySQLLog
45
+ ( const SessionID& s, const DatabaseConnectionID& d, MySQLConnectionPool* p )
46
+ : m_pConnectionPool( p )
47
+ {
48
+ init();
49
+ m_pSessionID = new SessionID( s );
50
+ m_pConnection = m_pConnectionPool->create( d );
51
+ }
52
+
53
+ MySQLLog::MySQLLog
54
+ ( const DatabaseConnectionID& d, MySQLConnectionPool* p )
55
+ : m_pConnectionPool( p ), m_pSessionID( 0 )
56
+ {
57
+ init();
58
+ m_pConnection = m_pConnectionPool->create( d );
59
+ }
60
+
61
+ MySQLLog::MySQLLog
62
+ ( const SessionID& s, const std::string& database, const std::string& user,
63
+ const std::string& password, const std::string& host, short port )
64
+ : m_pConnectionPool( 0 )
65
+ {
66
+ init();
67
+ m_pSessionID = new SessionID( s );
68
+ m_pConnection = new MySQLConnection( database, user, password, host, port );
69
+ }
70
+
71
+ MySQLLog::MySQLLog
72
+ ( const std::string& database, const std::string& user,
73
+ const std::string& password, const std::string& host, short port )
74
+ : m_pConnectionPool( 0 ), m_pSessionID( 0 )
75
+ {
76
+ m_pConnection = new MySQLConnection( database, user, password, host, port );
77
+ }
78
+
79
+ void MySQLLog::init()
80
+ {
81
+ setIncomingTable( "messages_log" );
82
+ setOutgoingTable( "messages_log" );
83
+ setEventTable( "event_log" );
84
+ }
85
+
86
+ MySQLLog::~MySQLLog()
87
+ {
88
+ if( m_pConnectionPool )
89
+ m_pConnectionPool->destroy( m_pConnection );
90
+ else
91
+ delete m_pConnection;
92
+ delete m_pSessionID;
93
+ }
94
+
95
+ Log* MySQLLogFactory::create()
96
+ {
97
+ std::string database;
98
+ std::string user;
99
+ std::string password;
100
+ std::string host;
101
+ short port;
102
+
103
+ init( m_settings.get(), database, user, password, host, port );
104
+ DatabaseConnectionID id( database, user, password, host, port );
105
+ MySQLLog* result = new MySQLLog( id, m_connectionPoolPtr.get() );
106
+ initLog( m_settings.get(), *result );
107
+ return result;
108
+ }
109
+
110
+ Log* MySQLLogFactory::create( const SessionID& s )
111
+ {
112
+ std::string database;
113
+ std::string user;
114
+ std::string password;
115
+ std::string host;
116
+ short port;
117
+
118
+ Dictionary settings;
119
+ if( m_settings.has(s) )
120
+ settings = m_settings.get( s );
121
+
122
+ init( settings, database, user, password, host, port );
123
+ DatabaseConnectionID id( database, user, password, host, port );
124
+ MySQLLog* result = new MySQLLog( s, id, m_connectionPoolPtr.get() );
125
+ initLog( settings, *result );
126
+ return result;
127
+ }
128
+
129
+ void MySQLLogFactory::init( const Dictionary& settings,
130
+ std::string& database,
131
+ std::string& user,
132
+ std::string& password,
133
+ std::string& host,
134
+ short &port )
135
+ {
136
+ database = DEFAULT_DATABASE;
137
+ user = DEFAULT_USER;
138
+ password = DEFAULT_PASSWORD;
139
+ host = DEFAULT_HOST;
140
+ port = DEFAULT_PORT;
141
+
142
+ if( m_useSettings )
143
+ {
144
+ try { database = settings.getString( MYSQL_LOG_DATABASE ); }
145
+ catch( ConfigError& ) {}
146
+
147
+ try { user = settings.getString( MYSQL_LOG_USER ); }
148
+ catch( ConfigError& ) {}
149
+
150
+ try { password = settings.getString( MYSQL_LOG_PASSWORD ); }
151
+ catch( ConfigError& ) {}
152
+
153
+ try { host = settings.getString( MYSQL_LOG_HOST ); }
154
+ catch( ConfigError& ) {}
155
+
156
+ try { port = ( short ) settings.getInt( MYSQL_LOG_PORT ); }
157
+ catch( ConfigError& ) {}
158
+ }
159
+ else
160
+ {
161
+ database = m_database;
162
+ user = m_user;
163
+ password = m_password;
164
+ host = m_host;
165
+ port = m_port;
166
+ }
167
+ }
168
+
169
+ void MySQLLogFactory::initLog( const Dictionary& settings, MySQLLog& log )
170
+ {
171
+ try { log.setIncomingTable( settings.getString( MYSQL_LOG_INCOMING_TABLE ) ); }
172
+ catch( ConfigError& ) {}
173
+
174
+ try { log.setOutgoingTable( settings.getString( MYSQL_LOG_OUTGOING_TABLE ) ); }
175
+ catch( ConfigError& ) {}
176
+
177
+ try { log.setEventTable( settings.getString( MYSQL_LOG_EVENT_TABLE ) ); }
178
+ catch( ConfigError& ) {}
179
+ }
180
+
181
+ void MySQLLogFactory::destroy( Log* pLog )
182
+ {
183
+ delete pLog;
184
+ }
185
+
186
+ void MySQLLog::clear()
187
+ {
188
+ std::stringstream whereClause;
189
+
190
+ whereClause << "WHERE ";
191
+
192
+ if( m_pSessionID )
193
+ {
194
+ whereClause
195
+ << "BeginString = \"" << m_pSessionID->getBeginString().getValue() << "\" "
196
+ << "AND SenderCompID = \"" << m_pSessionID->getSenderCompID().getValue() << "\" "
197
+ << "AND TargetCompID = \"" << m_pSessionID->getTargetCompID().getValue() << "\" ";
198
+
199
+ if( m_pSessionID->getSessionQualifier().size() )
200
+ whereClause << "AND SessionQualifier = \"" << m_pSessionID->getSessionQualifier() << "\"";
201
+ }
202
+ else
203
+ {
204
+ whereClause << "BeginString = NULL AND SenderCompID = NULL && TargetCompID = NULL";
205
+ }
206
+
207
+ std::stringstream incomingQuery;
208
+ std::stringstream outgoingQuery;
209
+ std::stringstream eventQuery;
210
+
211
+ incomingQuery
212
+ << "DELETE FROM " << m_incomingTable << " " << whereClause.str();
213
+ outgoingQuery
214
+ << "DELETE FROM " << m_outgoingTable << " " << whereClause.str();
215
+ eventQuery
216
+ << "DELETE FROM " << m_eventTable << " " << whereClause.str();
217
+
218
+ MySQLQuery incoming( incomingQuery.str() );
219
+ MySQLQuery outgoing( outgoingQuery.str() );
220
+ MySQLQuery event( eventQuery.str() );
221
+ m_pConnection->execute( incoming );
222
+ m_pConnection->execute( outgoing );
223
+ m_pConnection->execute( event );
224
+ }
225
+
226
+ void MySQLLog::backup()
227
+ {
228
+ }
229
+
230
+ void MySQLLog::insert( const std::string& table, const std::string value )
231
+ {
232
+ UtcTimeStamp time;
233
+ int year, month, day, hour, minute, second, millis;
234
+ time.getYMD( year, month, day );
235
+ time.getHMS( hour, minute, second, millis );
236
+
237
+ char sqlTime[ 20 ];
238
+ STRING_SPRINTF( sqlTime, "%d-%02d-%02d %02d:%02d:%02d",
239
+ year, month, day, hour, minute, second );
240
+
241
+ char* valueCopy = new char[ (value.size() * 2) + 1 ];
242
+ mysql_escape_string( valueCopy, value.c_str(), value.size() );
243
+
244
+ std::stringstream queryString;
245
+ queryString << "INSERT INTO " << table << " "
246
+ << "(time, time_milliseconds, beginstring, sendercompid, targetcompid, session_qualifier, text) "
247
+ << "VALUES ("
248
+ << "'" << sqlTime << "','" << millis << "',";
249
+
250
+ if( m_pSessionID )
251
+ {
252
+ queryString
253
+ << "\"" << m_pSessionID->getBeginString().getValue() << "\","
254
+ << "\"" << m_pSessionID->getSenderCompID().getValue() << "\","
255
+ << "\"" << m_pSessionID->getTargetCompID().getValue() << "\",";
256
+ if( m_pSessionID->getSessionQualifier() == "" )
257
+ queryString << "NULL" << ",";
258
+ else
259
+ queryString << "\"" << m_pSessionID->getSessionQualifier() << "\",";
260
+ }
261
+ else
262
+ {
263
+ queryString << "NULL, NULL, NULL, NULL, ";
264
+ }
265
+
266
+ queryString << "\"" << valueCopy << "\")";
267
+ delete [] valueCopy;
268
+
269
+ MySQLQuery query( queryString.str() );
270
+ m_pConnection->execute( query );
271
+ }
272
+
273
+ } //namespace FIX
274
+
275
+ #endif //HAVE_MYSQL
@@ -0,0 +1,145 @@
1
+ /* -*- C++ -*- */
2
+
3
+ /****************************************************************************
4
+ ** Copyright (c) 2001-2014
5
+ **
6
+ ** This file is part of the QuickFIX FIX Engine
7
+ **
8
+ ** This file may be distributed under the terms of the quickfixengine.org
9
+ ** license as defined by quickfixengine.org and appearing in the file
10
+ ** LICENSE included in the packaging of this file.
11
+ **
12
+ ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
13
+ ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
14
+ **
15
+ ** See http://www.quickfixengine.org/LICENSE for licensing information.
16
+ **
17
+ ** Contact ask@quickfixengine.org if any conditions of this licensing are
18
+ ** not clear to you.
19
+ **
20
+ ****************************************************************************/
21
+
22
+ #ifndef HAVE_MYSQL
23
+ #error MySQLLog.h included, but HAVE_MYSQL not defined
24
+ #endif
25
+
26
+ #ifdef HAVE_MYSQL
27
+ #ifndef FIX_MYSQLLOG_H
28
+ #define FIX_MYSQLLOG_H
29
+
30
+ #ifdef _MSC_VER
31
+ #pragma warning( disable : 4503 4355 4786 4290 )
32
+ #pragma comment( lib, "libMySQL" )
33
+ #endif
34
+
35
+ #include "Log.h"
36
+ #include "SessionSettings.h"
37
+ #include "MySQLConnection.h"
38
+ #include <fstream>
39
+ #include <string>
40
+
41
+ namespace FIX
42
+ {
43
+ /// MySQL based implementation of Log.
44
+ class MySQLLog : public Log
45
+ {
46
+ public:
47
+ MySQLLog( const SessionID& s, const DatabaseConnectionID& d, MySQLConnectionPool* p );
48
+ MySQLLog( const DatabaseConnectionID& d, MySQLConnectionPool* p );
49
+ MySQLLog( const SessionID& s, const std::string& database, const std::string& user,
50
+ const std::string& password, const std::string& host, short port );
51
+ MySQLLog( const std::string& database, const std::string& user,
52
+ const std::string& password, const std::string& host, short port );
53
+
54
+ ~MySQLLog();
55
+
56
+ void clear();
57
+ void backup();
58
+ void setIncomingTable( const std::string& incomingTable )
59
+ { m_incomingTable = incomingTable; }
60
+ void setOutgoingTable( const std::string& outgoingTable )
61
+ { m_outgoingTable = outgoingTable; }
62
+ void setEventTable( const std::string& eventTable )
63
+ { m_eventTable = eventTable; }
64
+
65
+ void onIncoming( const std::string& value )
66
+ { insert( m_incomingTable, value ); }
67
+ void onOutgoing( const std::string& value )
68
+ { insert( m_outgoingTable, value ); }
69
+ void onEvent( const std::string& value )
70
+ { insert( m_eventTable, value ); }
71
+
72
+ private:
73
+ void init();
74
+ void insert( const std::string& table, const std::string value );
75
+
76
+ std::string m_incomingTable;
77
+ std::string m_outgoingTable;
78
+ std::string m_eventTable;
79
+ MySQLConnection* m_pConnection;
80
+ MySQLConnectionPool* m_pConnectionPool;
81
+ SessionID* m_pSessionID;
82
+ };
83
+
84
+ /// Creates a MySQL based implementation of Log.
85
+ class MySQLLogFactory : public LogFactory
86
+ {
87
+ public:
88
+ static const std::string DEFAULT_DATABASE;
89
+ static const std::string DEFAULT_USER;
90
+ static const std::string DEFAULT_PASSWORD;
91
+ static const std::string DEFAULT_HOST;
92
+ static const short DEFAULT_PORT;
93
+
94
+ MySQLLogFactory( const SessionSettings& settings )
95
+ : m_settings( settings ), m_useSettings( true )
96
+ {
97
+ bool poolConnections = false;
98
+ try { poolConnections = settings.get().getBool(MYSQL_LOG_USECONNECTIONPOOL); }
99
+ catch( ConfigError& ) {}
100
+
101
+ m_connectionPoolPtr = MySQLConnectionPoolPtr
102
+ ( new MySQLConnectionPool(poolConnections) );
103
+ }
104
+
105
+ MySQLLogFactory( const std::string& database, const std::string& user,
106
+ const std::string& password, const std::string& host,
107
+ short port )
108
+ : m_database( database ), m_user( user ), m_password( password ), m_host( host ), m_port( port ),
109
+ m_useSettings( false )
110
+ {
111
+ m_connectionPoolPtr = MySQLConnectionPoolPtr
112
+ ( new MySQLConnectionPool(false) );
113
+ }
114
+
115
+ MySQLLogFactory()
116
+ : m_database( DEFAULT_DATABASE ), m_user( DEFAULT_USER ), m_password( DEFAULT_PASSWORD ),
117
+ m_host( DEFAULT_HOST ), m_port( DEFAULT_PORT ), m_useSettings( false )
118
+ {
119
+ m_connectionPoolPtr = MySQLConnectionPoolPtr
120
+ ( new MySQLConnectionPool(false) );
121
+ }
122
+
123
+ Log* create();
124
+ Log* create( const SessionID& );
125
+ void destroy( Log* );
126
+ private:
127
+ void init( const Dictionary& settings, std::string& database,
128
+ std::string& user, std::string& password,
129
+ std::string& host, short& port );
130
+
131
+ void initLog( const Dictionary& settings, MySQLLog& log );
132
+
133
+ MySQLConnectionPoolPtr m_connectionPoolPtr;
134
+ SessionSettings m_settings;
135
+ std::string m_database;
136
+ std::string m_user;
137
+ std::string m_password;
138
+ std::string m_host;
139
+ short m_port;
140
+ bool m_useSettings;
141
+ };
142
+ }
143
+
144
+ #endif //FIX_MYSQLLOG_H
145
+ #endif //HAVE_MYSQL