| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #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
- }
|