南京邮电大学通达学院 许锦花 07003704
5读取一条话单记录clRateFileIOMan.GetOneCdr(&tCdrEvent),如果取到继续进行,没取到跳转到7; 6处理一条话单DealOneCdr(),返回到5
7判断是非到文件尾,如果到了,完成一个文件的处理DoneOneFile(),返回到3; 8判断内存中是否有数据没入库,如果有继续进行下一步,如果没有跳转到10; 9批量入库m_EventPcsInfo->PcsIntoDB(); 10 sleep,返回到2;
为了更清楚地了解话单是怎样入库的,画出了话单入库的数据转移图:
event_source计费文件数据库接口类m_vUnsettledFileInfo未处理文件信息ptUnsettledFileInfoptUnsettledFileInfo->sFileName当前文件的属性ID序列m_vCurFileAttrSeq文件头信息sInputCdrm_tRateFileInfo.fpm_tRateFileInfo.sFileName设置话单属性ptCdrEventptUnsettledFileInfo->lCustGroup事件属性类 pAttr =tCdrEvent.GetAttr预付费清单表m_EventPcsmsTmpEventPcs和msTmpEventPcsNextmsEventPcs和msEventPcsNextiBufferCount预付费费用清单表tmpPcsFeeve_EventPcsFeemsEventPcsFee和msEventPcsFeeNext查找内存表记录m_pServHistory总帐表tmpPrepaypcs查找帐务关系m_pServAcct清单表,费用表和SD表当前帐期SD表内存m_phtSdCurrent当前帐期插入方式入库容器m_phtSdInsertCurrent当前帐期更新方式入库容器m_phtSdUpdateCurrent下个帐期SD表内存m_phtSdNext下个帐期插入方式入库容器m_phtSdInsertNext下个帐期更新方式入库容器m_phtSdUpdateNext
图 12,话单入库的数据转移图
预付费入库程序的具体实现 4.1处理命令Execute()程序
bool TPcsTrans::Execute(TPcsTransExecInfo &tPcsTransExecInfo) {
char sSQL[2048]; TConfigInfo tConfigInfo; sSQL[0] ='\\0'; try {
this->gpBillLog->Log(LOG_NORMAL, LOG_CODE_PCSTRANS,
\data .... \\n\
// 加载SD表数据到内存
- 24 -
南京邮电大学通达学院 许锦花 07003704
if(this->m_EventPcsInfo->LoadAcctData(tPcsTransExecInfo)!=0) {
this->gpBillLog->Warning(WARNING_NORMAL, WARNING_CODE_PCSTRANS, \TEventPcsInfo::LoadAcctData()err ! \\n\ return false; }
this->gpBillLog->Log(LOG_NORMAL, LOG_CODE_PCSTRANS,
\complete \\n\
// 设置查询SQL
if (!PreSetQuerySQL(tPcsTransExecInfo, sSQL))
{
this->gpBillLog->Warning(WARNING_NORMAL, WARNING_CODE_PCSTRANS,
\ return false; }
// 取得应用配置信息
if (!GetConfigInfo(tConfigInfo)) {
this->gpBillLog->Warning(WARNING_NORMAL, WARNING_CODE_PCSTRANS,
\ return false; }
// 设置数据库查询步长 if (0 == tConfigInfo.iStep) {
tConfigInfo.iStep = GET_RATE_FILE_FROM_DB_NUM_DEF; }
// 根据工作方式处理文件
if (!ProcessPcsFile(sSQL, tPcsTransExecInfo, tConfigInfo)) {
this->gpBillLog->Warning(WARNING_NORMAL, WARNING_CODE_PCSTRANS,
\
gpBillLog->Log(LOG_NORMAL, LOG_CODE_PCSTRANS , \error, exit!\\n\ return false; }
}
catch (TDBException e)
{
this->gpDBBill->Rollback();
this->gpBillLog->Warning(WARNING_NORMAL, WARNING_CODE_PCSTRANS,
- 25 -
南京邮电大学通达学院 许锦花 07003704
\#err_sql[%s]! \\n\
e.GetErrMsg(), e.GetErrSql()); return false; }
catch (TException e) {
this->gpDBBill->Rollback();
this->gpBillLog->Warning(WARNING_NORMAL, WARNING_CODE_PCSTRANS,
\ e.GetErrMsg()); return false; }
catch (...)
{
this->gpDBBill->Rollback();
this->gpBillLog->Warning(WARNING_NORMAL, WARNING_CODE_PCSTRANS,
\ return false; } return true;
}
为了节省空间,写日志的程序代码和抛错的程序代码等,在下面程序中将被省略。 4.2处理话单文件函数ProcessPcsFile()程序
bool TPcsTrans::ProcessPcsFile(const char *psSQL, TPcsTransExecInfo &tPcsTransExecInfo, TConfigInfo &tConfigInfo) {
TEventSourceFileInfo *ptUnsettledFileInfo = NULL;
TRateFileDBInterface clRateFileDBIF(m_pclTbInfoManager); TRateFileIOManager clRateFileIOMan(m_pclTbInfoManager);
if (!psSQL)
{ return false;} // 设置数据库查询条件
if (clRateFileDBIF.SetQueryCondition(psSQL, tConfigInfo.iStep) != CDR_RATE_SUCCESS) { return false;} while (1) {
// 从数据库查询符合处理条件的纪录
while ((iRetDBIF=clRateFileDBIF.GetOneUnsettledRec(ptUnsettledFileInfo, lTemp, tPcsTransExecInfo.iFlowID)) == CDR_RATE_SUCCESS) {
- 26 -
南京邮电大学通达学院 许锦花 07003704
gpBillLog->Log(LOG_NORMAL, LOG_CODE_PCSTRANS , \#file_name:[%s] \\n\
// 打开符合条件的预处理文件记录
if (clRateFileIOMan.OpenUnsettledFile(ptUnsettledFileInfo, &tConfigInfo) != CDR_RATE_SUCCESS) {
// 如果打开文件失败,则设置数据库记录为处理失败
strcpy(ptUnsettledFileInfo->sProcState, EVENT_SOURCE_FILE_STATE_FAIL); if (clRateFileDBIF.UpdateUnsettleRecInfo(ptUnsettledFileInfo)) { return false; } this->gpDBBill->Commit(); continue; //循环处理下一个文件 } else {
while (1) // 打开文件成功后循环读取文件 {
TCallDetailRecord clCdrRecord;
TCallDetailResultRecord clCallDetailResultRecord;
TCdrEvent tCdrEvent(this, &clCallDetailResultRecord, &clCdrRecord, m_pclTbInfoManager, true);
tCdrEvent.SetEventAttrInfo(m_pclTbInfoManager->pEventAttrInfo);
// 取得一条文件记录
iRetIO = clRateFileIOMan.GetOneCdr(&tCdrEvent); if (CDR_RATE_SUCCESS == iRetIO) {
lIndex++;
// 处理一条话单
if (!DealOneCdr(clRateFileIOMan,tCdrEvent, tPcsTransExecInfo)) {
// 处理当前文件发生致命错误 if
(clRateFileDBIF.UpdateUnsettleRecInfo(ptUnsettledFileInfo)) {
this->gpDBBill->Rollback(); return false; }
this->gpDBBill->Commit();
if(!this->m_EventPcsInfo->ClearOneFileResult()) { return false; } break; } }
- 27 -
南京邮电大学通达学院 许锦花 07003704
else if (CDR_RATE_GET_CDR_FIELD_NOT_EQUEAL_HEAD_FIELD == iRetIO) {
strcpy(ptUnsettledFileInfo->sProcState,
EVENT_SOURCE_FILE_STATE_FAIL); if (clRateFileDBIF.UpdateUnsettleRecInfo(ptUnsettledFileInfo))
{
this->gpDBBill->Rollback(); return false;
} this->gpDBBill->Commit();
if(!this->m_EventPcsInfo->ClearOneFileResult()) { return false; } break; }
else if (CDR_RATE_GET_CDR_EOF == iRetIO) {
// 完成一个文件的处理,同时入库 if
(!DoneOneFile(clRateFileIOMan,clRateFileDBIF,ptUnsettledFileInfo,tPcsTransExecInfo)) {
// 完成处理一个文件失败
//这里提交只是更改文件状态,插入操作已经回滚 this->gpDBBill->Commit(); return false; }
else
{
this->gpDBBill->Commit();//如果成功在这里统一提交
break; } } else
{
// 如果读取话单错误返回错误
strcpy(ptUnsettledFileInfo->sProcState, EVENT_SOURCE_FILE_STATE_FAIL);
if (clRateFileDBIF.UpdateUnsettleRecInfo(ptUnsettledFileInfo)) {
this->gpDBBill->Rollback(); return false; }
this->gpDBBill->Commit(); break;
}
} //end of second while(1)for deal a cdr
- 28 -