/*************************************************
File name:	cdr.h
Author: 	
Version:	9:00:00 
Date:  		2002-5-7
Description:该文件定义了cdrCollector模块包含的一些常量和函数，最后定义了三个重要的数据
			结构cdr_src,cdr_def,cdr_tlv

			
			
												
History:               
No. 		
Author:		  
Date:		 
Version:	   
Description:
*************************************************/

#ifndef __CDR_HEAD_FILE
#define __CDR_HEAD_FILE

#include "mysql.h"
#include "errmsg.h"
#include <dirent.h>
#include "../../../../plat/public/src/include/asn1.h"
#include "../../../../plat/snmp/src/include/snmp.h"
#include "../../../omcLib/c_program/omcLib/omcLib.h"

#ifndef _T_DWORD
#define _T_DWORD
typedef unsigned int DWORD;
#endif

#define CDR_DEBUG	0

#define	CDR_LINK_DEBUG	0
#define CDR_PORT		4968
#define CDR_SRC_NUM		32
#define CDR_TYPE_NUM	20
#define CDR_OBJ_MAX		128
#define HOST_NAME		"localhost"
#define CDRDB_NAME		"CDR_DB"
#define CSV_PATH		"/usr/local/cdr"
#define CDR_LOG_PATH	"../log"
#define CDR_LOG_FILE	"cdrlog"

#define ST_GET_TAIL		0
#define ST_WAIT_TAIL	1
#define ST_CDR_IDLE		2
#define ST_GET_CDR		3
#define ST_WAIT_CDR		4
#define ST_TAIL_IDLE	5
#define ST_SET_TAIL		6

#define CDR_TIME_UNIT	20		//ms

#define CDR_T_idle			250	//5s    lowest speed
#define CDR_T_getcdr		30	//60ms
#define CDR_T_gettail		500	//300*20=6000ms=10s
#define CDR_T_settail		100	//2s

#define	HEAP_SIZE_MAX	256		//1024*28
#define	HEAP_TIME_MAX	50*30	//30s

#define OMC_SINGLE	7
#define OMC_MASTER	5

char totalCdrFileName[128];
char cdrFileName[128];
int cdrHour;
//此结构的逻辑意义是数据表里的一个字段
typedef struct cdr_tlv {
	char tag_seq[17][20];	//16个tag的值
	char field_name[30];	//字段的名称
	BYTE type;				//字段的类型
	BOOL optional; 			//字段是否可选
	BYTE width;				//字段长度
} cdr_tlv;

//此结构的逻辑意义是数据表的定义，包括该表的字段定义
typedef struct cdr_def {
	BOOL valid[17];			//tag位标识
	char field_set[1024];	//全部的字段连接字符
	char field_select[1024];//指定版本的全部字段连接字符
	char create_sql[2048];	//产生数据表的sql语句
	BYTE field_count;		//字段的个数
	cdr_tlv obj[CDR_OBJ_MAX];//字段对象数组
} cdr_def;

//此数据结构的逻辑意义是一个CDR数据源
typedef struct cdr_src {
	int loss;				//丢包统计
	int recv;				//接收的包的个数
	int recd;				//记录的包的个数

	BYTE cdr_ver;			//版本号
	WORD sysTypeNo;			//系统设备号
	BYTE sysid;				//系统号
	BYTE retry;				//重试次数
	
	//informaion for getting cdr
	int get_timeout;		//get操作剩余时间
	BOOL get_state;    		//get状态
	DWORD instance;			//头指针
	DWORD head;		//尾指针
	BYTE maxbind;			//最大绑定变量数
	DWORD request_id;		//get的请求ID
	
	
	//information for setting ptail
	int set_timeout;		//set操作剩余时间
	BYTE set_fail;			//set失败次数
	BOOL set_state;			//set状态
	BOOL move_flag;			//尾指针是否改变
	DWORD set_rid;			//set请求ID
	snmp_addr addr;			//IP和端口地址
	DWORD oid[20];			//OID
	BYTE oid_len;			//OID长度
	DWORD head_oid[20];		//头指针OID
	DWORD tail_oid[20];		//尾指针OID
	char record_table[30];	//数据表名
	char define_table[30];	//数据定义表名
	char csv_path[50];		//保存路径
	int backup_max;			//最大备份个数
	int buf_size;			//缓冲区大小
	cdr_def define;			//对应的字段表定义对象
	
	//BOOL    receive_tail;
    //BOOL    receive_cdr;
	//int     serial;
} cdr_src;


void converseFile();
void cdr_timer();
void cdr_init();

#if CDR_LINK_DEBUG
void cdrdebug_init();
#endif

void cdrdb_init();
void cdr_start();
void cdr_stop();
BOOL cdr_status();
void cdrdb_timer();
void cdrlog_init();
void cdrlog_timer();
void cdr_log(const char *fmt, ...);
void cdr_logmsg(BYTE * buf, int len);
void cdr_report();
int safe_query(MYSQL * conn, char *strquery, int retry);

#endif
