📄 ctempfilemanager.cpp
字号:
/* * 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 + -