📄 cisrecv.cpp
字号:
/*********************************************************************************函数说明:从mqin目录获取报文文件存数据库**版本号 |修改时间 |修改说明*v1.01 |20070717 |增加410大报文处理,超过50K做文件处理;注释重复产生序列号部分**********************************************************************************////////////////////////////////////////#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <sys/time.h>#include <dirent.h>#include <unistd.h>#include <time.h>#include "MbToCis.h"#include "CisPub.hpp"//全局变量SybServer m_clsSybServer;BepsPub sCis;//从mqin获取待处理报文int GetCisData(RECVDATA *sRecvData ,char *filename );//连接数据库int connectToDB( char *dbname , char *username , char *passwd , char *wkname){ if(!m_clsSybServer.Open(dbname,username ,passwd)) { filelog(ERRLOG,"连接数据库[%s][%s][%s]失败!\n",dbname,username,passwd); return -1; } filelog(STEP,"连接数据库[%s][%s][%s]成功!\n",dbname,username,passwd); if(!m_clsSybServer.SetWrkDb(wkname)) { filelog(ERRLOG,"切换数据库[%s]失败!\n" , wkname); return -1; } filelog(STEP,"切换数据库[%s]成功\n" , wkname); return 0;}//断开数据库连接int disConnectToDB(){ m_clsSybServer.Close(); filelog(STEP,"断开数据库连接!\n"); return 0;}/****************************************************************************** *函数说明:保存报文文件到数据库 * *****************************************************************************/int SaveRecvData( RECVDATA *sRecvData, char *retMsg ){ char sSqlCmd[1024*100]; char WorkDate[9]; char CmtNo[4]; int ret=0; memset( sSqlCmd , 0 , sizeof( sSqlCmd )); memset( CmtNo , 0 , sizeof( CmtNo )); memset( WorkDate , 0 , sizeof( WorkDate )); memcpy( CmtNo , sRecvData->msgid + 3 , 3); sCis.BeginTrans(); sprintf( sSqlCmd , "insert into recv_data values(%d,'%s','%s','%s','%s','%s')", sRecvData->dataidx,sRecvData->orgno,sRecvData->workdate,sRecvData->doflag,sRecvData->msgid , sRecvData->msgcontent); ret = sCis.SaveCisData("recv_data",sSqlCmd,retMsg); if( ret <= 0 ) { printf("SaveRecvData error![%s]\n",sSqlCmd); sCis.RollbackTrans(); return -1; } sCis.CommitTrans(); return 0;}int SaveDataToFile( RECVDATA *sRecvData, char *retMsg ){ return 0;}//入口void main(int argc, char* argv[]){ char Tmp[2048*1024]; //显示其版本号 if(argc == 2 && (memcmp(argv[1], "-v", 2)==0||memcmp(argv[1], "-V", 2)==0)) { printf("System verison is: Direct CIS CISProc V1.1\n"); exit(0); } //使主进程成为守护进程 pid_t main_pid =0; main_pid = fork(); if(0!= main_pid) { exit(0); } int ret; char doflag[1+1],filename[100],filename1[100]; char CisNo[3+1]; char retMsg[255+1]; char Password[20]; RECVDATA sRecvData; int fflag = 0; int len = 0; memset( doflag , 0 , sizeof( doflag)); memset( CisNo , 0 , sizeof( CisNo )); memset( &sRecvData , 0 , sizeof( sRecvData )); memset( retMsg , 0 , sizeof( retMsg )); memset( Password , 0 , sizeof( Password )); sprintf( Password , "%s", getenv("PASSWORD")); char DBUserName[10]; memset( DBUserName , 0 , sizeof(DBUserName)); strcpy( DBUserName , getenv("DBUSERNAME")); StrTrim(DBUserName , ' '); if( strlen( DBUserName ) == 0 ) { strcpy( DBUserName , "sa"); } printf("DBUserName = [%s]\n", DBUserName ); ret = connectToDB( "SYBASE" , DBUserName , Password , "DIRWAYSDB"); if( ret != 0 ) { filelog(ERRLOG,"[CisRecv]连接数据库失败!\n"); printf("连接数据库失败!\n"); return ; }/*****版本授权控制 int flag = 0; ret = sCis.CheckSerail(&flag); if( flag != 0) { printf("system not permission exit!\n"); exit(0); }*****/ while(1) { memset( filename , 0 , sizeof(filename)); memset( filename1 , 0 , sizeof(filename1)); memset( CisNo , 0 , sizeof(CisNo)); memset( &sRecvData , 0 , sizeof(sRecvData)); memset( Tmp , 0 , sizeof(Tmp)); //从消息中间件获取来帐报文 ret = GetCisData( &sRecvData ,filename); if( ret < 0 ) { printf("未发现待处理来报......\n"); sleep(5); continue; } strcpy( Tmp , sRecvData.msgcontent); //printf("Tmp[cisrecv] = [%s]\n", Tmp ); memcpy( CisNo, sRecvData.msgid+3, 3 ); switch( atoi(CisNo) ) { case 100: case 101:// case 411: //报文存文件处理 sprintf(filename1 , "%s/filein/%s%08s%08d",getenv("WORKDIR"),CisNo,sRecvData.workdate,sRecvData.dataidx); memset( sRecvData.msgcontent,0,sizeof(sRecvData.msgcontent)); memcpy( sRecvData.msgcontent,filename1,strlen(filename1)); ret = SaveRecvData( &sRecvData, retMsg ); break; case 410: //增加大报文文件处理// len = strlen( sRecvData.msgcontent ); //大于50K做文件处理大小来源于CISPROC// if (len > 1024*50) fflag = 1; if(fflag == 1) { sprintf(filename1 , "%s/filein/%s%08s%08d",getenv("WORKDIR"),CisNo,sRecvData.workdate,sRecvData.dataidx); memset( sRecvData.msgcontent,0,sizeof(sRecvData.msgcontent)); memcpy( sRecvData.msgcontent,filename1,strlen(filename1)); sprintf( sRecvData.msgcontent, "{F:%s}", filename1 ); } ret = SaveRecvData( &sRecvData, retMsg ); break; case 201: case 301: case 302: case 303: case 305: case 307: case 308: case 309: case 310: case 405: case 406: case 407: case 408: case 409: case 412: case 413: case 414: case 601: case 402: case 404: //接收报文入库 ret = SaveRecvData( &sRecvData, retMsg ); break; default: printf( "未定义报文:[%s]\n", CisNo ); filelog( ERRLOG, "[CisRecv]接收到未定义报文:[%s]\n", CisNo ); unlink(filename); sleep(1); continue; } if( ret < 0 ) { //修改recv_data处理状态位 strcpy( doflag, "3" ); printf("解析报文[%s]出错:%s\n", sRecvData.msgid, retMsg); filelog(ERRLOG, "[CisRecv]解析报文[%s]出错:%s\n", sRecvData.msgid, retMsg); } else strcpy( doflag, "1" ); //更改接收报文队列表报文处理状态 /******************* ret = sCis.SetDoflag( "recv_data",&sRecvData.dataidx, doflag, retMsg ); ********************/ //大报文存文件处理 if( fflag == 1 || strncmp(CisNo ,"100",3) == 0||strncmp( CisNo,"101",3) == 0 ||strncmp( CisNo,"411",3) == 0) { FILE *fp = NULL; fp = fopen( filename1,"w+"); if( fp == NULL) { printf("Open[w] file[%s] error!\n",filename); return ; } fwrite( Tmp , strlen(Tmp),1,fp); fclose(fp); } //删除mqin目录下报文文件 ret = unlink(filename); if( ret < 0 ) { printf("更改报文[%s]处理状态失败:%s\n", sRecvData.msgid,retMsg ); filelog(ERRLOG, "[CisRecv]更改报文[%s]处理状态失败:%s\n", sRecvData.msgid,retMsg ); } printf("报文[%s]处理成功!\n", CisNo); sleep(1);// filelog(CISPROLOG, SIGNLIMIT); } return;}/****************************************************************************** *函数说明:从mqin目录获取报文文件 * *****************************************************************************/int GetCisData(RECVDATA *sRecvData ,char *filename ){ int ret = 0; DIR *dirp = NULL; struct dirent *filedir = NULL; char Path[100],Tmp[1024+1]; FILE *fp = NULL; char CmtNo[4],flag = 0; char TmpData[2048*1024]; char retMsg[255]; char tail[1+1]; int Time; struct stat FileStat; memset( CmtNo , 0 ,sizeof( CmtNo )); memset( TmpData , 0 ,sizeof( TmpData )); memset( Path , 0 ,sizeof( Path )); memset( tail, 0, sizeof(tail) ); sprintf( Path, "%s/mqin", getenv("WORKDIR")); dirp = opendir( Path ); if( dirp == NULL ) { printf("Opendir [%s] error!\n", Path ); return -1; } while((filedir = readdir(dirp)) != NULL) { memset( filename , 0 , sizeof( filename)); if( filedir->d_name[0] != '.') { sprintf(filename , "%s/%s",Path,filedir->d_name); printf("+++++++++read file = [%s]\n", filename); flag = 1; break; } } closedir(dirp); //增加了文件修改时间判断 , 确保文件被完全写完 if( flag == 0 ) { return -1; } else { flag = 0; Time = time(NULL); stat(filename ,&FileStat); if( (Time - FileStat.st_mtime) < 6 ) { printf("File[%s] may be not creat!Try....\n",filename); return -1; } } fp = fopen( filename , "r+"); if( fp == NULL ) { printf("Open file[%s] failed!\n", filename ); return -1; } while(!feof(fp)) { memset( Tmp , 0 , sizeof( Tmp)); ret = fread( Tmp , 1024 , 1 , fp); if( ret >= 0) { strcat( TmpData , Tmp ); } } fclose(fp); if(!sCis.MakeTrxsSerialNo(&sRecvData->dataidx,retMsg,DATAID)) return -1; memcpy( tail, TmpData + strlen(TmpData)-1, 1 ); if( strcmp( tail, "}" ) != 0 ) strcat( TmpData, "}" ); sprintf( sRecvData->msgcontent,"%s",&TmpData[1]);// sprintf( sRecvData->msgcontent,"%s",TmpData);// printf("Have GetCis = [%s]\n",sRecvData->msgcontent);// filelog("Tmpdata.log", TmpData );// filelog("msgcon.log", sRecvData->msgcontent ); //间连报文结构:报文号为57位 //memcpy( CmtNo , sRecvData->msgcontent + 57 , 3); //直连连报文结构:报文号为11位 memcpy( CmtNo , sRecvData->msgcontent + 11 , 3); sprintf( sRecvData->msgid,"CIS%s", CmtNo); printf("CmtNo = [%s]\n", CmtNo ); char *Begin = NULL; Begin = strstr( sRecvData->msgcontent , ":30A:"); memcpy( sRecvData->workdate , Begin + 5 , 8); Begin = NULL; strcpy( sRecvData->doflag , "0"); Begin = strstr( sRecvData->msgcontent , ":D21:"); memcpy( sRecvData->orgno , Begin + 5 , 12); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -