⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmaster.pc

📁 计费主程序C++开发的
💻 PC
📖 第 1 页 / 共 3 页
字号:
#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 + -