#include "cdr.h"
#include "../../../omcLib/c_program/ftp/ftp.h"
#include <pwd.h>
#include <grp.h>

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<sms_note_sys[index].msisdn_count;i++)
	{
		sprintf(content,"EMS generates empty CDR file %s",fileName);
		sprintf(sqlstr,"insert into OMC_PUB.sendSMSList(sender,receiver,content,issue_time,send_time)values('EMS','%s','%s',FROM_UNIXTIME(%ld),0)",sms_note_sys[index].msisdn[i],content,time(NULL));
		if(mysql_getnores(dbConn,sqlstr) != 0)
			cdr_log("mysql fail,%s",sqlstr);
	}
	mysql_close(dbConn);
	return 1;
}

int check_csv_file(char *fileName)
{
	char checkstr[64];
	int index;
	struct stat fileStat;
	char fullfilename[128];

	sprintf(fullfilename,"%s",fileName);
	
	cdr_log("###check csv file %s\n",fullfilename);
	for(index=0;index<sms_note_sys_count;index++)
	{
		sprintf(checkstr,"cdrFrom%s",sms_note_sys[index].sysTypeName);
		if(strstr(fileName,checkstr))
			break;
	}
	
	if(index == sms_note_sys_count)
	{
		cdr_log("###check csv file %s, not configure\n",fullfilename);
		return 0;
	}
	
	if(sms_note_sys[index].need_alarm || sms_note_sys[index].need_sms)
	{
		stat(fullfilename,&fileStat);
	}
	
	//printf("%s sms_note_sys[%d].need_alarm=%d,need_sm=%d,%s\n",sms_note_sys[index].sysTypeName,index,sms_note_sys[index].need_alarm,sms_note_sys[index].need_sms,fileName);
	
	if(fileStat.st_size == 0)
	{
		if(sms_note_sys[index].need_alarm)
		{
			cdr_log("###csv file %s is empty,insert alarm\n",fileName);
			switch(sms_note_sys[index].sysTypeNo)
			{
			case 320:
				insertSeriousAlarmLog(3,1);break;
			case 330:
				insertSeriousAlarmLog(3,2);break;
			case 325:
				insertSeriousAlarmLog(3,3);break;
			case 360:
				insertSeriousAlarmLog(3,4);break;
			case 350:
				insertSeriousAlarmLog(3,5);break;
			case 375:
				insertSeriousAlarmLog(3,6);break;
			case 380:
				insertSeriousAlarmLog(3,9);break;
			case 386:
				insertSeriousAlarmLog(3,10);break;
			default:
				insertSeriousAlarmLog(3,99);break;
			}
		}
		if(sms_note_sys[index].need_sms)
		{
			cdr_log("###csv file %s is empty,insert sm\n",fileName);
			insert_sm(index,fullfilename);
		}
	}
	return 1;
}
void get_parameter()
{
	MYSQL *pubConn;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char sqlstr[256];
	int value;
	
	memset(&cdr_file_mng,0,sizeof(_cdr_file_mng));
	
	pubConn=mysql_conn("localhost","OMC_PUB");
	if(pubConn == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:Can not connect to OMC_PUB",mysql_errno(pubConn));
		return;
	}
	
	sprintf(sqlstr,"select pubVarValue from OMC_PUB.omcPubVarConf where pubVarName='GenerateCDRFileInterval';");
	res=mysql_getres(pubConn,sqlstr);
	if(res == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:%s\n",mysql_errno(pubConn),sqlstr);
		mysql_close(pubConn);
		return;
	}
	
	row=mysql_fetch_row(res);
	if(row == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:no row1\n",mysql_errno(pubConn));
		mysql_free_result(res);
		cdr_file_mng.generate_timeout=4;
		//mysql_close(pubConn);
		//return;
	}
	else
	{
		value=atoi(row[0]);
		if(value == 15)
		{
			cdr_file_mng.generate_timeout=1;
		}
		else if(value == 30)
		{
			cdr_file_mng.generate_timeout=2;
		}
		else if(value == 60)
		{
			cdr_file_mng.generate_timeout=4;
		}
		else
		{
			cdr_file_mng.generate_timeout=4;
			cdr_log("wrong value for Interval of genrating CDR CSV");		
		}
		mysql_free_result(res);
	}
	
	//get cdr_store_server
	sprintf(sqlstr,"SELECT pubVarValue FROM OMC_PUB.omcPubVarConf WHERE pubVarName='cdr_store_server'");
	res=mysql_getres(pubConn,sqlstr);
	if(res == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:%s\n",mysql_errno(pubConn),sqlstr);
		mysql_close(pubConn);
		return;
	}
	
	row=mysql_fetch_row(res);
	if(row == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:no row2\n",mysql_errno(pubConn));
		mysql_free_result(res);
		mysql_close(pubConn);
		return;
	}
	if(strlen(row[0]) == 0)
		cdr_file_mng.backup_flag=0;	
	else
		cdr_file_mng.backup_flag=1;

	// Zed baicells daily cdr store, by simon ---
	// get dailycdr_store_server
	sprintf(sqlstr, "SELECT pubVarValue FROM OMC_PUB.omcPubVarConf WHERE pubVarName='dailycdr_store_server'");
	res = mysql_getres(pubConn, sqlstr);
	if (res == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:%s\n", mysql_errno(pubConn), sqlstr);
		mysql_close(pubConn);
		return;
	}

	row = mysql_fetch_row(res);
	if (row == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:no row2\n", mysql_errno(pubConn));
		mysql_free_result(res);
		mysql_close(pubConn);
		return;
	}
	if (strlen(row[0]) == 0)
		cdr_file_mng.dailycdr_backup_flag = 0;
	else
		cdr_file_mng.dailycdr_backup_flag = 1;
	// ---end

	mysql_free_result(res);
	mysql_close(pubConn);
	
	//sending_dir
	pubConn=mysql_conn("localhost","CDR_DB");
	if(pubConn == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:Can not connect to CDR_DB",mysql_errno(pubConn));
		return;
	}
	
	sprintf(sqlstr,"SELECT pubVarValue FROM CDR_DB.cdrPubVarConf WHERE pubVarName='sending_directory';");
	res=mysql_getres(pubConn,sqlstr);
	if(res == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:%s\n",mysql_errno(pubConn),sqlstr);
		mysql_close(pubConn);
		return;
	}
	
	row=mysql_fetch_row(res);
	if(row == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:no row3\n",mysql_errno(pubConn));
		mysql_free_result(res);
		mysql_close(pubConn);
	}
	strcpy(cdr_file_mng.sending_dir,row[0]);

	mysql_free_result(res);
	mysql_close(pubConn);

	// sending_dir
	pubConn = mysql_conn("localhost", "CDR_DB");
	if (pubConn == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:Can not connect to CDR_DB", mysql_errno(pubConn));
		return;
	}

	// Zed requirement CDR daily merge --
	sprintf(sqlstr, "SELECT pubVarValue FROM CDR_DB.cdrPubVarConf WHERE pubVarName='dailycdr_sending_directory';");
	res = mysql_getres(pubConn, sqlstr);
	if (res == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:%s\n", mysql_errno(pubConn), sqlstr);
		mysql_close(pubConn);
		return;
	}

	row = mysql_fetch_row(res);
	if (row == NULL)
	{
		cdr_log("[ERR %d][get_parameter]:no row\n", mysql_errno(pubConn));
		mysql_free_result(res);
		mysql_close(pubConn);
		return;
	}
	strcpy(cdr_file_mng.dailycdr_sending_dir, row[0]);
	// ---end
	mysql_free_result(res);
	mysql_close(pubConn);
}

