/* 程序名称:recordresend.c 程序内容:话单预警机制话单重发模块 程序作者:周继国 完成日期:2004年05月27日 版权所有:上海新动信息有限公司 cc recordresend.c -I/usr/local/include/mysql -lmysqlclient -L/usr/local/lib/mysql -o recordresend */
#include <stdio.h> #include <string.h> #include <signal.h> #include <mysql.h> #include <mysqld_error.h> #include <my_config.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/errno.h> #include <unistd.h> #include <time.h> #include <md5.h> #include <stdarg.h> //#include <signal.h> //定义配置数据类型 struct INITDATA { char sLogHostName[256]; char sLogDBName[256]; char sLogDBUserName[256]; char sLogDBPassWord[256]; char sLogTableName[256]; char sResendHostName[256]; char sResendDBName[256]; char sResendDBUserName[256]; char sResendDBPassword[256]; char sResendTable[256]; char sServiceCode[256]; char sProvider[256]; char sSender[256]; char sState[256]; }; int GetMonthAndDay(MYSQL mysql,char *mobile_date) { MYSQL_RES *result; char query_string[1024]; MYSQL_ROW row; int num_row; strcpy(query_string,"select DATE_FORMAT(now(),'%Y-%m')"); mysql_real_query(&mysql,query_string,strlen(query_string)); result = mysql_store_result(&mysql); row = mysql_fetch_row(result); strcpy(mobile_date,row[0]); mysql_free_result(result); return 0; } void CurTimeF(char* sTime) { time_t t; struct tm* tm_buf; t = time(0); tm_buf = localtime(&t); sprintf(sTime, "%02d:%02d:%02d",tm_buf->tm_hour,tm_buf->tm_min,tm_buf->tm_sec); } /************ Name : PubAlltrimStr() Paras : char *str Usage : delete the character that you not see. Return : char * ************/ char* PubAlltrimStr( char *str ) { int len; int i; char *s; char filterchars[8]; bzero(filterchars, sizeof(filterchars)); strcpy(filterchars, " \t\r\n"); len = strlen(str); for(i = len-1; i >= 0; i--) { if( strchr((char*)filterchars, str[i]) == NULL ) { str[i+1] = ''; break; } } s = str; for(i = 0; i < len; i++) { if( strchr((char*)filterchars, *s) != NULL ) { s++; } else { break; } } if(s != str) memmove(str, s, strlen(s) + 1); return str; } /************ Name : PubReadCfg() Paras : char *filename,char *option,int flag, flag > 0; Usage : get the option from the config file Return : int . 0 successfully,1 have the option in the config file but no configured , -100 can not open configure file, -1 not found ***********/ int PubReadCfg(char *filename, char *option, int flag) { char str[255+1]; char *fret; int i=0; int ret=-1; int isequl=0; int count=0; char head[254]; char tail[254]; FILE *fp; int len_str; fp = fopen(filename, "r"); if (fp == NULL) { printf("\nCan not open %s!\n", filename); return -100; } while(1) { memset(str, '', sizeof(str)); memset(head, '', sizeof(head)); memset(tail, '', sizeof(tail)); fret = fgets(str, 255, fp); if(fret == NULL) break; if( strlen(str) >= 255 ) { printf(" %s: fromat error!\n",filename); break; } len_str = strlen(str); for(i=0; i<len_str; i++) { if (str[i] == '=') break; } if(i >= len_str - 1) { continue; } strncpy(tail, str+i+1, strlen(str)-i-1); if(strlen(tail) != 0) { memset(&str[i], '', strlen(tail)); } else { memset(&str[i], '', 1); } PubAlltrimStr(&str[0]); strcpy(head, &str[0]); PubAlltrimStr(option); isequl=strcmp(option, head); if (isequl != 0) continue; else { count++; if(count == flag) { if( strlen(tail) == 0 ) { memset(option, '', sizeof(option)); ret = 1; } else { memset(option, '', sizeof(option)); PubAlltrimStr(tail); strcpy(option, tail); ret = 0; } PubAlltrimStr(option); break; } else continue; } } fclose(fp); if (ret == -1) memset(option, '', sizeof(option)); return(ret); } void log ( char *sLogFileName, char* fmt, // 格式化字符串 ... // 可变参数 ) { FILE *fp; va_list ap; char sLog[1024]; // 错误记录字符串 char sErrDesc[1024]; char sTime[20]; char szDate[9]; // 取得当前时间 CurTimeF(sTime); // 生成错误记录字符串 strcpy(sLog, sTime); // 当前时间 strcat(sLog, "\t"); va_start(ap, fmt); vsprintf(sErrDesc, fmt, ap); va_end(ap); strcat(sLog, sErrDesc); if(sErrDesc[strlen(sErrDesc) - 1] != '\n') strcat(sLog, "\n"); // CurDateS(szDate); // strcat(szPathName, "/home/richard/program/dzwww/sgip/log"); // strcat(szPathName, szDate); fp = fopen(sLogFileName,"a+"); while(fp == NULL){ fp = fopen(sLogFileName,"a+"); sleep(1); } fputs(sLog,fp); fclose(fp); } void SigHandler(int sig) { int DeadStatus; pid_t DeadPid; switch(sig) { case SIGUSR2: break; case SIGPIPE: break; // case SIGCLD: // while((DeadPid = waitpid(-1, &DeadStatus, WNOHANG)) > 0) // break; default: break; } } int InitSignal(void) { struct sigaction act; struct sigaction oact; act.sa_handler = SIG_IGN; sigemptyset(&act.sa_mask); sigaddset (&act.sa_mask, SIGINT); act.sa_flags = 0; if (sigaction(SIGINT, &act, &oact) == -1) { perror("install SIGINT failed: "); return -1; } act.sa_handler = SIG_IGN; act.sa_flags = 0; sigemptyset(&act.sa_mask); sigaddset (&act.sa_mask, SIGHUP); if (sigaction(SIGHUP, &act, &oact) == -1) { perror("install SIGHUP failed: "); return -1; } act.sa_handler = SIG_IGN; act.sa_flags = 0; sigemptyset(&act.sa_mask); sigaddset (&act.sa_mask, SIGQUIT); if (sigaction(SIGQUIT, &act, &oact) == -1) { perror("install SIGQUIT failed: "); return -1; } act.sa_handler = SIG_IGN; act.sa_flags = 0; sigemptyset(&act.sa_mask); sigaddset (&act.sa_mask, SIGTERM); if (sigaction(SIGTERM, &act, &oact) == -1) { perror("install SIGTERM failed: "); return -1; } act.sa_handler = &SigHandler; act.sa_flags = 0; sigemptyset(&act.sa_mask); sigaddset (&act.sa_mask, SIGUSR2); if (sigaction(SIGUSR2, &act, &oact) == -1) { perror("install SIGALRM failed: "); return -1; } act.sa_handler = &SigHandler; act.sa_flags = 0; sigemptyset(&act.sa_mask); sigaddset (&act.sa_mask, SIGPIPE); if (sigaction(SIGPIPE, &act, &oact) == -1) { perror("install SIGPIPE failed: "); return -1; } } int main() { MYSQL_RES *resResult,*resResult1; MYSQL_ROW rowRow,rowRow1; MYSQL mysqlLog,mysqlResend; char sQueryString[1024],sTempString[256],sTempString2[256]; int iRowNumber; struct INITDATA stInitData; int iReturnCode; char sLogFileName[256],sConfigFileName[256]; char stime[20]; char fmt[256]; char sendtime[30]; InitSignal(); strcpy(sLogFileName,"recordresend.log"); strcpy(sConfigFileName,"recordresend.ini"); strcpy(sTempString,"LogHostName"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sLogHostName,sTempString); strcpy(sTempString,"LogDBName"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sLogDBName,sTempString); strcpy(sTempString,"LogDBUserName"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sLogDBUserName,sTempString); strcpy(sTempString,"LogDBPassWord"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sLogDBPassWord,sTempString); strcpy(sTempString,"LogTableName"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sLogTableName,sTempString); strcpy(sTempString,"ResendHostName"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sResendHostName,sTempString); strcpy(sTempString,"ResendDBName"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sResendDBName,sTempString); strcpy(sTempString,"ResendDBUserName"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sResendDBUserName,sTempString); strcpy(sTempString,"ResendDBPassword"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sResendDBPassword,sTempString); strcpy(sTempString,"ResendTable"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sResendTable,sTempString); strcpy(sTempString,"ServiceCode"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sServiceCode,sTempString); strcpy(sTempString,"Provider"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sProvider,sTempString); strcpy(sTempString,"Sender"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sSender,sTempString); strcpy(sTempString,"State"); iReturnCode = PubReadCfg( sConfigFileName, sTempString, 1 ); if( iReturnCode == -100 ) { strcpy(fmt,"Open configure file error!\n"); log(sLogFileName,fmt); return -1; } if(iReturnCode == 0) strcpy(stInitData.sState,sTempString); //创建话单日志表连接 if(!mysql_init(&mysqlLog)) { strcpy(fmt,"创建话单日志表句柄失败!\n"); log(sLogFileName,fmt); return -1; } if(!mysql_real_connect (&mysqlLog,stInitData.sLogHostName,stInitData.sLogDBUserName,stInitData.sLogDBPassWord,stInitData.sLogDBName,0,NULL,0)) { mysql_close(&mysqlLog); strcpy(fmt,"创建话单日志表连接失败!\n"); log(sLogFileName,fmt); return -1; } //创建重发话单表连接 if(!mysql_init(&mysqlResend)) { strcpy(fmt,"创建重发话单表句柄失败!\n"); log(sLogFileName,fmt); return -1; } if(!mysql_real_connect (&mysqlResend,stInitData.sResendHostName,stInitData.sResendDBUserName,stInitData.sResendDBPassword,stInitData.sResendDBName,0 ,NULL,0)) { mysql_close(&mysqlResend); strcpy(fmt,"创建重发话单表连接失败!\n"); log(sLogFileName,fmt); return -1; } GetMonthAndDay(mysqlResend,sendtime); //查询话单日志表 memset(sQueryString, 0, sizeof(sQueryString)); strcat(sQueryString,"select * from "); strcat(sQueryString,stInitData.sLogDBName); strcat(sQueryString,"."); strcat(sQueryString,stInitData.sLogTableName); strcat(sQueryString," where ss_provider = '"); strcat(sQueryString,stInitData.sProvider); strcat(sQueryString,"' and ss_submit_time like '"); strcat(sQueryString,sendtime); strcat(sQueryString,"%' and ss_send = '0' and "); strcat(sQueryString,stInitData.sState); if(strlen(stInitData.sServiceCode)!=0) { strcat(sQueryString," and ss_service_code = '"); strcat(sQueryString,stInitData.sServiceCode); strcat(sQueryString,"'"); } mysql_real_query(&mysqlLog, sQueryString, strlen(sQueryString)); resResult = mysql_store_result(&mysqlLog); log(sLogFileName,"%s\n",sQueryString); //更新话单日志表、重新发送表 iRowNumber = (unsigned int)(mysql_num_rows(resResult)); if ( iRowNumber != 0) { while( (rowRow = mysql_fetch_row(resResult)) != NULL) { //更新话单日志表 memset(sQueryString, 0, sizeof(sQueryString)); strcat(sQueryString,"update "); strcat(sQueryString,stInitData.sLogDBName); strcat(sQueryString,"."); strcat(sQueryString,stInitData.sLogTableName); strcat(sQueryString," set ss_send = '1' where ss_service_code = '"); strcat(sQueryString,rowRow[0]); strcat(sQueryString,"' and ss_mobile = '"); strcat(sQueryString,rowRow[1]); strcat(sQueryString,"' and ss_provider = '"); strcat(sQueryString,stInitData.sProvider); strcat(sQueryString,"' and ss_submit_time like '"); strcat(sQueryString,sendtime); strcat(sQueryString,"%' and ss_send = '0' and "); strcat(sQueryString,stInitData.sState); mysql_real_query(&mysqlLog, sQueryString, strlen(sQueryString)); // strcpy(fmt,sQueryString); // strcat(fmt,"\n"); log(sLogFileName,"%s\n",sQueryString); //更新话单重发表 memset(sQueryString, 0, sizeof(sQueryString)); strcat(sQueryString,"insert into "); strcat(sQueryString,stInitData.sResendDBName); strcat(sQueryString,"."); strcat(sQueryString,stInitData.sResendTable); strcat(sQueryString," values(NULL,'"); strcat(sQueryString,rowRow[0]); strcat(sQueryString,"','"); strcat(sQueryString,rowRow[1]); strcat(sQueryString,"','"); strcat(sQueryString,rowRow[4]); strcat(sQueryString,"','"); strcat(sQueryString,stInitData.sSender); strcat(sQueryString,"','"); strcat(sQueryString,rowRow[3]); strcat(sQueryString,"',now())"); mysql_real_query(&mysqlResend, sQueryString, strlen(sQueryString)); log(sLogFileName,"%s\n",sQueryString); } mysql_free_result(resResult); } mysql_close(&mysqlLog); mysql_close(&mysqlResend); return 0; }
|