#include "cdr.h" #include "../../../omcLib/c_program/ftp/ftp.h" #include #include extern cdr_sys cdr_sys_set[MAX_SYS_NUM]; extern int cdr_sys_num; extern cdr_src cdr_src_set[MAX_SRC_NUM]; extern int cdr_src_num; extern void cdr_log(const char *fmt, ...); #define CDR_ALARM_FLAG 0 #define MNG_STATE_IDLE 0 #define MNG_STATE_PREPARE 1 #define MNG_STATE_GENERATE_CSV 2 #define MNG_STATE_CHECK_CSV 3 #define MNG_STATE_GET_SYS 4 static char mng_sqlstr[8192]; #define MNG_CLEAR_STATE_IDLE 0 #define MNG_CLEAR_STATE_PREPARE 1 #define MNG_CLEAR_STATE_GET_TABLE 2 #define MNG_CLEAR_STATE_CLEAR_TABLE 3 typedef struct _cdr_file_mng { int time_instance; int cur_generate_timeout; int generate_timeout; //4 -> 60 minutes generate a file //2 -> 30 minutes generate a file //1 -> 15 minutes generate a file char sending_dir[128]; // Zed baicells requirement by simon -- char dailycdr_sending_dir[128]; // ---end int backup_flag; // Zed baicells requirement by simon -- int dailycdr_backup_flag; // ---end int state; unsigned long prepare_time; unsigned long start_time; int cdr_src_index; /* Fixed for Norfolk EMS CDR lost issue by simon * Store second number when time to be changed * --begin */ int tc_sec; /* --end * */ char last_create_file[256]; }_cdr_file_mng; _cdr_file_mng cdr_file_mng; typedef struct _table_mng { int state; int table_count; int cur_table_index; char table_name[512][32]; unsigned long prepare_time; unsigned long start_time; }_table_mng; _table_mng table_mng; #define MAX_SMS_NOTE_SYS 32 typedef struct _sms_note_sys { int sysTypeNo; char sysTypeName[32]; int need_alarm; int need_sms; int msisdn_count; char msisdn[4][32]; }_sms_note_sys; #define ONE_DAY_SECONDS (24*60*60) #define ONE_HOUR_SECONDS (60*60) #define ONE_QUARTER_SECONDS (15*60) #define ONE_MIN_SECONDS 60 #define HALF_MIN_SECONDS 30 #define TEN_SECONDS 10 #define TWO_SECONDS 2 static unsigned long day_countdown; static unsigned long hour_countdown; static unsigned long quarter_countdown; static unsigned long minute_countdown; static unsigned long half_minute_countdown; static unsigned long tensec_countdown; static unsigned long twosec_countdown; static unsigned long prev_time; static unsigned long next_time; unsigned long current_time=0; void cdrdb_init(); void cdrdb_timer(); extern void insertSeriousAlarmLog(int compCode,int alarmCode); int check_csv_file(char *fileName); void read_sms_conf(); int insert_sm(int index,char *fileName); _sms_note_sys sms_note_sys[MAX_SMS_NOTE_SYS]; int sms_note_sys_count=0; void cdr_clock_init(); unsigned long cdr_clock_timer(); void get_parameter(); void create_csv(cdr_src *psrc); void create_csv_tc(cdr_src *psrc); void create_dat_for_wxc1(cdr_src *psrc); int get_time_condition(char *time_condition,char *time_field,char *time_table); int get_time_condition_tc(char *time_condition,char *time_field,char *time_table); void get_tables(); void clear_table(char *table_name); void read_sms_conf() { char sqlstr[256]; MYSQL_RES *res; MYSQL_ROW row; MYSQL *dbConn; char *pstr; cdr_log("[INFO][read_sms_conf]: Read the SMS conf"); dbConn=mysql_conn("localhost","OMC_PUB"); if(dbConn == NULL) cdr_log("[ERR][read_sms_conf]:mysql_conn OMC_PUB\n"); //获得公共参数cdr_store_server的值 sprintf(sqlstr,"select sysTypeNo,sysTypeName,need_alarm,need_sms,sms_receiver FROM OMC_PUB.cdrNotifyConf;"); res=mysql_getres(dbConn,sqlstr); if(res == NULL) { cdr_log("[ERR %d][read_sms_conf]:%s\n",mysql_errno(dbConn),sqlstr); mysql_close(dbConn); return; } memset(sms_note_sys,0,sizeof(sms_note_sys)); //判断是否需要备份 sms_note_sys_count=0; while((row = mysql_fetch_row(res)) != NULL) { sms_note_sys[sms_note_sys_count].sysTypeNo=atoi(row[0]); sprintf(sms_note_sys[sms_note_sys_count].sysTypeName,"%s",row[1]); sms_note_sys[sms_note_sys_count].need_alarm=atoi(row[2]); sms_note_sys[sms_note_sys_count].need_sms=atoi(row[3]); sms_note_sys[sms_note_sys_count].msisdn_count=0; if(sms_note_sys[sms_note_sys_count].need_sms) { pstr=strtok(row[4],","); sprintf(sms_note_sys[sms_note_sys_count].msisdn[sms_note_sys[sms_note_sys_count].msisdn_count],"%s",pstr); sms_note_sys[sms_note_sys_count].msisdn_count++; while((pstr=strtok(NULL,","))) { sprintf(sms_note_sys[sms_note_sys_count].msisdn[sms_note_sys[sms_note_sys_count].msisdn_count],"%s",pstr); sms_note_sys[sms_note_sys_count].msisdn_count++; } } sms_note_sys_count++; } mysql_free_result(res); mysql_close(dbConn); } int insert_sm(int index,char *fileName) { char sqlstr[512]; MYSQL *dbConn; char content[256]; int i; dbConn=mysql_conn("localhost","OMC_PUB"); if(dbConn == NULL) { cdr_log("[ERR][insert_sm]:mysql_conn OMC_PUB\n"); return 0; } for(i=0;i 5*60) { cdr_file_mng.cdr_src_index=0; cdr_file_mng.state=MNG_STATE_GENERATE_CSV; cdr_log("[INFO][cdrdb_timer]:start to create csv file\n"); } break; case MNG_STATE_GENERATE_CSV: //TC Modified //printf("cdr_file_mng.cdr_src_index=%d,sysTypeNo=%d,version=%d\n",cdr_file_mng.cdr_src_index,cdr_src_set[cdr_file_mng.cdr_src_index].sysTypeNo,cdr_src_set[cdr_file_mng.cdr_src_index].version); if(cdr_src_set[cdr_file_mng.cdr_src_index].version == 1 && cdr_src_set[cdr_file_mng.cdr_src_index].sysTypeNo == 320){ create_dat_for_wxc1(&cdr_src_set[cdr_file_mng.cdr_src_index]); //printf("sysTypeNo=%d\n",cdr_src_set[cdr_file_mng.cdr_src_index].sysTypeNo); } /* Fixed for Norfolk EMS CDR lost issue by simon * --Begin */ else { create_csv(&cdr_src_set[cdr_file_mng.cdr_src_index]); if (cdr_file_mng.tc_sec >= ((1*60*60) - (5*60)) ) { create_csv_tc(&cdr_src_set[cdr_file_mng.cdr_src_index]); } // for Zeb baicell daily CDR --- if (cdr_src_set[cdr_file_mng.cdr_src_index].version == 3 && cdr_src_set[cdr_file_mng.cdr_src_index].sysTypeNo == 320) { create_dailycdr_csv(&cdr_src_set[cdr_file_mng.cdr_src_index]); } // ---end } /* --End * */ cdr_file_mng.state = MNG_STATE_CHECK_CSV; break; case MNG_STATE_CHECK_CSV: #if CDR_ALARM_FLAG == 1 check_csv_file(cdr_file_mng.last_create_file); #endif cdr_file_mng.state=MNG_STATE_GET_SYS; break; case MNG_STATE_GET_SYS: cdr_file_mng.cdr_src_index++; if(cdr_file_mng.cdr_src_index == cdr_src_num) { /* Fixed for Norfolk EMS CDR lost issue by simon * --Begin */ cdr_file_mng.tc_sec = 0; /* --End * */ cdr_file_mng.state=MNG_STATE_IDLE; } else { cdr_file_mng.state=MNG_STATE_GENERATE_CSV; } break; default: cdr_file_mng.state=MNG_STATE_IDLE; break; } switch(table_mng.state) { case MNG_CLEAR_STATE_IDLE: break; case MNG_CLEAR_STATE_PREPARE: table_mng.start_time+=time_past; if(table_mng.start_time - table_mng.prepare_time > 300) { table_mng.state=MNG_CLEAR_STATE_GET_TABLE; cdr_log("[INFO][cdrdb_timer]:start to clear table\n"); } break; case MNG_CLEAR_STATE_GET_TABLE: get_tables(); table_mng.state=MNG_CLEAR_STATE_CLEAR_TABLE; break; case MNG_CLEAR_STATE_CLEAR_TABLE: if(table_mng.cur_table_index == table_mng.table_count) { table_mng.state=MNG_CLEAR_STATE_IDLE; break; } clear_table(table_mng.table_name[table_mng.cur_table_index]); table_mng.cur_table_index++; break; default: table_mng.state=MNG_CLEAR_STATE_IDLE; break; } } void cdr_clock_init(int tc_sec) { time_t l_time; struct tm *t; int hour,minute,second; l_time=time(NULL); t=localtime(&l_time); hour=t->tm_hour; minute=t->tm_min; second=t->tm_sec; day_countdown=hour*ONE_HOUR_SECONDS + minute*ONE_MIN_SECONDS + second; hour_countdown=minute*ONE_MIN_SECONDS + second; quarter_countdown=(minute*ONE_MIN_SECONDS + second)%ONE_QUARTER_SECONDS; minute_countdown=second; half_minute_countdown=second%HALF_MIN_SECONDS; tensec_countdown=second%TEN_SECONDS; twosec_countdown=second%TWO_SECONDS; current_time=prev_time=next_time=l_time; cdr_file_mng.time_instance=hour*4 + minute/15; cdr_file_mng.cur_generate_timeout=minute/15; cdr_file_mng.cur_generate_timeout%=cdr_file_mng.generate_timeout; /* Fixed for Norfolk EMS CDR lost issue by simon * --Begin */ cdr_file_mng.tc_sec = tc_sec; /* --End * */ cdr_log("[INFO][cdr_clock_init]:time_instance=%d",cdr_file_mng.time_instance); cdr_log("[INFO][cdr_clock_init]:cur_generate_timeout=%d",cdr_file_mng.cur_generate_timeout); cdr_log("[INFO][cdr_clock_init]:generate_timeout=%d",cdr_file_mng.generate_timeout); cdr_log("[INFO][cdr_clock_init]:tc_sec=%d",cdr_file_mng.tc_sec); } unsigned long cdr_clock_timer() { struct tm *t; unsigned long time_past,ret_past; next_time=time(NULL); current_time=next_time; t=localtime((time_t*)&next_time); if(prev_time > next_time) { int hour,minute,second; time_t l_time; cdr_log("[WARN][cdr_clock_timer]:system time has been changed"); l_time=prev_time=next_time=time(NULL); t=localtime(&l_time); hour=t->tm_hour; minute=t->tm_min; second=t->tm_sec; day_countdown=hour*ONE_HOUR_SECONDS + minute*ONE_MIN_SECONDS + second; hour_countdown=minute*ONE_MIN_SECONDS + second; quarter_countdown=(minute*ONE_MIN_SECONDS + second)%ONE_QUARTER_SECONDS; minute_countdown=second; half_minute_countdown=second%HALF_MIN_SECONDS; tensec_countdown=second%TEN_SECONDS; twosec_countdown=second%TWO_SECONDS; } time_past=next_time-prev_time; if(time_past < 0) time_past=0; ret_past=time_past; day_countdown+=time_past; hour_countdown+=time_past; quarter_countdown+=time_past; minute_countdown+=time_past; half_minute_countdown+=time_past; tensec_countdown+=time_past; twosec_countdown+=time_past; if(day_countdown >= ONE_DAY_SECONDS) { time_past=day_countdown % ONE_DAY_SECONDS; day_countdown=time_past; //call the day clock function here } if(hour_countdown >= ONE_HOUR_SECONDS) { time_past=hour_countdown % ONE_HOUR_SECONDS; hour_countdown=time_past; //call the hour clock function here table_mng.state=MNG_CLEAR_STATE_PREPARE; table_mng.prepare_time=time(NULL); table_mng.start_time=table_mng.prepare_time; cdr_log("[INFO][cdr_clock_timer]:prepare to clear table\n"); } if(quarter_countdown >= ONE_QUARTER_SECONDS) { time_past=quarter_countdown % ONE_QUARTER_SECONDS; quarter_countdown=time_past; //call the quarter clock function here cdr_file_mng.time_instance++; cdr_file_mng.time_instance%=96; cdr_file_mng.cur_generate_timeout++; if(cdr_file_mng.cur_generate_timeout == cdr_file_mng.generate_timeout) { cdr_file_mng.cur_generate_timeout=0; cdr_file_mng.state=MNG_STATE_PREPARE; cdr_file_mng.prepare_time=time(NULL); cdr_file_mng.start_time=cdr_file_mng.prepare_time; cdr_log("[INFO][cdr_clock_timer]:prepare to create csv file\n"); } } if(minute_countdown >= ONE_MIN_SECONDS) { time_past=minute_countdown % ONE_MIN_SECONDS; minute_countdown=time_past; //call the minute clock function here } if(half_minute_countdown >= HALF_MIN_SECONDS) { time_past=half_minute_countdown % HALF_MIN_SECONDS; half_minute_countdown=time_past; //call the half-minute clock function here } if(tensec_countdown >= TEN_SECONDS) { time_past=tensec_countdown % TEN_SECONDS; tensec_countdown=time_past; //call the ten-seconds clock function here } if(twosec_countdown >= TWO_SECONDS) { time_past=twosec_countdown % TWO_SECONDS; twosec_countdown=time_past; //call the two-seconds clock function here } prev_time=next_time; return ret_past; } int get_time_condition(char *time_condition,char *time_field,char *time_table) { int start_sec; int end_sec; int start_instance; int end_instance; char end_time_str[64]; char start_time_str[64]; struct tm *end_t,*start_t; unsigned long start_time; end_t=localtime((time_t*)¤t_time); /* Fixed for Norfolk EMS CDR lost issue by simon * --Begin */ int end_year = end_t->tm_year+1900; int end_mon = end_t->tm_mon + 1; int end_day = end_t->tm_mday; int local_time_hour = end_t->tm_hour; /* --End * */ end_instance=cdr_file_mng.time_instance; end_sec=end_instance * 15; cdr_log("[DEBUG][get_time_condition]:end_instance=%02d,end_sec=%02d",end_instance,end_sec); /* Fixed for Norfolk EMS CDR lost issue by simon * --Begin */ int state_time_end_hour = end_sec/60; int state_time_start_hour = 0; cdr_log("[DEBUG][get_time_condition]:state_time_end_hour=%02d,local_time_hour=%02d",state_time_end_hour,local_time_hour); if ( state_time_end_hour != local_time_hour) { cdr_log("[ERROR][get_time_condition]:error for cdr table target! state_time_start_hour=%02d, local_time_hour=%02d", state_time_end_hour, local_time_hour); state_time_end_hour = local_time_hour ; } sprintf(end_time_str,"%04d-%02d-%02d %02d:%02d:00",end_year,end_mon,end_day,state_time_end_hour,end_sec%60); /* --End * */ start_instance=cdr_file_mng.time_instance - cdr_file_mng.generate_timeout; start_sec=start_instance * 15; cdr_log("[DEBUG][get_time_condition]:cdr_file_mng.generate_timeout=%d,start_sec=%d",cdr_file_mng.generate_timeout,start_sec); if(start_instance < 0) { start_instance+=96; start_sec=start_instance * 15; start_time=current_time - 12*60*60; /* Fixed for Norfolk EMS CDR lost issue by simon * --Begin */ struct tm start_tb; start_t=localtime_r((time_t*)&start_time, &start_tb); state_time_start_hour = start_sec/60; cdr_log("[DEBUG][get_time_condition]:state_time_start_hour=%02d,local_time_hour=%02d",state_time_start_hour, local_time_hour); if ( ((state_time_start_hour + 1) % 24) != local_time_hour) { cdr_log("[ERROR][get_time_condition]:error for cdr table target!state_time_start_hour=%02d, local_time_hour=%02d", state_time_start_hour, local_time_hour); state_time_start_hour = (local_time_hour == 0) ? 23 : (local_time_hour - 1); } sprintf(start_time_str,"%04d-%02d-%02d %02d:%02d:00",start_t->tm_year+1900,start_t->tm_mon + 1,start_t->tm_mday,state_time_start_hour,start_sec%60); //when create csv file per hour, keep the old filename if(cdr_file_mng.generate_timeout == 4) sprintf(time_table,"%04d_%02d_%02d_%02d",start_t->tm_year+1900,start_t->tm_mon + 1,start_t->tm_mday,state_time_start_hour); else sprintf(time_table,"%04d_%02d_%02d_%02d_%02d",start_t->tm_year+1900,start_t->tm_mon + 1,start_t->tm_mday,state_time_start_hour,start_sec%60); cdr_log("[DEBUG][get_time_condition]:time_table=%s.",time_table); /* --End * */ } else { /* Fixed for Norfolk EMS CDR lost issue by simon * --Begin */ state_time_start_hour = start_sec/60; cdr_log("[DEBUG][get_time_condition]:state_time_start_hour=%02d,local_time_hour=%02d",state_time_start_hour,local_time_hour); if ( ((state_time_start_hour + 1) % 24) != local_time_hour) { cdr_log("[ERROR][get_time_condition]:error for cdr table target!state_time_start_hour=%02d, local_time_hour=%02d", state_time_start_hour, local_time_hour); state_time_start_hour = (local_time_hour == 0) ? 23 : (local_time_hour - 1); } sprintf(start_time_str,"%04d-%02d-%02d %02d:%02d:00",end_t->tm_year+1900,end_t->tm_mon + 1,end_t->tm_mday,state_time_start_hour,start_sec%60); //when create csv file per hour, keep the old filename if(cdr_file_mng.generate_timeout == 4) sprintf(time_table,"%04d_%02d_%02d_%02d",end_year,end_mon,end_day,state_time_start_hour); else sprintf(time_table,"%04d_%02d_%02d_%02d_%02d",end_year,end_mon,end_day,state_time_start_hour,start_sec%60); cdr_log("[DEBUG][get_time_condition]:time_table=%s",time_table); /* --End * */ } sprintf(time_condition,"%s >= '%s' and %s < '%s'",time_field,start_time_str,time_field,end_time_str); cdr_log("[DEBUG][get_time_condition]:time_condition=%s",time_condition); return state_time_start_hour; } /* Fixed for Norfolk EMS CDR lost issue by simon * --Begin */ int get_time_condition_tc(char *time_condition,char *time_field,char *time_table) { int start_sec; int end_sec; int start_instance; int end_instance; char end_time_str[64]; char start_time_str[64]; struct tm *end_t,*start_t; struct tm time_tm; unsigned long start_time; unsigned long pre_time = current_time - cdr_file_mng.tc_sec + (60 *60); end_t=localtime_r((time_t*)&pre_time, &time_tm); int tc_instance = cdr_file_mng.time_instance - (((cdr_file_mng.tc_sec + 5 * 60) / (60*60)) * 4); end_instance = tc_instance; end_sec=end_instance * 15; int end_year = end_t->tm_year+1900; int end_mon = end_t->tm_mon + 1; int end_day = end_t->tm_mday; int end_hour = end_t->tm_hour; int state_time_end_hour = end_sec/60; int state_time_start_hour = 0; cdr_log("[DEBUG][get_time_condition_tc]:pre_time=%d, tc_sec=%d, tc_instance=%d,end_hour=%2d", pre_time, cdr_file_mng.tc_sec, tc_instance, end_hour); cdr_log("[DEBUG][get_time_condition_tc]:end_instance=%02d,end_sec=%02d, state_time_end_hour=%02d",end_instance,end_sec, state_time_end_hour); if (state_time_end_hour < 0) { state_time_end_hour += 24; } sprintf(end_time_str,"%04d-%02d-%02d %02d:%02d:00",end_year,end_mon,end_day,state_time_end_hour,end_sec%60); start_instance=tc_instance - cdr_file_mng.generate_timeout; start_sec=start_instance * 15; cdr_log("[DEBUG][get_time_condition_tc]:cdr_file_mng.generate_timeout=%d,start_sec=%d",cdr_file_mng.generate_timeout,start_sec); if(start_instance < 0) { start_instance+=96; start_sec=start_instance * 15; start_time=pre_time - 12*60*60; struct tm start_tb; start_t=localtime_r((time_t*)&start_time, &start_tb); state_time_start_hour = start_sec/60; cdr_log("[DEBUG][get_time_condition_tc]:state_time_start_hour=%02d",state_time_start_hour); if ( ((state_time_start_hour + 1) % 24) != state_time_end_hour) { cdr_log("[ERROR][get_time_condition_tc]:error for cdr table target!state_time_start_hour=%02d, state_time_end_hour=%02d", state_time_start_hour, state_time_end_hour); state_time_start_hour = (state_time_end_hour == 0) ? 23 : (state_time_end_hour - 1); } sprintf(start_time_str,"%04d-%02d-%02d %02d:%02d:00",start_t->tm_year+1900,start_t->tm_mon + 1,start_t->tm_mday,state_time_start_hour,start_sec%60); //when create csv file per hour, keep the old filename if(cdr_file_mng.generate_timeout == 4) sprintf(time_table,"%04d_%02d_%02d_%02d",start_t->tm_year+1900,start_t->tm_mon + 1,start_t->tm_mday,state_time_start_hour); else sprintf(time_table,"%04d_%02d_%02d_%02d_%02d",start_t->tm_year+1900,start_t->tm_mon + 1,start_t->tm_mday,state_time_start_hour,start_sec%60); cdr_log("[DEBUG][get_time_condition_tc]:time_table=%s.",time_table); } else { state_time_start_hour = start_sec/60; cdr_log("[DEBUG][get_time_condition_tc]:state_time_start_hour=%02d",state_time_start_hour); if ( ((state_time_start_hour + 1) % 24) != state_time_end_hour) { cdr_log("[ERROR][get_time_condition_tc]:error for cdr table target!state_time_start_hour=%02d, state_time_end_hour=%02d", state_time_start_hour, state_time_end_hour); state_time_start_hour = (state_time_end_hour == 0) ? 23 : (state_time_end_hour - 1); } sprintf(start_time_str,"%04d-%02d-%02d %02d:%02d:00",end_t->tm_year+1900,end_t->tm_mon + 1,end_t->tm_mday,state_time_start_hour,start_sec%60); //when create csv file per hour, keep the old filename if(cdr_file_mng.generate_timeout == 4) sprintf(time_table,"%04d_%02d_%02d_%02d",end_year,end_mon,end_day,state_time_start_hour); else sprintf(time_table,"%04d_%02d_%02d_%02d_%02d",end_year,end_mon,end_day,state_time_start_hour,start_sec%60); cdr_log("[DEBUG][get_time_condition_tc]:time_table=%s",time_table); } sprintf(time_condition,"%s >= '%s' and %s < '%s'",time_field,start_time_str,time_field,end_time_str); cdr_log("[DEBUG][get_time_condition_tc]:time_condition=%s",time_condition); return state_time_start_hour; } void create_csv_tc(cdr_src *psrc) { MYSQL *pubConn; char fullfilename[128]; char tablename[64]; char time_table[64]; char time_cond[128]; char cmdstr[256]; struct tm *t; int hour; int create_success=0; t=localtime((time_t*)¤t_time); hour=get_time_condition_tc(time_cond,"releaseTime",time_table); sprintf(fullfilename,"%s/%s_%s.csv",psrc->csvPath,psrc->recordTable,time_table); sprintf(tablename,"CDR_DB.%s_%02d",psrc->recordTable,hour); cdr_log("[INFO][create_csv_tc]:prepare to create %s from %s at %02d:%02d:%02d\n",fullfilename,tablename,t->tm_hour,t->tm_min,t->tm_sec); pubConn=mysql_conn("localhost","CDR_DB"); if(pubConn == NULL) { cdr_log("[ERR %d][create_csv_tc]:Can not connect to CDR_DB\n",mysql_errno(pubConn)); return; } sprintf(mng_sqlstr,"select key_sys_id,instance%s,srcCode into outfile '%s' from %s where %s",psrc->define.outFieldList,fullfilename,tablename,time_cond); if(mysql_getnores(pubConn,mng_sqlstr) != 0) { cdr_log("[ERR %d][create_csv_tc]:Create %s fail,SQL=%s\n",mysql_errno(pubConn),fullfilename,mng_sqlstr); create_success=0; } else { cdr_log("[SQL][create_csv_tc]:%s\n",mng_sqlstr); cdr_log("[INFO][create_csv_tc]:create csv file %s successfully,%s\n",fullfilename,mng_sqlstr); sprintf(cmdstr,"chmod 644 %s",fullfilename); system(cmdstr); create_success=1; } sprintf(cdr_file_mng.last_create_file,"%s",fullfilename); if(cdr_file_mng.backup_flag && create_success) { if(chdir(cdr_file_mng.sending_dir) == -1) { sprintf(cmdstr,"mkdir -p -m755 %s",cdr_file_mng.sending_dir); cdr_log("[INFO][create_csv_tc]:%s\n", cmdstr); system(cmdstr); if(chdir(cdr_file_mng.sending_dir) == -1) return; } sprintf(cmdstr,"cp -f %s %s/",fullfilename,cdr_file_mng.sending_dir); system(cmdstr); } mysql_close(pubConn); } /* --End * */ void create_csv(cdr_src *psrc) { MYSQL *pubConn; char fullfilename[128]; char tablename[64]; char time_table[64]; char time_cond[128]; char cmdstr[256]; struct tm *t; int hour; int create_success=0; t=localtime((time_t*)¤t_time); hour=get_time_condition(time_cond,"releaseTime",time_table); sprintf(fullfilename,"%s/%s_%s.csv",psrc->csvPath,psrc->recordTable,time_table); sprintf(tablename,"CDR_DB.%s_%02d",psrc->recordTable,hour); cdr_log("[INFO][create_csv]:prepare to create %s from %s at %02d:%02d:%02d\n",fullfilename,tablename,t->tm_hour,t->tm_min,t->tm_sec); pubConn=mysql_conn("localhost","CDR_DB"); if(pubConn == NULL) { cdr_log("[ERR %d][create_csv]:Can not connect to CDR_DB\n",mysql_errno(pubConn)); return; } sprintf(mng_sqlstr,"select key_sys_id,instance%s,srcCode into outfile '%s' from %s where %s",psrc->define.outFieldList,fullfilename,tablename,time_cond); if(mysql_getnores(pubConn,mng_sqlstr) != 0) { cdr_log("[ERR %d][create_csv]:Create %s fail,SQL=%s\n",mysql_errno(pubConn),fullfilename,mng_sqlstr); create_success=0; } else { cdr_log("[SQL]:%s\n",mng_sqlstr); cdr_log("[INFO][create_csv]:create csv file %s successfully,%s\n",fullfilename,mng_sqlstr); sprintf(cmdstr,"chmod 644 %s",fullfilename); system(cmdstr); create_success=1; } sprintf(cdr_file_mng.last_create_file,"%s",fullfilename); if(cdr_file_mng.backup_flag && create_success) { if(chdir(cdr_file_mng.sending_dir) == -1) { sprintf(cmdstr,"mkdir -p -m755 %s",cdr_file_mng.sending_dir); cdr_log("[INFO][create_csv]:%s\n", cmdstr); system(cmdstr); if(chdir(cdr_file_mng.sending_dir) == -1) return; } sprintf(cmdstr,"cp -f %s %s/",fullfilename,cdr_file_mng.sending_dir); system(cmdstr); } mysql_close(pubConn); } void create_dat_for_wxc1(cdr_src *psrc) { MYSQL *pubConn; MYSQL_RES *res; MYSQL_ROW row; char fullfilename[128]; char tablename[64]; char time_table[64]; char time_cond[128]; char str[512]; struct tm *t; int hour; FILE *handle; int res_num,i,wcount; int p_width[27]={8,18,23,23,23,23,23,11,11,16,7,7,22,23,23,23,15,9,7,23,7,7,7,23,23,11,9}; int y=0,m=0,d=0; char *pchr; t=localtime((time_t*)¤t_time); hour=get_time_condition(time_cond,"releaseTime",time_table); sprintf(fullfilename,"%s/%s_%s.csv",psrc->csvPath,psrc->recordTable,time_table); sprintf(tablename,"CDR_DB.%s_%02d",psrc->recordTable,hour); cdr_log("[INFO][create_dat_for_wxc1]:prepare to create %s version-1 from %s at %02d:%02d:%02d\n",fullfilename,tablename,t->tm_hour,t->tm_min,t->tm_sec); pubConn=mysql_conn("localhost","CDR_DB"); if(pubConn == NULL) { cdr_log("[ERR %d][create_dat_for_wxc1]:Can not connect to CDR_DB\n",mysql_errno(pubConn)); return; } //TC modified sprintf(mng_sqlstr,"select %s from %s where %s",psrc->define.outFieldList+1,tablename,time_cond); res=mysql_getres(pubConn,mng_sqlstr); if(res == NULL) { cdr_log("[ERR %d][create_dat_for_wxc1]:%s\n",mysql_errno(pubConn),mng_sqlstr); mysql_close(pubConn); return; } handle=fopen(fullfilename,"w"); if(handle == NULL) { cdr_log("[ERR][create_dat_for_wxc1]:create %s version-1 fail\n",fullfilename); mysql_close(pubConn); return; } res_num=mysql_num_rows(res); fprintf(handle,"FILE NAME:%s NO. OF RECORDS:%-10d\n",fullfilename,res_num); fprintf(handle,"START daily: %02d/%02d/%d START TIME: %02d:%02d:%02d\n\n",t->tm_mon+1,t->tm_mday,t->tm_year+1900,t->tm_hour,t->tm_min,t->tm_sec); fprintf(handle,"Type Imsi Msisdn Msrn Calling # Called # RE In.TkGp Ou.TkGp Location BS SS Mob. ClassMark Seizure Time Answer Time Release Time Duration TCos SSA SS Parm. SSR CR RCU SM Delivery Time SC Address SM Rslt MsgRf \n\n"); while((row=mysql_fetch_row(res)) != NULL) { //not sms if(atoi(row[0]) != 6 && atoi(row[0]) != 7) { ////Duration=0 skip if(row[16]==NULL || atoi(row[16])==0) continue; } for(i=0;i<27;i++) { if(row[i]==NULL) { if(i == 7 || i == 8) { ;//In.TkGp,Ou.TkGpr skip } else { fprintf(handle,"%-*s",p_width[i],"--"); continue; } } switch(i) { case 0: // Type case 10:// basicService case 11:// supplServicesUsed case 18:// SSA case 20:// SSR case 26:// MsgRf sprintf(str,"%03d",atoi(row[i])); break; case 7:// In.TkGp case 8:// Ou.TkGp //sms if(atoi(row[0]) == 6 || atoi(row[0]) == 7) sprintf(str,"--"); else sprintf(str,"00 00 00"); break; case 13:// seizureTime case 14:// answerTime case 15:// releaseTime case 23:// SmDeliveryTime // 2001-06-07 11:12:22-> // 06/07/2001 11:12:22 if(i==15) { if(atoi(row[0]) == 6 || atoi(row[0]) == 7) { fprintf(handle,"%-*s",p_width[i],"--"); continue; } } pchr=row[i]; y=atoi(pchr); pchr=strchr(pchr,'-'); if(pchr==NULL) { sprintf(str,"%02d/%02d/%02d %s",m,d,y,pchr); break; } pchr++; m=atoi(pchr); pchr=strchr(pchr,'-'); pchr++; if(pchr==NULL) { sprintf(str,"%02d/%02d/%02d %s",m,d,y,pchr); break; } d=atoi(pchr); pchr=strchr(pchr,' '); sprintf(str,"%02d/%02d/%02d %s",m,d,y,pchr); break; case 16://callDuration { int d,h,m,s,total; total =atoi(row[i]); d=total/86400; h=(total%86400)/3600; m=(total%3600)/60; s=total%60; sprintf(str,"%02d:%02d:%02d:%02d",d,h,m,s); break; } //case 9: // location_mscNumber //case 10:// location_mscNumber_2 case 17:// TCos sprintf(str,"%05d",atoi(row[i])); break; case 21:// CR sprintf(str,"%04d",atoi(row[i])); break; case 12:// Mob. ClassMark sprintf(str,"1f %s",row[i]); break; default: sprintf(str,"%s",row[i]); break; } fprintf(handle,"%-*s",p_width[i],str); } fprintf(handle,"\n"); wcount++; } fseek(handle,0,SEEK_SET); fprintf(handle,"FILE NAME: %s NO. OF RECORDS:%-10d\n",fullfilename,wcount); mysql_free_result(res); fclose(handle); mysql_close(pubConn); sprintf(cdr_file_mng.last_create_file,"%s",fullfilename); sprintf(str,"chmod 644 %s",fullfilename); system(str); if(cdr_file_mng.backup_flag) { if(chdir(cdr_file_mng.sending_dir) == -1) { sprintf(str,"mkdir -p -m755 %s",cdr_file_mng.sending_dir); cdr_log("[INFO][create_dat_for_wxc1]:%s\n",str); system(str); if(chdir(cdr_file_mng.sending_dir) == -1) return; } sprintf(str,"cp -f %s %s/",fullfilename,cdr_file_mng.sending_dir); system(str); } } void get_tables() { MYSQL *pubConn; MYSQL_RES *res; MYSQL_ROW row; int index; pubConn=mysql_conn("localhost","CDR_DB"); if(pubConn == NULL) { cdr_log("[ERR %d][get_tables]:Can not connect to CDR_DB",mysql_errno(pubConn)); return; } sprintf(mng_sqlstr,"show tables like 'cdrFrom%%\\___';"); res=mysql_getres(pubConn,mng_sqlstr); if(res == NULL) { cdr_log("[ERR %d][get_tables]:%s\n",mysql_errno(pubConn),mng_sqlstr); mysql_close(pubConn); return; } table_mng.table_count=0; table_mng.cur_table_index=0; index=0; while((row=mysql_fetch_row(res))) { sprintf(table_mng.table_name[index],"%s",row[0]); index++; } table_mng.table_count=index; mysql_free_result(res); mysql_close(pubConn); cdr_log("[INFO][get_tables]:Get clear table count=%d\n",table_mng.table_count); } void clear_table(char *table_name) { MYSQL *pubConn; cdr_log("[INFO][clear_table]:Clear table %s\n",table_name); pubConn=mysql_conn("localhost","CDR_DB"); if(pubConn == NULL) { cdr_log("[ERR %d][clear_table]:Can not connect to CDR_DB",mysql_errno(pubConn)); return; } sprintf(mng_sqlstr,"delete from CDR_DB.%s WHERE TO_DAYS(releaseTime)tm_year + 1900; int end_mon = end_t->tm_mon + 1; int end_day = end_t->tm_mday; int local_time_hour = end_t->tm_hour; end_instance = cdr_file_mng.time_instance; end_sec = end_instance * 15; cdr_log("[DEBUG][get_time_condition]:end_instance=%02d,end_sec=%02d", end_instance, end_sec); int state_time_end_hour = end_sec / 60; int state_time_start_hour = 0; cdr_log("[DEBUG][get_time_condition]:state_time_end_hour=%02d,local_time_hour=%02d", state_time_end_hour, local_time_hour); if (state_time_end_hour != local_time_hour) { cdr_log("[ERROR][get_time_condition]:error for cdr table target! state_time_start_hour=%02d, local_time_hour=%02d", state_time_end_hour, local_time_hour); state_time_end_hour = local_time_hour; } sprintf(end_time_str, "%04d-%02d-%02d 00:00:00", end_year, end_mon, end_day); start_instance = cdr_file_mng.time_instance - cdr_file_mng.generate_timeout; start_sec = start_instance * 15; cdr_log("[DEBUG][get_time_condition]:cdr_file_mng.generate_timeout=%d,start_sec=%d", cdr_file_mng.generate_timeout, start_sec); if (start_instance < 0) { start_instance += 96; start_sec = start_instance * 15; start_time = current_time - 12 * 60 * 60; struct tm start_tb; start_t = localtime_r((time_t *)&start_time, &start_tb); state_time_start_hour = start_sec / 60; cdr_log("[DEBUG][get_time_condition]:state_time_start_hour=%02d,local_time_hour=%02d", state_time_start_hour, local_time_hour); if (((state_time_start_hour + 1) % 24) != local_time_hour) { cdr_log("[ERROR][get_time_condition]:error for cdr table target!state_time_start_hour=%02d, local_time_hour=%02d", state_time_start_hour, local_time_hour); state_time_start_hour = (local_time_hour == 0) ? 23 : (local_time_hour - 1); } sprintf(start_time_str, "%04d-%02d-%02d 00:00:00", start_t->tm_year + 1900, start_t->tm_mon + 1, start_t->tm_mday); sprintf(time_table, "%04d_%02d_%02d", start_t->tm_year + 1900, start_t->tm_mon + 1, start_t->tm_mday); } else { state_time_start_hour = start_sec / 60; cdr_log("[DEBUG][get_time_condition]:state_time_start_hour=%02d,local_time_hour=%02d", state_time_start_hour, local_time_hour); if (((state_time_start_hour + 1) % 24) != local_time_hour) { cdr_log("[ERROR][get_time_condition]:error for cdr table target!state_time_start_hour=%02d, local_time_hour=%02d", state_time_start_hour, local_time_hour); state_time_start_hour = (local_time_hour == 0) ? 23 : (local_time_hour - 1); } sprintf(start_time_str, "%04d-%02d-%02d 00:00:00", end_t->tm_year + 1900, end_t->tm_mon + 1, end_t->tm_mday); sprintf(time_table, "%04d_%02d_%02d", end_year, end_mon, end_day); } sprintf(time_condition, "%s >= '%s' and %s < '%s'", time_field, start_time_str, time_field, end_time_str); cdr_log("[DEBUG][get_time_condition]:time_condition=%s", time_condition); return state_time_start_hour; } void copy_to_dailycdr_table(cdr_src *psrc) { MYSQL *pubConn; char tablename[64]; char time_table[64]; char time_cond[128]; char cmdstr[256]; struct tm *t; int hour; int create_success=0; char dailytable[64]; t=localtime((time_t*)¤t_time); hour=get_time_condition(time_cond,"releaseTime",time_table); strcpy(dailytable, psrc->recordTable); sprintf(tablename,"CDR_DB.%s_%02d",psrc->recordTable,hour); cdr_log("[INFO][copy_to_dailycdr_table]:prepare to copy from %s to %s at %02d:%02d:%02d\n", tablename, dailytable, t->tm_hour, t->tm_min, t->tm_sec); pubConn=mysql_conn("localhost","CDR_DB"); if(pubConn == NULL) { cdr_log("[ERR %d][copy_to_dailycdr_table]:Can not connect to CDR_DB\n", mysql_errno(pubConn)); return; } sprintf(mng_sqlstr, "INSERT INTO %s SELECT * FROM %s where %s", dailytable, tablename, time_cond); if(mysql_getnores(pubConn,mng_sqlstr) != 0) { cdr_log("[ERR %d][copy_to_dailycdr_table]:SQL=%s\n", mysql_errno(pubConn), mng_sqlstr); create_success=0; } else { cdr_log("[SQL]:%s\n",mng_sqlstr); cdr_log("[INFO][copy_to_dailycdr_table]:copy table %s successfully,%s\n", dailytable, mng_sqlstr); create_success=1; } mysql_close(pubConn); } void create_dailycdr_csv(cdr_src *psrc) { MYSQL *pubConn; char voice_filename[128]; char sms_filename[128]; char tablename[64]; char time_table[64]; char time_cond[128]; char cmdstr[256]; struct tm *t; int hour; int voice_create_success=0; int sms_create_success=0; char calltype_condition[128]; t=localtime((time_t*)¤t_time); hour = get_dailycdr_time_condition(time_cond, "releaseTime", time_table); copy_to_dailycdr_table(psrc); // the last hour of one day if (hour == 23) { char dailycdr_csv_path[128]; // judge directory cdrdaily struct stat st = {0}; sprintf(dailycdr_csv_path, "%sdaily", psrc->csvPath); // if the dir not exist if (stat(dailycdr_csv_path, &st) == -1) { // not found dir if (mkdir(dailycdr_csv_path, 0770) != 0) { cdr_log("[ERROR][create_dailycdr_csv]:failed to make directory %s\n", dailycdr_csv_path); return; } // 获取用户和组的ID struct passwd *pwd = getpwnam("mysql"); struct group *grp = getgrnam("mysql"); if (pwd == NULL || grp == NULL) { cdr_log("[ERROR][create_dailycdr_csv]:failed to get uid or gid\n"); return; } // 修改目录的所有者和属组 if (chown(dailycdr_csv_path, pwd->pw_uid, grp->gr_gid) != 0) { cdr_log("[ERROR][create_dailycdr_csv]:failed to chown directory %s\n", dailycdr_csv_path); return; } } sprintf(voice_filename, "%s/%s_voice_%s.csv", dailycdr_csv_path, psrc->recordTable, time_table); sprintf(sms_filename, "%s/%s_sms_%s.csv", dailycdr_csv_path, psrc->recordTable, time_table); sprintf(tablename, "CDR_DB.%s", psrc->recordTable); cdr_log("[INFO][create_dailycdr_csv]:prepare to create %s from %s at %02d:%02d:%02d\n", voice_filename, tablename, t->tm_hour, t->tm_min, t->tm_sec); pubConn=mysql_conn("localhost","CDR_DB"); if(pubConn == NULL) { cdr_log("[ERR %d][create_dailycdr_csv]:Can not connect to CDR_DB\n", mysql_errno(pubConn)); return; } // export msc voice cdr file strcpy(calltype_condition, "(recordType!=6 and recordType!=7)"); sprintf(mng_sqlstr, "select key_sys_id,instance%s,srcCode into outfile '%s' from %s where %s and %s", psrc->define.outFieldList, voice_filename, tablename, time_cond, calltype_condition); if(mysql_getnores(pubConn,mng_sqlstr) != 0) { cdr_log("[ERR %d][create_dailycdr_csv]:Create %s fail,SQL=%s\n", mysql_errno(pubConn), voice_filename, mng_sqlstr); voice_create_success = 0; } else { cdr_log("[SQL]:%s\n",mng_sqlstr); cdr_log("[INFO][create_dailycdr_csv]:create csv file %s successfully,%s\n", voice_filename, mng_sqlstr); sprintf(cmdstr, "chmod 644 %s", voice_filename); system(cmdstr); voice_create_success = 1; } if (cdr_file_mng.dailycdr_backup_flag && voice_create_success) { if (chdir(cdr_file_mng.dailycdr_sending_dir) == -1) { sprintf(cmdstr, "mkdir -p -m755 %s", cdr_file_mng.dailycdr_sending_dir); cdr_log("[INFO][create_dailycdr_csv]:%s\n", cmdstr); system(cmdstr); if (chdir(cdr_file_mng.dailycdr_sending_dir) == -1) return; } sprintf(cmdstr, "cp -f %s %s/", voice_filename, cdr_file_mng.dailycdr_sending_dir); system(cmdstr); } // export msc sms cdr file strcpy(calltype_condition, "(recordType=6 or recordType=7)"); sprintf(mng_sqlstr, "select key_sys_id,instance%s,srcCode into outfile '%s' from %s where %s and %s", psrc->define.outFieldList, sms_filename, tablename, time_cond, calltype_condition); if (mysql_getnores(pubConn, mng_sqlstr) != 0) { cdr_log("[ERR %d][create_dailycdr_csv]:Create %s fail,SQL=%s\n", mysql_errno(pubConn), sms_filename, mng_sqlstr); sms_create_success = 0; } else { cdr_log("[SQL]:%s\n", mng_sqlstr); cdr_log("[INFO][create_dailycdr_csv]:create csv file %s successfully,%s\n", sms_filename, mng_sqlstr); sprintf(cmdstr, "chmod 644 %s", sms_filename); system(cmdstr); sms_create_success = 1; } if (cdr_file_mng.dailycdr_backup_flag && sms_create_success) { if(chdir(cdr_file_mng.dailycdr_sending_dir) == -1) { sprintf(cmdstr, "mkdir -p -m755 %s", cdr_file_mng.dailycdr_sending_dir); cdr_log("[INFO][create_dailycdr_csv]:%s\n", cmdstr); system(cmdstr); if (chdir(cdr_file_mng.dailycdr_sending_dir) == -1) return; } sprintf(cmdstr, "cp -f %s %s/", sms_filename, cdr_file_mng.dailycdr_sending_dir); system(cmdstr); } if (voice_create_success && sms_create_success) { clear_table(psrc->recordTable); } mysql_close(pubConn); } } // ---end