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

📄 ctempfilemanager.cpp

📁 Mysql的处理
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/* * Copyright 2006 上海国响信息技术有限公司 PD部 * All rights reserved * * 文 件 名:CTempFileManager.h * 文件标识:计 费 网 关 * 功能描述:根据临时文件生成文件以及管理临时文件 * * 版  本:v1.0 * 作    者:周 翔 * 日    期:2006.07.01 */#include <stdio.h>#include <unistd.h>#include <time.h>#include <stdlib.h>#include <dirent.h>#include "CTempFileManager.h"#include "ConfigXml.h"#include "db/CDR.h"//打开数据库调试信息#define	IS_DB_DEBUG						0//打开一般调试信息#define	IS_DEBUG						0//打开线程调试信息#define	IS_Thread_DEBUG					0				/*****************各自存储******************/#define EACHCDR						    1/******GCDR******///GCDR的临时文件名#define	GCDRNAMETEMPBACK				"billorigin/GCdrNameTempBack"//GCDR重新命名后的名字#define	GNODEID							"CGF.ALCATEL#GCDR"/****************//******MCDR******///MCDR的临时文件名#define	MCDRNAMETEMPBACK				"billorigin/MCdrNameTempBack"//MCDR重新命名后的名字#define	MNODEID							"CGF.ALCATEL#MCDR"/****************//******SCDR******///SCDR的临时文件名#define	SCDRNAMETEMPBACK				"billorigin/SCdrNameTempBack"//SCDR重新命名后的名字#define	SNODEID							"CGF.ALCATEL#SCDR"/****************//*****SMOCDR*****///SMOCDR的临时文件名#define	SMOCDRNAMETEMPBACK				"billorigin/SmoCdrNameTempBack"//SMOCDR重新命名后的名字#define	SMONODEID						"CGF.ALCATEL#SMOCDR"/****************//*****SMTCDR*****///SMTCDR的临时文件名#define	SMTCDRNAMETEMPBACK				"billorigin/SmtCdrNameTempBack"//SMTCDR重新命名后的名字#define	SMTNODEID						"CGF.ALCATEL#SMTCDR"/****************//*******************************************//*****************统一存储******************/#define UNIONCDR						2//统一的临时文件名#define	CDRNAMETEMPBACK					"billorigin/CdrNameTempBack"//统一重新命名后的名字	#define	UNIONNODEID						"CGF.ALCATEL#CDR"/*******************************************//*****************网元存储******************//*需要注意:由于按网元存储,临时文件会有很多个,具体处理方式是(用GGSN地址举例): *按照一般方式生成临时文件,当调用OperateTempFile函数时,从m_mapGgsnAndSgsnFile中查找是 *否有相同GGSN地址的临时文件,1)如果有,则取出该文件信息进行判断,看是否满足生成 *文件的条件,满足则保存该文件,将新数据写入临时文件,并根据GGSN地址改名临时文 *件,存入m_mapGgsnAndSgsnFile中;如果不满足,则将数据直接写入与该数据GGSN地址相同的临 *时文件中,更新相应文件信息,并删除最初通过CreateTempFile函数创建的临时文件;2) *如果没有,则根据传入的GGSN地址更改临时文件的名字,将其信息插入到m_mapGgsnAndSgsnFile中 *。其中需要特别注意的是:m_mapTempFileAndMacro中的文件名需要根据传入的GGSN地址 *改名。如果GGSN和SGSN地址相同时,需要判断。 */#define GGSSCDR						    3/******GGSN******///网元存储时临时文件名#define	GGSNCDRNAMETEMPBACK				"billorigin/GgsnCdrNameTempBack"//网元存储时重新命名后的名字#define	GGSNNODEID						"CGF.ALCATEL#GGSNCDR"/****************//******SGSN******///网元存储时临时文件名#define	SGSNCDRNAMETEMPBACK				"billorigin/SgsnCdrNameTempBack"//网元存储时重新命名后的名字#define	SGSNNODEID						"CGF.ALCATEL#SGSNCDR"/****************//*******************************************/// CDR文件生成策略Key#define	CONF_ISTIME_INTERVAL			"CdrFiltration.FileSaveRule.IsTimeInterval"#define	CONF_TIMELIMIT_OFCDRSAVE		"CdrFiltration.FileSaveRule.TimeLimitOfCdrSavedForTransferFile"#define	CONF_ISFILESIZE					"CdrFiltration.FileSaveRule.IsFileSize"#define	CONF_SIZELIMIT_OFCDRSAVE		"CdrFiltration.FileSaveRule.SizeLimitOfCdrSavedForTransferFile"#define	CONF_ISCDR_NUM					"CdrFiltration.FileSaveRule.IsCdrNum"#define	CONF_NUMLIMIT_OFCDRSAVE			"CdrFiltration.FileSaveRule.NumLimitOfCdrSavedForTransferFile"// CDR文件命名规范Key#define	CONF_ISSERIALNUM_TOZERO			"CdrFiltration.FileSaveRule.IsSerialNumToZero"#define	CONF_ISSERIALNUM_FIXED			"CdrFiltration.FileSaveRule.IsSerialNumFixed"#define CONF_IS_CLOSE_TIMESTAMP			"CdrFiltration.FileSaveRule.IsCloseTimestamp"#define CONF_IS_HAVE_FILEHEADER			"CdrFiltration.FileSaveRule.IsHaveFileHeader"//bs信息/*****************各自存储******************//******GCDR******/#define	CONF_EACH_GCDR_BS				"CdrFiltration.FileSaveRule.EachSaveUpFile.GCDR.Bs"#define	CONF_EACH_GCDR_BS2				"CdrFiltration.FileSaveRule.EachSaveUpFile.GCDR.Bs2"#define	CONF_EACH_GCDR_BS3				"CdrFiltration.FileSaveRule.EachSaveUpFile.GCDR.Bs3"/****************//******MCDR******/#define	CONF_EACH_MCDR_BS				"CdrFiltration.FileSaveRule.EachSaveUpFile.MCDR.Bs"#define	CONF_EACH_MCDR_BS2				"CdrFiltration.FileSaveRule.EachSaveUpFile.MCDR.Bs2"#define	CONF_EACH_MCDR_BS3				"CdrFiltration.FileSaveRule.EachSaveUpFile.MCDR.Bs3"/****************//******SCDR******/#define	CONF_EACH_SCDR_BS				"CdrFiltration.FileSaveRule.EachSaveUpFile.SCDR.Bs"#define	CONF_EACH_SCDR_BS2				"CdrFiltration.FileSaveRule.EachSaveUpFile.SCDR.Bs2"#define	CONF_EACH_SCDR_BS3				"CdrFiltration.FileSaveRule.EachSaveUpFile.SCDR.Bs3"/****************//*****SMOCDR*****/#define	CONF_EACH_SMOCDR_BS				"CdrFiltration.FileSaveRule.EachSaveUpFile.SMOCDR.Bs"#define	CONF_EACH_SMOCDR_BS2			"CdrFiltration.FileSaveRule.EachSaveUpFile.SMOCDR.Bs2"#define	CONF_EACH_SMOCDR_BS3			"CdrFiltration.FileSaveRule.EachSaveUpFile.SMOCDR.Bs3"/****************//*****SMTCDR*****/#define	CONF_EACH_SMTCDR_BS				"CdrFiltration.FileSaveRule.EachSaveUpFile.SMTCDR.Bs"#define	CONF_EACH_SMTCDR_BS2			"CdrFiltration.FileSaveRule.EachSaveUpFile.SMTCDR.Bs2"#define	CONF_EACH_SMTCDR_BS3			"CdrFiltration.FileSaveRule.EachSaveUpFile.SMTCDR.Bs3"/****************//*******************************************//*****************统一存储******************/#define	CONF_UNION_CDR_BS				"CdrFiltration.FileSaveRule.UniteSaveUpFile.Bs"#define	CONF_UNION_CDR_BS2				"CdrFiltration.FileSaveRule.UniteSaveUpFile.Bs2"#define	CONF_UNION_CDR_BS3				"CdrFiltration.FileSaveRule.UniteSaveUpFile.Bs3"/*******************************************//*****************网元存储******************//******GGSN******/#define	CONF_GGSN_CDR_BS				"CdrFiltration.FileSaveRule.GGSNAndSGSNAddrSaveUpFile.GGSN.Bs"#define	CONF_GGSN_CDR_BS2				"CdrFiltration.FileSaveRule.GGSNAndSGSNAddrSaveUpFile.GGSN.Bs2"#define	CONF_GGSN_CDR_BS3				"CdrFiltration.FileSaveRule.GGSNAndSGSNAddrSaveUpFile.GGSN.Bs3"/****************//******SGSN******/#define	CONF_SGSN_CDR_BS				"CdrFiltration.FileSaveRule.GGSNAndSGSNAddrSaveUpFile.SGSN.Bs"#define	CONF_SGSN_CDR_BS2				"CdrFiltration.FileSaveRule.GGSNAndSGSNAddrSaveUpFile.SGSN.Bs2"#define	CONF_SGSN_CDR_BS3				"CdrFiltration.FileSaveRule.GGSNAndSGSNAddrSaveUpFile.SGSN.Bs3"/****************//*******************************************//***********传回数据库常量定义**************/#define DB_GCDR							"1"#define DB_MCDR							"2"#define DB_SCDR							"3"#define DB_SMOCDR						"4"#define DB_SMTCDR						"5"#define DB_EACHCDR						"1"#define DB_UNIONCDR						"2"#define DB_GGSSCDR						"3"/*******************************************/#define CONF_BS_PATH					"CdrFiltration.FileSaveRule.Bs"#define CONF_BS2_PATH					"CdrFiltration.FileSaveRule.Bs2"#define CONF_BS3_PATH					"CdrFiltration.FileSaveRule.Bs3"#define CONF_ISSAVEONEFILE				"CdrFiltration.FileSaveRule.SaveUpRule"#define FILE_NAME_OF_CONFIG				"../config/charginggateway.xml"#define COMMON_DIRECTORY				"bill/"#define TEMP_DIRECTORY					"billorigin/"#define STRING_DOT						"."#define STRING_BS_PATH					"../billorigin/"#define STRING_FILE_NAME				"CdrNameTempBack"#define LEN_OF_CDR_FILE_NAME			256#define SERNUMMAX						999999/***********************************************************************Function Name: CTempFileManager*Description: 初始化成员变量*Input: NONE*Output: NONE*Remark: **********************************************************************/CTempFileManager::CTempFileManager(){	// CDR文件生成策略	m_nSaveUpFileType = EACHCDR;	m_bIsTimeInterval = true;	m_nTimeLimitOfCdrSavedForTransferFile = 300;	m_bIsFileSize = true;	m_nSizeLimitOfCdrSavedForTransferFile = 50000000;	m_bIsCdrNum = true;	m_nNumLimitOfCdrSavedForTransferFile = 6000;	// CDR文件命名规范	m_bIsSerialNumToZero = false;	m_bIsSerialNumFixed = false;	m_bIsCloseTimestamp = false;	m_bIsHaveFileHeader = false;	m_mapCFNPManager.clear();	m_mapTempFileAndMacro.clear();	m_mapGgsnAndSgsnFile.clear();	m_mapCdrBsInfo.clear();	m_mapPath.clear();	m_mapTempFileAndBs.clear();	m_mapDBFileCdrInfo.clear();	m_vecCdrCount.clear();	m_pCdrReadForBill = NULL;	m_pCdrReadForBill = new C_CDRReadForBill;	if (NULL == m_pCdrReadForBill)	{		printf("create m_pCdrReadForBill failed!\n");	}}/***********************************************************************Function Name: ~CTempFileManager*Description: 删除成员变量*Input: NONE*Output: NONE*Remark: **********************************************************************/CTempFileManager::~CTempFileManager(){	if (m_pCdrReadForBill != NULL)	{		delete m_pCdrReadForBill;	}	//清空m_mapCFNPManager,删除CFNPManager	map<string, MAPBSOBJECT>::iterator mapIte = m_mapCFNPManager.begin();	map<short,CFNPManager*>::iterator mapBsIte;	for(; mapIte != m_mapCFNPManager.end(); mapIte++)	{		for (mapBsIte = mapIte->second.begin(); mapBsIte != mapIte->second.end(); mapBsIte++)		{			delete mapBsIte->second;		}	}	//清空未保存的文件及其cdr信息,如果该条件满足,说明程序有异常。	if (m_mapDBFileCdrInfo.size() > 0)	{		map<string, VECCDRDBINFO>::iterator mapIte = m_mapDBFileCdrInfo.begin();		vector<S_CDRFILE*>::iterator vecIte;		for(; mapIte != m_mapDBFileCdrInfo.end(); mapIte++)		{			for (vecIte = mapIte->second.begin(); vecIte != mapIte->second.end(); vecIte++)			{				delete (*vecIte);			}		}				m_mapDBFileCdrInfo.clear();		printf("error in ~CTempFileManager file.\n");	}	m_mapCFNPManager.clear();	//清空map	m_mapTempFileAndMacro.clear();	m_mapGgsnAndSgsnFile.clear();	m_mapCdrBsInfo.clear();	m_mapPath.clear();	m_mapTempFileAndBs.clear();	m_vecCdrCount.clear();		if (m_bIsSerialNumToZero)	{		pthread_mutex_destroy(&m_ResetSerialMutex);	}	if (m_bIsTimeInterval)	{		pthread_mutex_destroy(&m_ManagerMutex);	}	if (m_nSaveUpFileType != EACHCDR)	{		pthread_mutex_destroy(&m_UnionMutex);	}	}/***********************************************************************Function Name: Init*Sescription: 从配置文件中获取CDR文件输出策略,进行CDR初始化*Input: NONE*Output: [bool] true--成功; false--失败*Remark: **********************************************************************/bool CTempFileManager::Init(){	bool bRet = false;	//从配置文件中获取CDR文件输出策略	if (!getConfig())	{		return bRet;	}			if (m_bIsSerialNumToZero)	{		//初始化互斥锁		pthread_mutex_init(&m_ResetSerialMutex, NULL);	}	if (m_bIsTimeInterval)	{		//初始化临时文件管理和5种cdr之间的互斥锁		pthread_mutex_init(&m_ManagerMutex, NULL);	}		//各自存储	if (m_nSaveUpFileType == EACHCDR)	{				//GCDR,MCDR,SCDR,SMOCDR,SMTCDR生成文件名变量初始化		if (cdrInit(GCDR) &&			cdrInit(MCDR) &&			cdrInit(SCDR) &&			cdrInit(SMOCDR) &&			cdrInit(SMTCDR))		{			bRet = true;		}	} 	//统一存储	else if(m_nSaveUpFileType == UNIONCDR)	{		//初始化5种cdr之间的互斥锁		pthread_mutex_init(&m_UnionMutex, NULL);		//CDR生成文件名变量初始化		if (cdrInit(CDR))		{			bRet = true;		}	}	//网元存储	else if(m_nSaveUpFileType == GGSSCDR)	{		//初始化5种cdr之间的互斥锁		pthread_mutex_init(&m_UnionMutex, NULL);		//GGSN,SGSN时,CDR生成文件名变量初始化		if (cdrInit(GGSNCDR) && cdrInit(SGSNCDR))		{			bRet = true;		}	}	//清除上次进程遗留的临时文件	clearOldTempFile();	return bRet;}/***********************************************************************Function Name: TempFileManager*Sescription: 重置文件序列号*Input: NONE*Output: [bool] true--成功; false--失败*Remark: 如果需要每天重置文件序列号的开关关闭,那么就不需要该函数来管理*		 临时文件**********************************************************************/bool CTempFileManager::ResetSerialNum(){	bool bRet = true;	char cCurdatetime[LEN_OF_TIME];	int nhour = 0;	int nMin = 0;	int nSec = 0;		memset(cCurdatetime, 0, sizeof(cCurdatetime));	// 得到当前时间	bRet = getCurDateTime(cCurdatetime, &nhour, &nMin, &nSec);	// 序列号零点清0	if (bRet && nhour == 0 && nMin == 0 && nSec == 0)	{		#if IS_Thread_DEBUG		{			printf("\n*****pthread_mutex_lock(&m_ResetSerialMutex) ResetSerialNum Start *****\n");			pthread_mutex_lock( &m_ResetSerialMutex );			printf("\n*****pthread_mutex_lock(&m_ResetSerialMutex) ResetSerialNum End *****\n");		}		#else		{			pthread_mutex_lock( &m_ResetSerialMutex );		}		#endif		// reset the sn to zero		map<string, MAPBSOBJECT>::iterator mapIte = m_mapCFNPManager.begin();		map<short,CFNPManager*>::iterator mapBsIte;		for(; mapIte != m_mapCFNPManager.end(); mapIte++)		{			for (mapBsIte = mapIte->second.begin(); mapBsIte != mapIte->second.end(); mapBsIte++)			{				mapBsIte->second->m_nSerialNum = 1;			}		}		#if IS_Thread_DEBUG		{			printf("\n*****pthread_mutex_unlock(&m_ResetSerialMutex) ResetSerialNum Start *****\n");			//释放锁			pthread_mutex_unlock( &m_ResetSerialMutex );			printf("\n*****pthread_mutex_unlock(&m_ResetSerialMutex) ResetSerialNum End *****\n");			//sleep(1);		}		#else		{			//释放锁			pthread_mutex_unlock( &m_ResetSerialMutex );		}		#endif	}	return bRet;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -