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,103 @@
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
+ #include "Parser.h"
27
+ #include "Utility.h"
28
+ #include "FieldConvertors.h"
29
+ #include <algorithm>
30
+
31
+ namespace FIX
32
+ {
33
+ bool Parser::extractLength( int& length, std::string::size_type& pos,
34
+ const std::string& buffer )
35
+ throw( MessageParseError )
36
+ {
37
+ if( !buffer.size() ) return false;
38
+
39
+ std::string::size_type startPos = buffer.find( "\0019=", 0 );
40
+ if( startPos == std::string::npos ) return false;
41
+ startPos += 3;
42
+ std::string::size_type endPos = buffer.find( "\001", startPos );
43
+ if( endPos == std::string::npos ) return false;
44
+
45
+ std::string strLength( buffer, startPos, endPos - startPos );
46
+
47
+ try
48
+ {
49
+ length = IntConvertor::convert( strLength );
50
+ if( length < 0 ) throw MessageParseError();
51
+ }
52
+ catch( FieldConvertError& )
53
+ { throw MessageParseError(); }
54
+
55
+ pos = endPos + 1;
56
+ return true;
57
+ }
58
+
59
+ bool Parser::readFixMessage( std::string& str )
60
+ throw( MessageParseError )
61
+ {
62
+ std::string::size_type pos = 0;
63
+
64
+ if( m_buffer.length() < 2 ) return false;
65
+ pos = m_buffer.find( "8=" );
66
+ if( pos == std::string::npos ) return false;
67
+ m_buffer.erase( 0, pos );
68
+
69
+ int length = 0;
70
+
71
+ try
72
+ {
73
+ if( extractLength(length, pos, m_buffer) )
74
+ {
75
+ pos += length;
76
+ if( m_buffer.size() < pos )
77
+ return false;
78
+
79
+ pos = m_buffer.find( "\00110=", pos-1 );
80
+ if( pos == std::string::npos ) return false;
81
+ pos += 4;
82
+ pos = m_buffer.find( "\001", pos );
83
+ if( pos == std::string::npos ) return false;
84
+ pos += 1;
85
+
86
+ str.assign( m_buffer, 0, pos );
87
+ m_buffer.erase( 0, pos );
88
+ return true;
89
+ }
90
+ }
91
+ catch( MessageParseError& e )
92
+ {
93
+ if( length > 0 )
94
+ m_buffer.erase( 0, pos + length );
95
+ else
96
+ m_buffer.erase();
97
+
98
+ throw e;
99
+ }
100
+
101
+ return false;
102
+ }
103
+ }
@@ -0,0 +1,57 @@
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 FIX_PARSER_H
23
+ #define FIX_PARSER_H
24
+
25
+ #ifdef _MSC_VER
26
+ #pragma warning( disable : 4503 4355 4786 4290 )
27
+ #endif
28
+
29
+ #include "Exceptions.h"
30
+ #include <iostream>
31
+ #include <string>
32
+
33
+ namespace FIX
34
+ {
35
+ /// Parses %FIX messages off an input stream.
36
+ class Parser
37
+ {
38
+ public:
39
+ Parser() {}
40
+ ~Parser() {}
41
+
42
+ bool extractLength( int& length, std::string::size_type& pos,
43
+ const std::string& buffer )
44
+ throw ( MessageParseError );
45
+ bool readFixMessage( std::string& str )
46
+ throw ( MessageParseError );
47
+
48
+ void addToStream( const char* str, size_t len )
49
+ { m_buffer.append( str, len ); }
50
+ void addToStream( const std::string& str )
51
+ { m_buffer.append( str ); }
52
+
53
+ private:
54
+ std::string m_buffer;
55
+ };
56
+ }
57
+ #endif //FIX_PARSER_H
@@ -0,0 +1,176 @@
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_POSTGRESQL
23
+ #error PostgreSQLConnection.h included, but HAVE_POSTGRESQL not defined
24
+ #endif
25
+
26
+ #ifdef HAVE_POSTGRESQL
27
+ #ifndef FIX_POSTGRESQLCONNECTION_H
28
+ #define FIX_POSTGRESQLCONNECTION_H
29
+
30
+ #ifdef _MSC_VER
31
+ #pragma warning( disable : 4503 4355 4786 4290 )
32
+ #pragma comment( lib, "libpq" )
33
+ #endif
34
+
35
+ #include <libpq-fe.h>
36
+ #include "DatabaseConnectionID.h"
37
+ #include "DatabaseConnectionPool.h"
38
+ #include "Mutex.h"
39
+
40
+ namespace FIX
41
+ {
42
+ class PostgreSQLQuery
43
+ {
44
+ public:
45
+ PostgreSQLQuery( const std::string& query )
46
+ : m_result( 0 ), m_query( query )
47
+ {}
48
+
49
+ ~PostgreSQLQuery()
50
+ {
51
+ if( m_result )
52
+ PQclear( m_result );
53
+ }
54
+
55
+ bool execute( PGconn* pConnection )
56
+ {
57
+ int retry = 0;
58
+
59
+ do
60
+ {
61
+ if( m_result ) PQclear( m_result );
62
+ m_result = PQexec( pConnection, m_query.c_str() );
63
+ m_status = PQresultStatus( m_result );
64
+ if( success() ) return true;
65
+ PQreset( pConnection );
66
+ retry++;
67
+ } while( retry <= 1 );
68
+ return success();
69
+ }
70
+
71
+ bool success()
72
+ {
73
+ return m_status == PGRES_TUPLES_OK
74
+ || m_status == PGRES_COMMAND_OK;
75
+ }
76
+
77
+ int rows()
78
+ {
79
+ return PQntuples( m_result );
80
+ }
81
+
82
+ char* reason()
83
+ {
84
+ return PQresultErrorMessage( m_result );
85
+ }
86
+
87
+ char* getValue( int row, int column )
88
+ {
89
+ return PQgetvalue( m_result, row, column );
90
+ }
91
+
92
+ void throwException() throw( IOException )
93
+ {
94
+ if( !success() )
95
+ throw IOException( "Query failed [" + m_query + "] " );
96
+ }
97
+
98
+ private:
99
+ PGresult* m_result;
100
+ ExecStatusType m_status;
101
+ std::string m_query;
102
+ };
103
+
104
+ class PostgreSQLConnection
105
+ {
106
+ public:
107
+ PostgreSQLConnection
108
+ ( const DatabaseConnectionID& id )
109
+ : m_connectionID( id )
110
+ {
111
+ connect();
112
+ }
113
+
114
+ PostgreSQLConnection
115
+ ( const std::string& database, const std::string& user,
116
+ const std::string& password, const std::string& host, short port )
117
+ : m_connectionID( database, user, password, host, port )
118
+ {
119
+ connect();
120
+ }
121
+
122
+ ~PostgreSQLConnection()
123
+ {
124
+ if( m_pConnection )
125
+ PQfinish( m_pConnection );
126
+ }
127
+
128
+ const DatabaseConnectionID& connectionID()
129
+ {
130
+ return m_connectionID;
131
+ }
132
+
133
+ bool connected()
134
+ {
135
+ Locker locker( m_mutex );
136
+ return PQstatus( m_pConnection ) == CONNECTION_OK;
137
+ }
138
+
139
+ bool reconnect()
140
+ {
141
+ Locker locker( m_mutex );
142
+ PQreset( m_pConnection );
143
+ return connected();
144
+ }
145
+
146
+ bool execute( PostgreSQLQuery& pQuery )
147
+ {
148
+ Locker locker( m_mutex );
149
+ return pQuery.execute( m_pConnection );
150
+ }
151
+
152
+ private:
153
+ void connect()
154
+ {
155
+ short port = m_connectionID.getPort();
156
+ m_pConnection = PQsetdbLogin
157
+ ( m_connectionID.getHost().c_str(), port == 0 ? "" : IntConvertor::convert( port ).c_str(),
158
+ "", "", m_connectionID.getDatabase().c_str(), m_connectionID.getUser().c_str(), m_connectionID.getPassword().c_str() );
159
+
160
+ if( !connected() )
161
+ throw ConfigError( "Unable to connect to database" );
162
+ }
163
+
164
+ PGconn* m_pConnection;
165
+ DatabaseConnectionID m_connectionID;
166
+ Mutex m_mutex;
167
+ };
168
+
169
+ typedef DatabaseConnectionPool<PostgreSQLConnection>
170
+ PostgreSQLConnectionPool;
171
+ typedef std::auto_ptr< PostgreSQLConnectionPool >
172
+ PostgreSQLConnectionPoolPtr;
173
+ }
174
+
175
+ #endif //FIX_POSTGRESQLCONNECTION_H
176
+ #endif //HAVE_POSTGRESQL
@@ -0,0 +1,276 @@
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_POSTGRESQL
27
+
28
+ #include "PostgreSQLLog.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 PostgreSQLLogFactory::DEFAULT_DATABASE = "quickfix";
39
+ const std::string PostgreSQLLogFactory::DEFAULT_USER = "postgres";
40
+ const std::string PostgreSQLLogFactory::DEFAULT_PASSWORD = "";
41
+ const std::string PostgreSQLLogFactory::DEFAULT_HOST = "localhost";
42
+ const short PostgreSQLLogFactory::DEFAULT_PORT = 0;
43
+
44
+ PostgreSQLLog::PostgreSQLLog
45
+ ( const SessionID& s, const DatabaseConnectionID& d, PostgreSQLConnectionPool* p )
46
+ : m_pConnectionPool( p )
47
+ {
48
+ init();
49
+ m_pSessionID = new SessionID( s );
50
+ m_pConnection = m_pConnectionPool->create( d );
51
+ }
52
+
53
+ PostgreSQLLog::PostgreSQLLog
54
+ ( const DatabaseConnectionID& d, PostgreSQLConnectionPool* p )
55
+ : m_pConnectionPool( p ), m_pSessionID( 0 )
56
+ {
57
+ init();
58
+ m_pConnection = m_pConnectionPool->create( d );
59
+ }
60
+
61
+ PostgreSQLLog::PostgreSQLLog
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 PostgreSQLConnection( database, user, password, host, port );
69
+ }
70
+
71
+ PostgreSQLLog::PostgreSQLLog
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
+ init();
77
+ m_pConnection = new PostgreSQLConnection( database, user, password, host, port );
78
+ }
79
+
80
+ void PostgreSQLLog::init()
81
+ {
82
+ setIncomingTable( "messages_log" );
83
+ setOutgoingTable( "messages_log" );
84
+ setEventTable( "event_log" );
85
+ }
86
+
87
+ PostgreSQLLog::~PostgreSQLLog()
88
+ {
89
+ if( m_pConnectionPool )
90
+ m_pConnectionPool->destroy( m_pConnection );
91
+ else
92
+ delete m_pConnection;
93
+ delete m_pSessionID;
94
+ }
95
+
96
+ Log* PostgreSQLLogFactory::create()
97
+ {
98
+ std::string database;
99
+ std::string user;
100
+ std::string password;
101
+ std::string host;
102
+ short port;
103
+
104
+ init( m_settings.get(), database, user, password, host, port );
105
+ DatabaseConnectionID id( database, user, password, host, port );
106
+ PostgreSQLLog* result = new PostgreSQLLog( id, m_connectionPoolPtr.get() );
107
+ initLog( m_settings.get(), *result );
108
+ return result;
109
+ }
110
+
111
+ Log* PostgreSQLLogFactory::create( const SessionID& s )
112
+ {
113
+ std::string database;
114
+ std::string user;
115
+ std::string password;
116
+ std::string host;
117
+ short port;
118
+
119
+ Dictionary settings;
120
+ if( m_settings.has(s) )
121
+ settings = m_settings.get( s );
122
+
123
+ init( settings, database, user, password, host, port );
124
+ DatabaseConnectionID id( database, user, password, host, port );
125
+ PostgreSQLLog* result = new PostgreSQLLog( s, id, m_connectionPoolPtr.get() );
126
+ initLog( settings, *result );
127
+ return result;
128
+ }
129
+
130
+ void PostgreSQLLogFactory::init( const Dictionary& settings,
131
+ std::string& database,
132
+ std::string& user,
133
+ std::string& password,
134
+ std::string& host,
135
+ short &port )
136
+ {
137
+ database = DEFAULT_DATABASE;
138
+ user = DEFAULT_USER;
139
+ password = DEFAULT_PASSWORD;
140
+ host = DEFAULT_HOST;
141
+ port = DEFAULT_PORT;
142
+
143
+ if( m_useSettings )
144
+ {
145
+ try { database = settings.getString( POSTGRESQL_LOG_DATABASE ); }
146
+ catch( ConfigError& ) {}
147
+
148
+ try { user = settings.getString( POSTGRESQL_LOG_USER ); }
149
+ catch( ConfigError& ) {}
150
+
151
+ try { password = settings.getString( POSTGRESQL_LOG_PASSWORD ); }
152
+ catch( ConfigError& ) {}
153
+
154
+ try { host = settings.getString( POSTGRESQL_LOG_HOST ); }
155
+ catch( ConfigError& ) {}
156
+
157
+ try { port = ( short ) settings.getInt( POSTGRESQL_LOG_PORT ); }
158
+ catch( ConfigError& ) {}
159
+ }
160
+ else
161
+ {
162
+ database = m_database;
163
+ user = m_user;
164
+ password = m_password;
165
+ host = m_host;
166
+ port = m_port;
167
+ }
168
+ }
169
+
170
+ void PostgreSQLLogFactory::initLog( const Dictionary& settings, PostgreSQLLog& log )
171
+ {
172
+ try { log.setIncomingTable( settings.getString( POSTGRESQL_LOG_INCOMING_TABLE ) ); }
173
+ catch( ConfigError& ) {}
174
+
175
+ try { log.setOutgoingTable( settings.getString( POSTGRESQL_LOG_OUTGOING_TABLE ) ); }
176
+ catch( ConfigError& ) {}
177
+
178
+ try { log.setEventTable( settings.getString( POSTGRESQL_LOG_EVENT_TABLE ) ); }
179
+ catch( ConfigError& ) {}
180
+ }
181
+
182
+ void PostgreSQLLogFactory::destroy( Log* pLog )
183
+ {
184
+ delete pLog;
185
+ }
186
+
187
+ void PostgreSQLLog::clear()
188
+ {
189
+ std::stringstream whereClause;
190
+
191
+ whereClause << "WHERE ";
192
+
193
+ if( m_pSessionID )
194
+ {
195
+ whereClause
196
+ << "BeginString = '" << m_pSessionID->getBeginString().getValue() << "' "
197
+ << "AND SenderCompID = '" << m_pSessionID->getSenderCompID().getValue() << "' "
198
+ << "AND TargetCompID = '" << m_pSessionID->getTargetCompID().getValue() << "' ";
199
+
200
+ if( m_pSessionID->getSessionQualifier().size() )
201
+ whereClause << "AND SessionQualifier = '" << m_pSessionID->getSessionQualifier() << "'";
202
+ }
203
+ else
204
+ {
205
+ whereClause << "BeginString = NULL AND SenderCompID = NULL && TargetCompID = NULL";
206
+ }
207
+
208
+ std::stringstream incomingQuery;
209
+ std::stringstream outgoingQuery;
210
+ std::stringstream eventQuery;
211
+
212
+ incomingQuery
213
+ << "DELETE FROM " << m_incomingTable << " " << whereClause.str();
214
+ outgoingQuery
215
+ << "DELETE FROM " << m_outgoingTable << " " << whereClause.str();
216
+ eventQuery
217
+ << "DELETE FROM " << m_eventTable << " " << whereClause.str();
218
+
219
+ PostgreSQLQuery incoming( incomingQuery.str() );
220
+ PostgreSQLQuery outgoing( outgoingQuery.str() );
221
+ PostgreSQLQuery event( eventQuery.str() );
222
+ m_pConnection->execute( incoming );
223
+ m_pConnection->execute( outgoing );
224
+ m_pConnection->execute( event );
225
+ }
226
+
227
+ void PostgreSQLLog::backup()
228
+ {
229
+ }
230
+
231
+ void PostgreSQLLog::insert( const std::string& table, const std::string value )
232
+ {
233
+ UtcTimeStamp time;
234
+ int year, month, day, hour, minute, second, millis;
235
+ time.getYMD( year, month, day );
236
+ time.getHMS( hour, minute, second, millis );
237
+
238
+ char sqlTime[ 24 ];
239
+ STRING_SPRINTF( sqlTime, "%d-%02d-%02d %02d:%02d:%02d.%003d",
240
+ year, month, day, hour, minute, second, millis );
241
+
242
+ char* valueCopy = new char[ (value.size() * 2) + 1 ];
243
+ PQescapeString( valueCopy, value.c_str(), value.size() );
244
+
245
+ std::stringstream queryString;
246
+ queryString << "INSERT INTO " << table << " "
247
+ << "(time, beginstring, sendercompid, targetcompid, session_qualifier, text) "
248
+ << "VALUES ("
249
+ << "'" << sqlTime << "',";
250
+
251
+ if( m_pSessionID )
252
+ {
253
+ queryString
254
+ << "'" << m_pSessionID->getBeginString().getValue() << "',"
255
+ << "'" << m_pSessionID->getSenderCompID().getValue() << "',"
256
+ << "'" << m_pSessionID->getTargetCompID().getValue() << "',";
257
+ if( m_pSessionID->getSessionQualifier() == "" )
258
+ queryString << "NULL" << ",";
259
+ else
260
+ queryString << "'" << m_pSessionID->getSessionQualifier() << "',";
261
+ }
262
+ else
263
+ {
264
+ queryString << "NULL, NULL, NULL, NULL, ";
265
+ }
266
+
267
+ queryString << "'" << valueCopy << "')";
268
+ delete [] valueCopy;
269
+
270
+ PostgreSQLQuery query( queryString.str() );
271
+ m_pConnection->execute( query );
272
+ }
273
+
274
+ } // namespace FIX
275
+
276
+ #endif //HAVE_POSTGRESQL