void PostgreSQLStore::populateCache() { std::stringstream queryString; queryString << "SELECT creation_time, incoming_seqnum, outgoing_seqnum FROM sessions WHERE " << "beginstring=" << "'" << m_sessionID.getBeginString().getValue() << "' and " << "sendercompid=" << "'" << m_sessionID.getSenderCompID().getValue() << "' and " << "targetcompid=" << "'" << m_sessionID.getTargetCompID().getValue() << "' and " << "session_qualifier=" << "'" << m_sessionID.getSessionQualifier() << "'"; PostgreSQLQuery query( queryString.str() ); if( !m_pConnection->execute(query) ) throw ConfigError( "No entries found for session in database" ); int rows = query.rows(); if( rows > 1 ) throw ConfigError( "Multiple entries found for session in database" ); if( rows == 1 ) { struct tm time; std::string sqlTime = query.getValue( 0, 0 ); strptime( sqlTime.c_str(), "%Y-%m-%d %H:%M:%S", &time ); m_cache.setCreationTime (UtcTimeStamp (&time)); m_cache.setNextTargetMsgSeqNum( atol( query.getValue( 0, 1 ) ) ); m_cache.setNextSenderMsgSeqNum( atol( query.getValue( 0, 2 ) ) ); } else { UtcTimeStamp time = m_cache.getCreationTime(); char sqlTime[ 20 ]; int year, month, day, hour, minute, second, millis; time.getYMD (year, month, day); time.getHMS (hour, minute, second, millis); STRING_SPRINTF( sqlTime, "%d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second ); std::stringstream queryString2; queryString2 << "INSERT INTO sessions (beginstring, sendercompid, targetcompid, session_qualifier," << "creation_time, incoming_seqnum, outgoing_seqnum) VALUES(" << "'" << m_sessionID.getBeginString().getValue() << "'," << "'" << m_sessionID.getSenderCompID().getValue() << "'," << "'" << m_sessionID.getTargetCompID().getValue() << "'," << "'" << m_sessionID.getSessionQualifier() << "'," << "'" << sqlTime << "'," << m_cache.getNextTargetMsgSeqNum() << "," << m_cache.getNextSenderMsgSeqNum() << ")"; PostgreSQLQuery query2( queryString2.str() ); if( !m_pConnection->execute(query2) ) throw ConfigError( "Unable to create session in database" ); } }
void OdbcLog::insert( const std::string& table, const std::string value ) { QF_STACK_PUSH(OdbcLog::insert) UtcTimeStamp time; int year, month, day, hour, minute, second, millis; time.getYMD( year, month, day ); time.getHMS( hour, minute, second, millis ); char sqlTime[ 24 ]; STRING_SPRINTF( sqlTime, "%d-%02d-%02d %02d:%02d:%02d.%003d", year, month, day, hour, minute, second, millis ); std::string valueCopy = value; string_replace( "'", "''", valueCopy ); std::stringstream queryString; queryString << "INSERT INTO " << table << " " << "(time, beginstring, sendercompid, targetcompid, session_qualifier, text) " << "VALUES (" << "{ts '" << sqlTime << "'},"; if( m_pSessionID ) { queryString << "'" << m_pSessionID->getBeginString().getValue() << "'," << "'" << m_pSessionID->getSenderCompID().getValue() << "'," << "'" << m_pSessionID->getTargetCompID().getValue() << "',"; if( m_pSessionID->getSessionQualifier() == "" ) queryString << "NULL" << ","; else queryString << "'" << m_pSessionID->getSessionQualifier() << "',"; } else { queryString << "NULL, NULL, NULL, NULL, "; } queryString << "'" << valueCopy << "')"; OdbcQuery query( queryString.str() ); m_pConnection->execute( query ); QF_STACK_POP }
void PostgreSQLStore::reset() throw ( IOException ) { std::stringstream queryString; queryString << "DELETE FROM messages WHERE " << "beginstring=" << "'" << m_sessionID.getBeginString().getValue() << "' and " << "sendercompid=" << "'" << m_sessionID.getSenderCompID().getValue() << "' and " << "targetcompid=" << "'" << m_sessionID.getTargetCompID().getValue() << "' and " << "session_qualifier=" << "'" << m_sessionID.getSessionQualifier() << "'"; PostgreSQLQuery query( queryString.str() ); if( !m_pConnection->execute(query) ) query.throwException(); m_cache.reset(); UtcTimeStamp time = m_cache.getCreationTime(); int year, month, day, hour, minute, second, millis; time.getYMD( year, month, day ); time.getHMS( hour, minute, second, millis ); char sqlTime[ 20 ]; STRING_SPRINTF( sqlTime, "%d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second ); std::stringstream queryString2; queryString2 << "UPDATE sessions SET creation_time='" << sqlTime << "', " << "incoming_seqnum=" << m_cache.getNextTargetMsgSeqNum() << ", " << "outgoing_seqnum=" << m_cache.getNextSenderMsgSeqNum() << " WHERE " << "beginstring=" << "'" << m_sessionID.getBeginString().getValue() << "' and " << "sendercompid=" << "'" << m_sessionID.getSenderCompID().getValue() << "' and " << "targetcompid=" << "'" << m_sessionID.getTargetCompID().getValue() << "' and " << "session_qualifier=" << "'" << m_sessionID.getSessionQualifier() << "'"; PostgreSQLQuery query2( queryString2.str() ); if( !m_pConnection->execute(query2) ) query2.throwException(); }