#include "StdAfx.h" #include "SItemAgentStatus.h" CSItemAgentStatus::CSItemAgentStatus(UINT AgentId, ULONG LoginId) : m_AgentID(AgentId), m_LoginID(LoginId) { } CSItemAgentStatus::~CSItemAgentStatus(void) { __flush(); } /***************************************************************** **【函数名称】 __onStateStart **【函数功能】 状态发生时的处理函数 **【参数】 **【返回值】 ****************************************************************/ void CSItemAgentStatus::__onStateStart( AGENT_STATE StartState ) { time_t StateTime; if(m_StateMap.Lookup(StartState, StateTime)) // 已经存在此状态,说明统计出现异常,该遗留状态未被记入数据库 { ASSERT(FALSE); __onStateOver(StartState); } StateTime = time(NULL); // 缓存此状态 m_StateMap.SetAt(StartState, StateTime); // 编写SQL语句 m_Sql.Format(_T("INSERT INTO rep_agent_state (AgentId, LoginId, State, OccurTime)VALUES\ (%d, %d, %d, %s)"), m_AgentID, m_LoginID, StartState, FormatTime(StateTime)); __execSQL(); } /***************************************************************** **【函数名称】 __onStateOver **【函数功能】 状态结束时的处理函数 **【参数】 **【返回值】 ****************************************************************/ void CSItemAgentStatus::__onStateOver( AGENT_STATE OverState ) { time_t StateTime; if(!m_StateMap.Lookup(OverState, StateTime)) // 未找到此状态,说明统计出现异常 { ASSERT(FALSE); return; } // 删除该状态 m_StateMap.RemoveKey(OverState); // 状态持续时间 UINT Duration = (UINT)(time(NULL) - StateTime); // 编写SQL语句 m_Sql.Format(_T("UPDATE rep_agent_state SET Duration = %d WHERE AgentId = %d AND LoginId = %d AND State = %d AND OccurTime = %s"), Duration, m_AgentID, m_LoginID, OverState, FormatTime(StateTime)); __execSQL(); } /***************************************************************** **【函数名称】 OnRepEvent **【函数功能】 统计事件变化通知 **【参数】 **【返回值】 ****************************************************************/ void CSItemAgentStatus::onSEvent( REP_EVENT EvtType, PARAM Param ) { switch(EvtType) { case REP_EVENT_STATE: { T_EvtStatus* pStatus = (T_EvtStatus*)Param; ASSERT(pStatus != NULL); if(pStatus == NULL) return; if(pStatus->StartFlag) __onStateStart(pStatus->State); else __onStateOver(pStatus->State); } break; case REP_EVENT_LOGIN: __onStateStart(AGENT_STATE_LOGING); break; case REP_EVENT_LOGOUT: __onStateOver(AGENT_STATE_LOGING); break; } } /***************************************************************** **【函数名称】 __flush **【函数功能】 将所有遗留的状态统计存入数据库 **【参数】 **【返回值】 ****************************************************************/ void CSItemAgentStatus::__flush( void ) { AGENT_STATE State; time_t StateTime; // 重新显示 POSITION pos = m_StateMap.GetStartPosition(); while(pos != NULL) { m_StateMap.GetNextAssoc(pos, State, StateTime); __onStateOver(State); } // end while }