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

📄 ctempfilemanager.cpp

📁 Mysql的处理
💻 CPP
📖 第 1 页 / 共 5 页
字号:
							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 + -