void cdrdb_init()
{
	get_parameter();
	cdr_clock_init(0);
#if CDR_ALARM_FLAG
	read_sms_conf();
#endif
	
	cdr_log("[INFO][cdrdb_init]:time_instance=%d",cdr_file_mng.time_instance);
	cdr_log("[INFO][cdrdb_init]:cur_generate_timeout=%d",cdr_file_mng.cur_generate_timeout);
	cdr_log("[INFO][cdrdb_init]:generate_timeout=%d",cdr_file_mng.generate_timeout);
	cdr_log("[INFO][cdrdb_init]:cdrsending_dir=%s",cdr_file_mng.sending_dir);
	cdr_log("[INFO][cdrdb_init]:dailycdr_sending_dir=%s", cdr_file_mng.dailycdr_sending_dir);
	cdr_log("[INFO][cdrdb_init]:backup_flag=%d",cdr_file_mng.backup_flag);
	cdr_log("[INFO][cdrdb_init]:dailycdr_backup_flag=%d", cdr_file_mng.dailycdr_backup_flag);
}

void cdrdb_timer()
{
	unsigned long time_past;
	time_past=cdr_clock_timer();

	switch(cdr_file_mng.state)
	{
	case MNG_STATE_IDLE:
		break;
		
	case MNG_STATE_PREPARE:
		cdr_file_mng.start_time+=time_past;
		if(cdr_file_mng.start_time - cdr_file_mng.prepare_time > 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*)&current_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*)&current_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*)&current_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*)&current_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)<TO_DAYS(NOW());",table_name);
	if(mysql_getnores(pubConn,mng_sqlstr) != 0)
		cdr_log("[ERR %d][clear_table]:%s",mysql_errno(pubConn),mng_sqlstr);
	else
		cdr_log("[INFO][clear_table]:%s",mng_sqlstr);
	//sprintf(mng_sqlstr,"repair table CDR_DB.%s",table_name);
	//if(mysql_getnores(pubConn,mng_sqlstr) != 0)
	//	cdr_log("[ERR %d][clear_table]:%s\n",mysql_errno(pubConn),mng_sqlstr);
	
	mysql_close(pubConn);
}

// Zed baicells CDR merge and split requirement, by simon ---

int get_dailycdr_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 *)&current_time);
	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_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*)&current_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*)&current_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