📄 ctempfilemanager.cpp
字号:
FileOpeningTimeStamp, LastestCDRAppendedTimeStamp, 0, FileSequNum, NumOfNowCDRFile, NULL, 0, 0); } // billorigin目录下的临时文件重命名 int i = rename(cTempName, CdrSaveFileNameBack); if (i == -1) { printf("Rename file name failed!\n"); return false; } // 将billorigin目录下文件copy到bill目录下 char sysCommond[LEN_OF_CDR_FILE_NAME]; memset(sysCommond, 0, sizeof(sysCommond)); snprintf(sysCommond, LEN_OF_CDR_FILE_NAME, "cp %s %s", CdrSaveFileNameBack, CdrSaveFileName); system(sysCommond); (pCFNPManager->m_nSerialNum)++; updateDB(cTempName, CdrSaveFileName); //如果临时文件已经另存过了,则在map中删除该文件 deleteTempFile(cTempName); return true;}/***********************************************************************Function Name: saveTempFile*Sescription: Cdr保存文件3种触发条件*Input: [const string&] 5种存储方式对应的宏* [const short] 对应的三种bs之一* [const int] CDR的长度* [char*] 临时文件的名字* [char*] 重新命名后的名字* [CFNPManager*] *Output: [int] -1表示保存但失败; 0表示没有保存;1表示保存并且成功*Remark: **********************************************************************/int CTempFileManager::saveTempFile(const string& strCdr, const short nBs, const int nCDRLength, char* cTempName, char* NODEID, CFNPManager* pCFNPManager){ int nRet = 0; char cGgsnAddr[LEN_OF_ADDRESS+1]; memset(cGgsnAddr, 0, sizeof(cGgsnAddr)); // 根据时间, 保存文件 if (m_bIsTimeInterval) { if (isTimeOfTempFileReached(pCFNPManager->m_nTimeOfCdrFiltered)) { nRet = 1; if (!saveFile(strCdr, nBs, cTempName, NODEID, pCFNPManager, cGgsnAddr)) { nRet = -1; printf("save file for time is failed.\n"); } #if IS_DEBUG printf("save file for time is succeed.\n"); #endif return nRet; } } // 根据文件大小, 保存文件 if (m_bIsFileSize) { if (pCFNPManager->m_nSizeOfCdrSavedForTransforFile + nCDRLength > m_nSizeLimitOfCdrSavedForTransferFile) { nRet = 1; if (!saveFile(strCdr, nBs, cTempName, NODEID, pCFNPManager, cGgsnAddr)) { nRet = -1; printf("save file for size is failed.\n"); } #if IS_DEBUG printf("save file for size is succeed.\n"); #endif return nRet; } } //根据文件数目, 保存文件 if (m_bIsCdrNum) { if (pCFNPManager->m_nNumOfCdrSavedForTransforFile >= m_nNumLimitOfCdrSavedForTransferFile) { nRet = 1; if (!saveFile(strCdr, nBs, cTempName, NODEID, pCFNPManager, cGgsnAddr)) { nRet = -1; printf("save file for number is failed.\n"); } #if IS_DEBUG printf("save file for number is succeed.\n"); #endif return nRet; } } return nRet;}/***********************************************************************Function Name: ggsnAndSgsnFileTempOpr*Sescription: 当为网元时,临时文件的操作处理*Input: [const CDRINFO&] CDR的信息* [CFNPManager*] *Output: [bool] true--成功; false--失败*Remark: **********************************************************************/bool CTempFileManager::ggsnAndSgsnFileTempOpr(const CDRINFO& sCdrInfo, CFNPManager* pCFNPManager){ sFILEINFO sFileInfo; int i = 0; char cAddrTempBack[LEN_OF_CDR_FILE_NAME]; typedef pair<string, sFILEINFO> pairAddr; map<string, string>::iterator mapManagerIte; memset(cAddrTempBack, 0, sizeof(cAddrTempBack)); //得到三种存储方式对应的宏 string strCdr = getCdrStringFromMacro(sCdrInfo.strCdr); char cAddr[LEN_OF_ADDRESS+1]; memset(cAddr, 0, sizeof(cAddr)); strcpy(cAddr, sCdrInfo.cGgsnAddr); //得到三种存储方式对应的重新命名后的名字 char NODEID[LEN_OF_CDR_FILE_NAME]; memset(NODEID, 0, sizeof(NODEID)); getCdrSFNameFromMacro(strCdr, NODEID); //得到临时文件名字 char cTempName[LEN_OF_CDR_FILE_NAME]; memset(cTempName, 0, sizeof(cTempName)); getCdrTempFileName(strCdr, sCdrInfo.nBs, cTempName); map<short, MAPMACROADDRINFO>::iterator mapBsGgsnAndSgsnIte; mapBsGgsnAndSgsnIte = m_mapGgsnAndSgsnFile.find(sCdrInfo.nBs); if (mapBsGgsnAndSgsnIte != m_mapGgsnAndSgsnFile.end()) { map<string, MAPADDRANDFILEINFO>::iterator mapGgsnAndSgsnFileIte; mapGgsnAndSgsnFileIte = mapBsGgsnAndSgsnIte->second.find(strCdr); if (mapGgsnAndSgsnFileIte != mapBsGgsnAndSgsnIte->second.end()) { map<string, sFILEINFO>::iterator mapFileAddrIte; mapFileAddrIte = mapGgsnAndSgsnFileIte->second.find(cAddr); if (mapFileAddrIte != mapGgsnAndSgsnFileIte->second.end()) { int nRet = 0; sprintf(cAddrTempBack, "%s.%s", cTempName, cAddr); // 根据时间, 保存文件 if (m_bIsTimeInterval && isTimeOfTempFileReached(mapFileAddrIte->second.nTimeOfCdrFiltered)) { nRet = 1; if (!saveFile(strCdr, sCdrInfo.nBs, cAddrTempBack, NODEID, pCFNPManager, cAddr)) { nRet = -1; printf("save file for time is failed.\n"); } #if IS_DEBUG printf("save file for time is succeed.\n"); #endif } // 根据文件大小, 保存文件 else if (m_bIsFileSize && (mapFileAddrIte->second.nSizeOfCdrSavedForTransforFile + sCdrInfo.nCdrLength > m_nSizeLimitOfCdrSavedForTransferFile)) { nRet = 1; if (!saveFile(strCdr, sCdrInfo.nBs, cAddrTempBack, NODEID, pCFNPManager, cAddr)) { nRet = -1; printf("save file for size is failed.\n"); } #if IS_DEBUG printf("save file for size is succeed.\n"); #endif } //根据文件数目, 保存文件 else if (m_bIsCdrNum && (mapFileAddrIte->second.nNumOfCdrSavedForTransforFile >= m_nNumLimitOfCdrSavedForTransferFile)) { nRet = 1; if (!saveFile(strCdr, sCdrInfo.nBs, cAddrTempBack, NODEID, pCFNPManager, cAddr)) { nRet = -1; printf("save file for number is failed.\n"); } #if IS_DEBUG printf("save file for number is succeed.\n"); #endif } //nRet返回值的含义:-1表示保存但失败; 0表示没有保存;1表示保存并且成功 if (nRet == 0) { writeTempFile(sCdrInfo.strCdr, sCdrInfo.nCdrLength, cAddrTempBack, sCdrInfo.membuf, sCdrInfo.pCDR); // 保存文件的话单大小 mapFileAddrIte->second.nSizeOfCdrSavedForTransforFile += sCdrInfo.nCdrLength; // 保存文件的话单数量 mapFileAddrIte->second.nNumOfCdrSavedForTransforFile++; // 删除临时文件 --- cTempName char TempFile[LEN_OF_CDR_FILE_NAME]; memset(TempFile, 0, sizeof(TempFile)); snprintf(TempFile, LEN_OF_CDR_FILE_NAME, "rm %s", cTempName); system(TempFile); } else if(nRet == 1) { i = rename(cTempName, cAddrTempBack); if (i == -1) { printf("Rename file name failed!\n"); return false; } writeTempFile(sCdrInfo.strCdr, sCdrInfo.nCdrLength, cAddrTempBack, sCdrInfo.membuf, sCdrInfo.pCDR); //保存临时文件创建时间 mapFileAddrIte->second.nTimeOfCdrFiltered = pCFNPManager->m_nTimeOfCdrFiltered; // 保存文件的话单大小 mapFileAddrIte->second.nSizeOfCdrSavedForTransforFile = sCdrInfo.nCdrLength + pCFNPManager->m_nSizeOfCdrSavedForTransforFile; // 保存文件的话单数量 mapFileAddrIte->second.nNumOfCdrSavedForTransforFile++; //结果为1 //由于在saveFile函数里面已经将该笔临时文件对应的数据在map中删除, //所以需要将改名后的文件重新放入map addTempFile(cAddrTempBack, strCdr, sCdrInfo.nBs); } } else { sprintf(cAddrTempBack, "%s.%s", cTempName, cAddr); i = rename(cTempName, cAddrTempBack); if (i == -1) { printf("Rename file name failed!\n"); return false; } writeTempFile(sCdrInfo.strCdr, sCdrInfo.nCdrLength, cAddrTempBack, sCdrInfo.membuf, sCdrInfo.pCDR); //保存临时文件创建时间 sFileInfo.nTimeOfCdrFiltered = pCFNPManager->m_nTimeOfCdrFiltered; // 保存文件的话单大小 sFileInfo.nSizeOfCdrSavedForTransforFile = sCdrInfo.nCdrLength + pCFNPManager->m_nSizeOfCdrSavedForTransforFile; // 保存文件的话单数量 sFileInfo.nNumOfCdrSavedForTransforFile++; //结果为1 mapGgsnAndSgsnFileIte->second.insert(pairAddr(cAddr, sFileInfo)); addTempFile(cAddrTempBack, strCdr, sCdrInfo.nBs); } } else { sprintf(cAddrTempBack, "%s.%s", cTempName, cAddr); i = rename(cTempName, cAddrTempBack); if (i == -1) { printf("Rename file name failed!\n"); return false; } writeTempFile(sCdrInfo.strCdr, sCdrInfo.nCdrLength, cAddrTempBack, sCdrInfo.membuf, sCdrInfo.pCDR); //保存临时文件创建时间 sFileInfo.nTimeOfCdrFiltered = pCFNPManager->m_nTimeOfCdrFiltered; // 保存文件的话单大小 sFileInfo.nSizeOfCdrSavedForTransforFile = sCdrInfo.nCdrLength + pCFNPManager->m_nSizeOfCdrSavedForTransforFile; // 保存文件的话单数量 sFileInfo.nNumOfCdrSavedForTransforFile++; //结果为1 MAPADDRANDFILEINFO mapFileAddr; mapFileAddr.insert(pairAddr(cAddr, sFileInfo)); typedef pair<string, MAPADDRANDFILEINFO> pairGGSS; mapBsGgsnAndSgsnIte->second.insert(pairGGSS(strCdr, mapFileAddr)); addTempFile(cAddrTempBack, strCdr, sCdrInfo.nBs); } } else { sprintf(cAddrTempBack, "%s.%s", cTempName, cAddr); i = rename(cTempName, cAddrTempBack); if (i == -1) { printf("Rename file name failed!\n"); return false; } writeTempFile(sCdrInfo.strCdr, sCdrInfo.nCdrLength, cAddrTempBack, sCdrInfo.membuf, sCdrInfo.pCDR); //保存临时文件创建时间 sFileInfo.nTimeOfCdrFiltered = pCFNPManager->m_nTimeOfCdrFiltered; // 保存文件的话单大小 sFileInfo.nSizeOfCdrSavedForTransforFile = sCdrInfo.nCdrLength + pCFNPManager->m_nSizeOfCdrSavedForTransforFile; // 保存文件的话单数量 sFileInfo.nNumOfCdrSavedForTransforFile++; //结果为1 MAPADDRANDFILEINFO mapFileAddr; mapFileAddr.insert(pairAddr(cAddr, sFileInfo)); typedef pair<short, MAPMACROADDRINFO> pairBsGGSS; typedef pair<string, MAPADDRANDFILEINFO> pairGGSS; MAPMACROADDRINFO mapGGSS; mapGGSS.insert(pairGGSS(strCdr, mapFileAddr)); m_mapGgsnAndSgsnFile.insert(pairBsGGSS(sCdrInfo.nBs, mapGGSS)); addTempFile(cAddrTempBack, strCdr, sCdrInfo.nBs); } deleteTempFile(cTempName); return true;}/***********************************************************************Function Name: writeTempFile*Sescription: 将CDR写入临时文件*Input: [const string&] 5种存储方式对应的宏* [const int] CDR的长度* [char*] 临时文件的名字* [const char*] 存储数据的buffer* [void*] 存储5种CDR对应的指针*Output: NONE*Remark: **********************************************************************/void CTempFileManager::writeTempFile(const string& strCdr, const int nCDRLength, char* cTempName, const char* membuf, void* pCDR){ //判断文件是否存在,如果不存在则可能逻辑存在错误;该判断在最终版本中应该删除 if (access(cTempName, F_OK) == 0) { #if IS_DEBUG printf("\n------Save one Cdr into temp file start!------\n\n"); #endif FILE* fpBack; fpBack = fopen(cTempName, "a+"); if (fpBack == NULL) { printf("Error in writeTempFile function! Open file failed.\n"); printf("%s error\n", cTempName); return; } fwrite(membuf, sizeof(char), nCDRLength, fpBack); // 关闭临时文件 fclose(fpBack); addCdr(strCdr, cTempName, pCDR); #if IS_DEBUG printf("\n------Save one Cdr into temp file ok!------\n\n"); #endif } else { printf("Error in writeTempFile function! Don't find file.\n"); }}/***********************************************************************Function Name: addTempFile*Sescription: 保存未另存的临时文件和其对应宏串*Input: [const string&] 临时文件名字* [const string&] 5种存储方式对应的宏* [const short] 对应的三种bs之一*Output: NONE*Remark: **********************************************************************/void CTempFileManager::addTempFile(const string& strTempFileName, const string& strCdr, const short nBs){ typedef pair<string, string> pairTemp; if (m_mapTempFileAndMacro.find(strTempFileName) == m_mapTempFileAndMacro.end()) { m_mapTempFileAndMacro.insert(pairTemp(strTempFileName, strCdr)); } else { //程序逻辑中不存在重复插入相同文件名的情况 printf("Error in addTempFile function! Repeat insert file."); } typedef pair<string, short> pairBs; if (m_mapTempFileAndBs.find(strTempFileName) == m_mapTempFileAndBs.end()) { m_mapTempFileAndBs.insert(pairBs(strTempFileName, nBs)); } else { //程序逻辑中不存在重复插入相同文件名的情况 printf("Error in addTempFile function! Repeat insert file."); }}/***********************************************************************Function Name: deleteTempFile*Sescription: 如果临时文件已经另存过了,则在map中删除该文件*Input: [const string&] 临时文件名字*Output: NONE*Remark: **********************************************************************/void CTempFileManager::deleteTempFile(const string& strTempFileName){ map<string, string>::iterator mapManagerIte; mapManagerIte = m_mapTempFileAndMacro.find(strTempFileName); if (mapManagerIte != m_mapTempFileAndMacro.end()) { m_mapTempFileAndMacro.erase(mapManagerIte); } map<string, short>::iterator mapBsIte; mapBsIte = m_mapTempFileAndBs.find(strTempFileName); if (mapBsIte != m_mapTempFileAndBs.end()) { m_mapTempFileAndBs.erase(mapBsIte); }}/***********************************************************************Function Name: getAddrForGgsnAndSgsn*Sescription: 得到GGSN和SGSN地址*Input: [const string&] 5种存储方式对应的宏* [const short] 对应的三种bs之一* [const string&] 临时文件名字* [char*] GGSN或SGSN地址*Output: NONE*Remark: **********************************************************************/void CTempFileManager::getAddrForGgsnAndSgsn(const string& strCdr, const short nBs, const string& strFileName, char* cGgsnOrSgsnAddr){ memset(cGgsnOrSgsnAddr, 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -