📄 cmaster.pc
字号:
#include <CMaster.h>
extern CReportStatus cReport;
/*************************************************************
构造函数
*************************************************************/
CMaster::CMaster(CStringEx strIniFileName,CStringEx strProgramName,
CStringEx strUid,CStringEx strPid,CStringEx strLogFile)
{
m_strINITxtName=strIniFileName;
m_strProgramName=strProgramName;
m_strUid=strUid;
m_strPid=strPid;
m_strLogFile=strLogFile;
m_ini = new CInitialize(m_strINITxtName);
m_Oracle = new COracleDatabase(m_strINITxtName,m_strProgramName);
m_filemanage = new CDeriveFileManage(m_strINITxtName);
m_udp = new CUdpClient(m_strUid.GetBuffer(),m_strPid.GetBuffer(),
m_strLogFile.GetBuffer());
m_Check= new CCheckRecord(1024,64);
}
CMaster::~CMaster()
{
delete m_Oracle;
delete m_filemanage;
delete m_ini;
delete m_udp;
delete m_Check;
}
/*****************************************************************
函数:DeleteRecord
功能:实现处理过的文件回退,从库表中去掉相关的记录(不包括
日志记录)
参数:无
返回值:成功 大于或等于0;失败 小于0
*****************************************************************/
int CMaster::DeleteRecord()
{
CProcessFile m_ProcFile; //定义文本处理的对象
CStringEx strImsiAndIsdn;
CStringEx strTmpString;
int nHeadID; //是否具有头记录的标志
int nTailID; //是否具有尾记录的标志
int nLineNumber; //详单记录号,用于去重
int nInsert; //是否删除数据库中记录的标识
int nMultNumber; //每次处理最大行数记录的倍数
m_nLine=nHeadID=nTailID=m_nRecordNumber=nLineNumber=nMultNumber=0;
m_lRecordLength=atol(m_pGetOneNode->strRecordLength);
m_lFileSize=m_filemanage->GetFileSize();
// 判断文件在日志库表是否已经存在
m_nErrFileID=0;
m_nReturnValue=m_Oracle->FileLogRecord(m_pGetOneNode->strLogTable,
m_strTextName);
if(m_nReturnValue==1) {
//关闭文件
m_filemanage->CloseFile();
// 备份文本
pBakDir=m_pGetOneNode->dir_link;
while(pBakDir->dlink!=NULL) {
// nMove等于0,表示文件通过cp方式到另外一个目录
m_nMove=0;
m_strTmpString.Format("%s/%s",m_pGetOneNode->strTxtDir,
m_strTextName.GetBuffer());
m_strDestDir.Format("%s",pBakDir->strBackUpDir);
m_nReturnValue=m_filemanage->BackUpFile(m_strTmpString,
m_strDestDir,m_nMove);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
pBakDir=pBakDir->dlink;
}
// nMove等于1,表示文件通过mv方式到另外一个目录
m_nMove=1;
m_strTmpString.Format("%s/%s",m_pGetOneNode->strTxtDir,
m_strTextName.GetBuffer());
m_strDestDir.Format("%s",pBakDir->strBackUpDir);
pBakDir=pBakDir->dlink;
m_nReturnValue=m_filemanage->BackUpFile(m_strTmpString,
m_strDestDir,m_nMove);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
else {
// 挪文件成功,更新记录的状态标志
m_nReturnValue=m_Oracle->UpdateLog(m_pGetOneNode->strLogTable,
m_strTextName,m_nErrFileID);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
}
return(0);
}
else if(m_nReturnValue==2) {
m_filemanage->CloseFile();
return(0);
}
else if(m_nReturnValue<0) {
return(m_nReturnValue);
}
else {
pTailRecord=m_pGetOneNode->tail_link;
while(1) {
// 从文件中获取一行记录
m_nReturnValue=m_filemanage->FetchOneRow(m_strTmpOneRow);
if(m_nReturnValue==0) {
if(nTailID == 0) {
m_strOneRow.Empty();
m_strTableName.Format("%s",m_pGetOneNode->strLogTable);
//日志记录的添加尾记录
m_strRecordFormat.Format("%s",
m_pGetOneNode->tail_link->strTailRecord);
m_nCommit=1;
m_nLine=m_nTailNumber=0;
m_ProcFile.Initialize(m_strOneRow,m_strTableName,
m_strRecordFormat,m_strTextName);
m_nReturnValue=m_ProcFile.AddRecord(m_lFileSize,m_strYear_Mon,
m_nCommit,m_nRecordNumber,m_nLine,m_nTailNumber);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
}
m_filemanage->CloseFile();
// 文本挪移
pBakDir=m_pGetOneNode->dir_link;
while(pBakDir->dlink!=NULL) {
// nMove等于0,表示文件通过cp方式到另外一个目录
m_nMove=0;
m_strTmpString.Format("%s/%s",m_pGetOneNode->strTxtDir,
m_strTextName.GetBuffer());
m_strDestDir.Format("%s",pBakDir->strBackUpDir);
m_nReturnValue=m_filemanage->BackUpFile(m_strTmpString,
m_strDestDir,m_nMove);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
pBakDir=pBakDir->dlink;
}
// nMove等于1,表示文件通过mv方式到另外一个目录
m_nMove=1;
m_strTmpString.Format("%s/%s",m_pGetOneNode->strTxtDir,
m_strTextName.GetBuffer());
m_strDestDir.Format("%s",pBakDir->strBackUpDir);
m_nReturnValue=m_filemanage->BackUpFile(m_strTmpString,
m_strDestDir,m_nMove);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
else {
// 挪文件成功,更新记录的状态标志
m_nReturnValue=m_Oracle->UpdateLog(m_pGetOneNode->strLogTable,
m_strTextName,m_nErrFileID);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
}
break;
}
else if(m_nReturnValue<0) {
strMessageBuffer.Format("%s%s failure",
"get one row record from the file:",
m_strTextName.GetBuffer());
cReport.AcceptMessage(m_nReturnValue,0,strMessageBuffer);
return(m_nReturnValue);
}
else {
m_strOneRow=m_strTmpOneRow+m_strChangedTailID;
// 根据头记录的条数,区分记录是否为头记录
m_nLine++;
m_strRecordID.Format("%s",m_pGetOneNode->strHeadRecordType);
nHeadID=atoi(m_strRecordID.GetBuffer());
if((nHeadID-m_nLine)>=0) {
continue;
}
else {
// 区分记录是否为尾记录
m_strRecordID.Format("%s",m_pGetOneNode->strTailRecordType);
m_ProcFile.Initialize(m_strOneRow,m_strTableName,
m_strRecordID,m_strTextName);
m_nReturnValue=m_ProcFile.RecordType();
if(m_nReturnValue==0) {
// 文本记录回退,库表记录删除,
if(nLineNumber!=0) {
m_strTableName.Format("%s",m_pGetOneNode->strRecordTable);
m_Check->Initialize(m_strTableName,m_strTextName,nHeadID);
nInsert=2;
m_strTmpOneRow.Empty();
m_nReturnValue=m_Check->StoreRecord(m_strTmpOneRow,
nInsert,nLineNumber,nMultNumber);
if(m_nReturnValue!=0) {
return(m_nReturnValue);
}
nLineNumber=0;
}
nTailID++;
m_strTableName.Format("%s",m_pGetOneNode->strLogTable);
m_strRecordFormat.Format("%s",pTailRecord->strTailRecord);
// 添加一行日志记录
m_nCommit=0;
m_ProcFile.Initialize(m_strOneRow,m_strTableName,
m_strRecordFormat,m_strTextName);
m_nTailNumber=nTailID;
if(pTailRecord->rlink==NULL) {
m_nCommit=1;
m_nReturnValue=m_ProcFile.AddRecord(m_lFileSize,
m_strYear_Mon,m_nCommit,m_nRecordNumber,
m_nLine,m_nTailNumber);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
}
else {
m_nReturnValue=m_ProcFile.AddRecord(m_lFileSize,
m_strYear_Mon,m_nCommit,m_nRecordNumber,
m_nLine,m_nTailNumber);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
pTailRecord=pTailRecord->rlink;
}
}
else {
m_nRecordNumber++;
nLineNumber++;
// 由IMSI号获取ISDN号
if(strcasecmp(m_pGetOneNode->strIMSItoISDN,"ON")==0) {
strImsiAndIsdn.Format("%s",m_pGetOneNode->strIMSI_ISDN);
m_nReturnValue=m_Check->ImsiTOIsdn(m_strOneRow,
strImsiAndIsdn,strTmpString);
if(m_nReturnValue!=0) {
return(m_nReturnValue);
}
m_strOneRow=strTmpString;
}
m_strRecordFormat.Format("%s",m_pGetOneNode->strRecordBody);
m_nReturnValue=m_Check->SplitRecord(m_strOneRow,
m_strRecordFormat,nLineNumber);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
if(nLineNumber == RECORDLINE) {
m_strTableName.Format("%s",m_pGetOneNode->strRecordTable);
m_Check->Initialize(m_strTableName,m_strTextName,nHeadID);
nInsert=2;
m_nReturnValue=m_Check->StoreRecord(m_strOneRow,
nInsert,nLineNumber,nMultNumber);
if(m_nReturnValue!=0) {
return(m_nReturnValue);
}
nMultNumber++;
nLineNumber=0;
}
nInsert=0;
m_Check->StoreRecord(m_strOneRow,nInsert,nLineNumber,
nMultNumber);
}
}
}
}
return(0);
}
}
/*********************************************************
函数:ErrFileDeal
功能:对文件的格式长度进行判断,不符合要求的文本将做
错误文本处理。
参数:无
返回值:正确文本 为0 ,出错文本 为1,失败 小于0
*********************************************************/
int CMaster::ErrFileDeal()
{
CProcessFile m_ProcFile; //定义文本处理的对象
m_lRecordLength=atol(m_pGetOneNode->strRecordLength);
m_lFileSize=m_filemanage->GetFileSize();
// 判断文件记录格式是否正确
if(m_lRecordLength!=0&&m_lFileSize%m_lRecordLength!=0)
{
// 检测文本的操作状态
m_filemanage->CloseFile();
m_nErrFileID=1;
m_nReturnValue=m_Oracle->FileLogRecord(m_pGetOneNode->strLogTable,
m_strTextName);
if(m_nReturnValue==1) {
m_strTmpString.Format("%s/%s",m_pGetOneNode->strTxtDir,
m_strTextName.GetBuffer());
m_strDestDir.Format("%s/",m_pGetOneNode->strErrorDir);
// 把文件挪到错误目录下
m_nReturnValue=m_filemanage->BackUpFile(m_strTmpString,m_strDestDir);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
else{
// 挪文件成功,更新记录的状态标志
m_nReturnValue=m_Oracle->UpdateLog(m_pGetOneNode->strLogTable,
m_strTextName,m_nErrFileID);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
}
return(1);
}
else if(m_nReturnValue>=2) {
return(1);
}
else if(m_nReturnValue<0) {
return(m_nReturnValue);
}
else {
//文件格式不正确的,文件将移到错误文件目录下
//同时需要在日志库表添加一条记录
m_strOneRow.Empty();
m_strTableName.Format("%s",m_pGetOneNode->strLogTable);
//日志记录的添加
m_strRecordFormat.Format("%s",m_pGetOneNode->tail_link->strTailRecord);
m_nCommit=1;
m_nLine=m_nTailNumber=m_nRecordNumber=0;
m_ProcFile.Initialize(m_strOneRow,m_strTableName,
m_strRecordFormat,m_strTextName);
m_nReturnValue=m_ProcFile.AddRecord(m_lFileSize,m_strYear_Mon,
m_nCommit,m_nRecordNumber,m_nLine,m_nTailNumber);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
else{
m_strTmpString.Format("%s/%s",m_pGetOneNode->strTxtDir,
m_strTextName.GetBuffer());
m_strDestDir.Format("%s/",m_pGetOneNode->strErrorDir);
m_nReturnValue=m_filemanage->BackUpFile(m_strTmpString,
m_strDestDir);
if(m_nReturnValue<0){
return(m_nReturnValue);
}
else {
m_nReturnValue=m_Oracle->UpdateLog(m_pGetOneNode->strLogTable,
m_strTextName,m_nErrFileID);
if(m_nReturnValue<0) {
return(m_nReturnValue);
}
}
return(1);
}
}
}
else return(0);
}
/************************************************************
函数:ProgramMajor
功能:文本操作的主体,包括入库,添加日志记录,
添加ISDN号,重复话单的判断和去掉,文件的
回退操作,挪移文本,更新文本日志记录状态等操作,
参数:无
返回值:SUCCESS 大于或等于0 ,失败 小于0
************************************************************/
int CMaster::ProgramMajor()
{
m_nReturnValue=ErrFileDeal();
if(m_nReturnValue!=0) {
return(m_nReturnValue);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -