《实验A排版后文稿》[1](6)

2019-01-10 11:37

南京邮电大学通达学院 许锦花 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 -


《实验A排版后文稿》[1](6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:哈佛教授丘成桐对北大学术的评价

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: