【QuickFIX】03 送受信ログをMySQLに保存

＜前 [【QuickFIX】02 ログイン時にPassword(554)を送信](https://qiita.com/nobu-maple/items/649f1fd2525523f12064)
次＞ [【QuickFIX】04 情報保存用にMySQLコネクションを保持..他](https://qiita.com/nobu-maple/items/cfe505ad984e16d46af9)

サーバとの通信内容をDBに保存できるようにします。
（デフォルトではローカルファイルに出力してました）


##クライアントソースファイル
```cpp:tradeclient.cpp
@@ -1,9 +1,9 @@
 #include "config.h"

-#include "quickfix/FileStore.h"
 #include "quickfix/SocketInitiator.h"
 #include "quickfix/SessionSettings.h"
-#include "quickfix/Log.h"
+#include "quickfix/MySQLStore.h"
+#include "quickfix/MySQLLog.h"
 #include "Application.h"
 #include <string>
 #include <iostream>
@@ -26,8 +26,8 @@ int main( int argc, char** argv )
     FIX::SessionSettings settings( file );

     Application application( settings );
-    FIX::FileStoreFactory storeFactory( settings );
-    FIX::ScreenLogFactory logFactory( settings );
+    FIX::MySQLStoreFactory storeFactory( settings );
+    FIX::MySQLLogFactory logFactory( settings );
     FIX::SocketInitiator initiator( application, storeFactory, settings, logFactory );

     initiator.start();
```

保存先をMySQLに変更





##設定ファイルにMySQLログイン設定を追加
```bash:tradeclient.cfg
[DEFAULT]
ConnectionType=initiator
ReconnectInterval=60
FileStorePath=store
FileLogPath=log
StartTime=00:00:00
EndTime=00:00:00
UseDataDictionary=Y
DataDictionary=FIX44.xml
HttpAcceptPort=9911

ValidateUserDefinedFields=N
ResetOnLogout=Y
ResetOnLogon=Y

# -- MySQL Store ----
MySQLStoreDatabase=Quick
MySQLStoreUser=QuickUSER
MySQLStorePassword=QuickPASS
MySQLStoreHost=localhost

# -- MySQL Log ------
MySQLLogDatabase=Quick
MySQLLogUser=QuickUSER
MySQLLogPassword=QuickPASS
MySQLLogHost=localhost

[SESSION]
BeginString=FIX.4.4
SenderCompID=CAXDemo_Account_Trd
TargetCompID=CNX
SocketConnectHost=127.0.0.1
SocketConnectPort=9999
HeartBtInt=30
Password=Pass1234
SessionType=Trade

[SESSION]
BeginString=FIX.4.4
SenderCompID=CAXDemo_Account_Str
TargetCompID=CNX
SocketConnectHost=127.0.0.1
SocketConnectPort=9999
HeartBtInt=30
Password=Pass1234
SessionType=Ratefeed
```





##MySQLLOGヘッダーファイル
```
tradeclient]$ cd ../../src/C++/
```

quickfix 本体側で保存するログの「送信」と「受信」の見分けがつくように改造しときます
送信と受信を同じテーブルに保存する場合、見分けがつかなくなっちゃうんですよね。。
困るので改造です（フラグ立てて見分けがつくようにしときます）

```cpp:MySQLLog.h
@@ -63,15 +63,15 @@ public:
   { m_eventTable = eventTable; }

   void onIncoming( const std::string& value )
-  { insert( m_incomingTable, value ); }
+  { insert( m_incomingTable, value, false ); }
   void onOutgoing( const std::string& value )
-  { insert( m_outgoingTable, value ); }
+  { insert( m_outgoingTable, value, true ); }
   void onEvent( const std::string& value )
-  { insert( m_eventTable, value ); }
+  { insert( m_eventTable, value, true ); }

 private:
   void init();
-  void insert( const std::string& table, const std::string value );
+  void insert( const std::string& table, const std::string value, const int io );

   std::string m_incomingTable;
   std::string m_outgoingTable;

```

##MySQLLOGソースファイル

保存時にフラグを見て Sender とTarget を入れ替えるだけです

```cpp:MySQLLog.cpp
@@ -227,7 +227,7 @@ void MySQLLog::backup()
 {
 }

-void MySQLLog::insert( const std::string& table, const std::string value )
+void MySQLLog::insert( const std::string& table, const std::string value, const int io )
 {
   UtcTimeStamp time;
   int year, month, day, hour, minute, second, millis;
@@ -249,10 +249,16 @@ void MySQLLog::insert( const std::string& table, const std::string value )

   if( m_pSessionID )
   {
-    queryString
-    << "\"" << m_pSessionID->getBeginString().getValue() << "\","
-    << "\"" << m_pSessionID->getSenderCompID().getValue() << "\","
-    << "\"" << m_pSessionID->getTargetCompID().getValue() << "\",";
+    if( io )
+      queryString
+      << "\"" << m_pSessionID->getBeginString().getValue() << "\","
+      << "\"" << m_pSessionID->getSenderCompID().getValue() << "\","
+      << "\"" << m_pSessionID->getTargetCompID().getValue() << "\",";
+    else
+      queryString
+      << "\"" << m_pSessionID->getBeginString().getValue() << "\","
+      << "\"" << m_pSessionID->getTargetCompID().getValue() << "\","
+      << "\"" << m_pSessionID->getSenderCompID().getValue() << "\",";
     if( m_pSessionID->getSessionQualifier() == "" )
       queryString << "NULL" << ",";
     else

```


##コンパイル
```
C++]$ cd ../..
quickfix]$ make
quickfix]$ sudo  make  install
quickfix]$ sudo  echo /usr/local/lib > /etc/ld.so.conf.d/user-local-lib.conf
quickfix]$ sudo  ldconfig
quickfix]$ sudo  ldconfig -v | grep quick
        libquickfix.so.16 -> libquickfix.so.16.0.1
```

エラーなくコンパイルできること





＜前 [【QuickFIX】02 ログイン時にPassword(554)を送信](https://qiita.com/nobu-maple/items/649f1fd2525523f12064)
次＞ [【QuickFIX】04 情報保存用にMySQLコネクションを保持..他](https://qiita.com/nobu-maple/items/cfe505ad984e16d46af9)

---
# 一覧
[01 サンプルのコンパイル](https://qiita.com/nobu-maple/items/051188f21efc59429808)
[02 ログイン時にPassword(554)を送信](https://qiita.com/nobu-maple/items/649f1fd2525523f12064)
[03 送受信ログをMySQLに保存](https://qiita.com/nobu-maple/items/cc943f0c1028f21161c0)
[04 情報保存用にMySQLコネクションを保持..他](https://qiita.com/nobu-maple/items/cfe505ad984e16d46af9)
[05 各種メッセージの枠を作成](https://qiita.com/nobu-maple/items/770d8da8c50c4f5a5a54)
[06 独自メッセージ仕様](https://qiita.com/nobu-maple/items/580815f3c304d96bde31)
[07 セッション開始 <h> TradingSessionStatus](https://qiita.com/nobu-maple/items/98369bad8351cb662740)
[08 通貨ペア要求 <x> SecurityListRequest](https://qiita.com/nobu-maple/items/ba0fb7175c378bc4c608)
[09 通貨ペア取得 <y> SecurityList](https://qiita.com/nobu-maple/items/66feda02d9a717bd31b9)
[10 デモ環境サーバへ接続](https://qiita.com/nobu-maple/items/52de92892a03f59c7368)
[11 ログ出力設定](https://qiita.com/nobu-maple/items/828d3859ebf2ab2237f8)
[12 マーケット情報要求 < V > MarketDataRequest](https://qiita.com/nobu-maple/items/1c4f2d27cabde8eff713)
[13 マーケット情報受信 < X > MarketDataIncrementalRefresh](https://qiita.com/nobu-maple/items/eb7855841000eb2b0f04)
[14 口座情報要求 < AN > RequestForPositions](https://qiita.com/nobu-maple/items/30c286f8dbf1e9b0e173)
[15 口座情報取得 < AZ > CollateralResponse](https://qiita.com/nobu-maple/items/a16e3c787ef5e83f3971)

---