#include "StdAfx.h" #include "JobInvoker.h" #include "JCCInquireSalesVersion.hpp" #include "CJCCInquire.hpp" #include "JCCBuyProduct.hpp" #include "JCCGiftProduct.hpp" #include "JCCStorageList.hpp" #include "JCCStorageUse.hpp" CJobInvoker::CJobInvoker(void) : m_pShopDBFactory(NULL) { m_pShopDBFactory = new CShopDBProcFactory; } CJobInvoker::~CJobInvoker(void) { RemoveConCreateCommands(); if(m_pShopDBFactory) delete m_pShopDBFactory, m_pShopDBFactory = NULL; } void CJobInvoker::SetJobCommand(CConfig& clsConfig) { InsertConCreateCommands(); if(0 != (clsConfig.getShopDB_IPAddress())[0]) { m_pShopDBFactory->SetDBConnectionInfo( clsConfig.getShopDB_IPAddress(), clsConfig.getShopDB_PortNum(), clsConfig.getShopDB_Name(), clsConfig.getShopDB_UserName(), clsConfig.getShopDB_PassWord(), clsConfig.getShopDB_TimeOut(), false); BILLING_LOG(WZPUBLIC::LEVEL_INFO, "商城数据库: IP(%s), 数据库名(%s)", clsConfig.getShopDB_IPAddress(), clsConfig.getShopDB_Name()); } } void CJobInvoker::InsertConCreateCommand(DWORD key, CJobCommand* value) { std::pair result = m_ConcreteCommand.insert(CONCRETE_COMMAND_MAP::value_type(key, value)); if(!result.second) { BILLING_LOG(WZPUBLIC::LEVEL_ERROR, "任务处理实例命令插入失败 (%ld)", key); } } void CJobInvoker::InsertConCreateCommands() { InsertConCreateCommand(JOB_SHOP_INQUIRE_SALESVERSION, new CJCCInquireSalesVersion); //版本查询 InsertConCreateCommand(JOB_SHOP_INQUIRE, new CJCCInquire); //点劵查询 InsertConCreateCommand(JOB_SHOP_BUYPRODUCT, new CJCCBuyProduct); //商品购买 InsertConCreateCommand(JOB_SHOP_GIFTPRODUCT, new CJCCGiftProduct); //礼物赠送 InsertConCreateCommand(JOB_SHOP_STORAGELIST, new CJCCStorageList); //保管盒查询 InsertConCreateCommand(JOB_SHOP_STORAGEUSE, new CJCCStorageUse); //保管盒子物品领取 InsertConCreateCommand(JOB_SHOP_STORAGEUSEALL, new CJCCStorageUseAll); //保管盒子物品全部领取 InsertConCreateCommand(JOB_SHOP_STORAGEUSEROLLBACK, new CJCCStorageUseRollback); //领取失败回档 } void CJobInvoker::RemoveConCreateCommands() { for( CONCRETE_COMMAND_MAP::iterator iter = m_ConcreteCommand.begin() ; iter != m_ConcreteCommand.end() ; ++iter ) { CJobCommand* pCommand = iter->second; if( NULL != pCommand ) { delete pCommand; } } m_ConcreteCommand.clear(); } void CJobInvoker::RunProc() { CShopJobBase* job = NULL; if(_instance(CShopJobQueue)->pop(job)) { CONCRETE_COMMAND_MAP::iterator iterFind = m_ConcreteCommand.find(job->jobcode); job->bForceFalseReturn = false; if(m_ConcreteCommand.end() == iterFind) { BILLING_LOG(WZPUBLIC::LEVEL_WARN, "未知任务 (%ld)", job->jobcode); } else { CShopDBProc* pShopProc = m_pShopDBFactory->GetShopDBProc(job->GameCode); if(!pShopProc) { BILLING_LOG(WZPUBLIC::LEVEL_WARN, "数据库实例获取失败"); } else { ((CJobCommand*)iterFind->second)->Execute(pShopProc, job); } } } } void CJobInvoker::OnTimer(HANDLE hRequest, DWORD dwRequest) { }