Index  Source Files  Annotated Class List  Alphabetical Class List  Class Hierarchy  Graphical Class Hierarchy 

FileLog.cpp

Go to the documentation of this file.
00001 /****************************************************************************
00002 ** Copyright (c) quickfixengine.org  All rights reserved.
00003 **
00004 ** This file is part of the QuickFIX FIX Engine
00005 **
00006 ** This file may be distributed under the terms of the quickfixengine.org
00007 ** license as defined by quickfixengine.org and appearing in the file
00008 ** LICENSE included in the packaging of this file.
00009 **
00010 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
00011 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
00012 **
00013 ** See http://www.quickfixengine.org/LICENSE for licensing information.
00014 **
00015 ** Contact ask@quickfixengine.org if any conditions of this licensing are
00016 ** not clear to you.
00017 **
00018 ****************************************************************************/
00019 
00020 #ifdef _MSC_VER
00021 #include "stdafx.h"
00022 #else
00023 #include "config.h"
00024 #endif
00025 #include "CallStack.h"
00026 
00027 #include "FileLog.h"
00028 
00029 namespace FIX
00030 {
00031 Log* FileLogFactory::create()
00032 { QF_STACK_PUSH(FileLogFactory::create)
00033 
00034   m_globalLogCount++;
00035   if( m_globalLogCount > 1 ) return m_globalLog;
00036 
00037   try
00038   {
00039     if ( m_path.size() ) return new FileLog( m_path );
00040     std::string path;
00041     std::string backupPath;
00042 
00043     Dictionary settings = m_settings.get();
00044     path = settings.getString( FILE_LOG_PATH );
00045     backupPath = path;
00046     if( settings.has( FILE_LOG_BACKUP_PATH ) )
00047       backupPath = settings.getString( FILE_LOG_BACKUP_PATH );
00048 
00049     return m_globalLog = new FileLog( path );
00050   }
00051   catch( ConfigError& )
00052   {
00053         m_globalLogCount--;
00054         throw;  
00055   }
00056 
00057   QF_STACK_POP
00058 }
00059 
00060 Log* FileLogFactory::create( const SessionID& s )
00061 { QF_STACK_PUSH(FileLogFactory::create)
00062 
00063   if ( m_path.size() && m_backupPath.size() )
00064     return new FileLog( m_path, m_backupPath, s );
00065   if ( m_path.size() ) 
00066     return new FileLog( m_path, s );
00067 
00068   std::string path;
00069   Dictionary settings = m_settings.get( s );
00070   path = settings.getString( FILE_LOG_PATH );
00071   return new FileLog( path, s );
00072 
00073   QF_STACK_POP
00074 }
00075 
00076 void FileLogFactory::destroy( Log* pLog )
00077 { QF_STACK_PUSH(FileLogFactory::destroy)
00078  
00079   if( pLog == m_globalLog )
00080   {
00081     m_globalLogCount--;
00082     if( m_globalLogCount == 0 )
00083     {
00084             delete pLog;
00085             m_globalLogCount = 0;
00086     }   
00087   }
00088   else
00089   {
00090         delete pLog;
00091   }
00092 
00093   QF_STACK_POP
00094 }
00095 
00096 FileLog::FileLog( const std::string& path )
00097 : m_millisecondsInTimeStamp( true )
00098 {
00099   init( path, path, "GLOBAL" );
00100 }
00101 
00102 FileLog::FileLog( const std::string& path, const SessionID& s )
00103 : m_millisecondsInTimeStamp( true )
00104 {
00105   init( path, path, generatePrefix(s) );
00106 }
00107 
00108 FileLog::FileLog( const std::string& path, const std::string& backupPath, const SessionID& s )
00109 : m_millisecondsInTimeStamp( true )
00110 {
00111   init( path, backupPath, generatePrefix(s) );
00112 }
00113 
00114 std::string FileLog::generatePrefix( const SessionID& s )
00115 {
00116   const std::string& begin =
00117     s.getBeginString().getString();
00118   const std::string& sender =
00119     s.getSenderCompID().getString();
00120   const std::string& target =
00121     s.getTargetCompID().getString();
00122   const std::string& qualifier =
00123     s.getSessionQualifier();
00124 
00125   std::string prefix = begin + "-" + sender + "-" + target;
00126   if( qualifier.size() )
00127     prefix += "-" + qualifier;
00128 
00129   return prefix;
00130 }
00131 
00132 void FileLog::init( std::string path, std::string backupPath, const std::string& prefix )
00133 { QF_STACK_PUSH(FileLog::init)
00134         
00135   file_mkdir( path.c_str() );
00136   file_mkdir( backupPath.c_str() );
00137 
00138   if ( path.empty() ) path = ".";
00139   if ( backupPath.empty() ) backupPath = path;
00140 
00141   m_fullPrefix
00142     = file_appendpath(path, prefix + ".");
00143   m_fullBackupPrefix
00144     = file_appendpath(backupPath, prefix + ".");
00145 
00146   m_messagesFileName = m_fullPrefix + "messages.current.log";
00147   m_eventFileName = m_fullPrefix + "event.current.log";
00148 
00149   m_messages.open( m_messagesFileName.c_str(), std::ios::out | std::ios::app );
00150   if ( !m_messages.is_open() ) throw ConfigError( "Could not open messages file: " + m_messagesFileName );
00151   m_event.open( m_eventFileName.c_str(), std::ios::out | std::ios::app );
00152   if ( !m_event.is_open() ) throw ConfigError( "Could not open event file: " + m_eventFileName );
00153 
00154   QF_STACK_POP
00155 }
00156 
00157 FileLog::~FileLog()
00158 {
00159   m_messages.close();
00160   m_event.close();
00161 }
00162 
00163 void FileLog::clear()
00164 {
00165   m_messages.close();
00166   m_event.close();
00167 
00168   m_messages.open( m_messagesFileName.c_str(), std::ios::out | std::ios::trunc );
00169   m_event.open( m_eventFileName.c_str(), std::ios::out | std::ios::trunc );
00170 }
00171 
00172 void FileLog::backup()
00173 {
00174   m_messages.close();
00175   m_event.close();
00176 
00177   int i = 0;
00178   while( true )
00179   {
00180     std::stringstream messagesFileName;
00181     std::stringstream eventFileName;
00182  
00183     messagesFileName << m_fullBackupPrefix << "messages.backup." << ++i << ".log";
00184     eventFileName << m_fullBackupPrefix << "event.backup." << i << ".log";
00185     FILE* messagesLogFile = file_fopen( messagesFileName.str().c_str(), "r" );
00186     FILE* eventLogFile = file_fopen( eventFileName.str().c_str(), "r" );
00187 
00188     if( messagesLogFile == NULL && eventLogFile == NULL )
00189     {
00190       file_rename( m_messagesFileName.c_str(), messagesFileName.str().c_str() );
00191       file_rename( m_eventFileName.c_str(), eventFileName.str().c_str() );
00192       m_messages.open( m_messagesFileName.c_str(), std::ios::out | std::ios::trunc );
00193       m_event.open( m_eventFileName.c_str(), std::ios::out | std::ios::trunc );
00194       return;
00195     }
00196     
00197     if( messagesLogFile != NULL ) file_fclose( messagesLogFile );
00198     if( eventLogFile != NULL ) file_fclose( eventLogFile );
00199   }
00200 }
00201 
00202 } //namespace FIX

Generated on Mon Apr 5 20:59:50 2010 for QuickFIX by doxygen 1.6.1 written by Dimitri van Heesch, © 1997-2001