⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_op.ec

📁 界面库
💻 EC
📖 第 1 页 / 共 5 页
字号:
#ifdef wyz020923_modi
#else
retry_select:
#endif

$ifdef zgx020604_modi;
	strcpy(nac_ip, nacip);
	EXEC SQL SELECT bank_id, host_id
		INTO :bankid, :hostid
		FROM bank_base_nac
		WHERE tran_ip_addr1 = :nac_ip
		OR    tran_ip_addr2 = :nac_ip; 
$else;
	strcpy(nac_ip, nacip);
	EXEC SQL SELECT bank_id, host_id
		INTO :bankid, :hostid
		FROM bank_base
		WHERE tran_ip_addr1 = :nac_ip
		OR    tran_ip_addr2 = :nac_ip; 
$endif;
	
#ifdef wyz020923_modi
	if (SQLCODE) {
		errcall(ERROR, "查取网控器[%s]联行行号失败[%ld]!",
			nacip,
			SQLCODE);
		return -2;
	}
#else
	retry_cnt ++;
	if (SQLCODE) {
		if (retry_cnt < 3) {
			sleep(2);
			goto retry_select;
		}
		else {
			errcall(ERROR, "查取网控器[%s]联行行号失败[%ld]!",
				nacip,
				SQLCODE);
			return -2;
		}
	}
#endif

	DelSpace(bankid);
	DelSpace(hostid);
	begin_tran();

#ifdef wyz020923_modi
#else
	retry_cnt = 0;
retry_update:
#endif

$ifdef zgx020604_modi;
	EXEC SQL UPDATE bank_base_nac set login_stat = :l_stat
		WHERE bank_id = :bankid 
		AND   host_id = :hostid;
$else;
	EXEC SQL UPDATE bank_base set login_stat = :l_stat
		WHERE bank_id = :bankid 
		AND   host_id = :hostid;
$endif;
	
#ifdef wyz020923_modi
	if (SQLCODE) {
		errcall(ERROR, "更新联行[%s(%s)]网控器联接状态标志失败[%ld]!",
			bankid,
			hostid,
			SQLCODE);
		rollback_tran();
		return -1;
	}
#else
	retry_cnt ++;
	if (SQLCODE) {
		if (retry_cnt < 3) {
			sleep(2);
			goto retry_update;
		}
		else {
			errcall(ERROR, "更新联行[%s(%s)]网控器联接状态标志失败[%ld]!",
				bankid,
				hostid,
				SQLCODE);
			rollback_tran();
			return -1;
		}
	}
#endif

	commit_tran();
	if (conn_stat == 'I')
		errcall(ERROR, "联行[%s]网控器(%s)签到!", bankid, nac_ip);
	else
		errcall(ERROR, "联行[%s]网控器(%s)签退!", bankid, nac_ip);
	return 0;
}

$endif;	/* zgx020510_added */

/***************************************************************
功能:
	记录网络出错日志
ENTRY:
RETURN:
	0	SUCC
	-1	FAIL
****************************************************************/
int log_net ( bankid ,hostid, buf )
$parameter char *bankid, *buf, *hostid;
{
EXEC SQL BEGIN DECLARE SECTION;
char 	datebuf[9],timebuf[7];
char 	ipaddr1[30] ;
EXEC SQL END DECLARE SECTION;

	getdatef(datebuf, "");
	gettimef(timebuf, "");

	EXEC SQL SELECT tran_ip_addr1 INTO :ipaddr1 FROM bank_base
		WHERE bank_id = :bankid 
		AND   host_id = :hostid;
	
	if (SQLCODE) {
		errcall(ERROR, "取联行IP地址失败[%d]", SQLCODE);
		return -1;
	}

	begin_tran();

	EXEC SQL INSERT INTO net_err_msg
		VALUES(:datebuf, :timebuf, :bankid, :hostid, :ipaddr1, :buf);
	if (SQLCODE) {
		errcall(ERROR, "记录联行[%s(%s)]网络出错日志失败[%d]",
		bankid, hostid, SQLCODE);
		rollback_tran();
		return -1;
	}

	commit_tran();
	return 0;
}

/*******************************************
 * 装载商户类型参数信息(类型名等)到内存
 *******************************************/
int load_mcc_param ()
{
EXEC SQL BEGIN DECLARE SECTION;
S_mcc_param mcc_param;
short indi;
EXEC SQL END DECLARE SECTION;
int i;

	EXEC SQL select count(*) into :G_mcc_table_size:indi from mcc_param;


	if (SQLCODE) {
		errcall(ERROR, "取MCC参数表失败[%ld]!", SQLCODE);
		return -1;
	}
	
	if (G_mcc_table_size == 0 || indi == -1) 
		return -1;

	if (G_mcc_par != NULL)
		free(G_mcc_par);
	
	G_mcc_par = (S_mcc_param *) malloc(sizeof(S_mcc_param) * G_mcc_table_size);
	
	if (G_mcc_par == NULL) {
		errcall(ERROR, "Unable malloc memory for mcc_param!");
		return -1;
	}

	memset(G_mcc_par, '\0', sizeof(S_mcc_param) * G_mcc_table_size);
	
	EXEC SQL declare mcc_param_cur cursor for
	select * from mcc_param order by mcc;
	
	EXEC SQL open mcc_param_cur;
	
	if (SQLCODE) {
		errcall(ERROR, "DECLARE数据库游标失败[%ld]!", SQLCODE);
		free(G_mcc_par);
		return -1;
	}
	
	for(i=0; i < G_mcc_table_size; i++) {
		EXEC SQL fetch mcc_param_cur into $mcc_param;
		
		if (SQLCODE) { 
			errcall(ERROR, "FETCH据库游标失败[%ld]!", SQLCODE);
			EXEC SQL close mcc_param_cur;
			return -1;
		}
		
		del_st_space("mcc_param", &mcc_param);
		memcpy(&(G_mcc_par[i]), &mcc_param, sizeof(S_mcc_param));
	}
	
	EXEC SQL close mcc_param_cur;
	return 0;
}

#ifdef wyz_del_0409
int check_mcc_trans ( char *mcc , int type )
{
int i,j;

	int index_mcc_param[40] = {
		OFFLINE,AGENT_OUT,AGENT_IN,MUL_QUY,PURCHASE, 
		WITHDRAWAL,TRANS_OUT, PRE_AUTH,CONFIRM,ADJUST,
		DEPOSIT,REFUND,POS_VOID,INQUERY,CHG_PWD,
		TRANS_IN,-1	
	};

	if ( mcc_par == NULL ){
		errcall ( ERROR , "mcc_par == NULL!");
		if ( load_mcc_param () < 0 ){
			return -1;
		}
	}

	for (j = 0; index_mcc_param[j] != -1; j++) {
		if (index_mcc_param[j] == type) {
		    for (i = 0; i < mcc_table_size; i++){
			if(!memcmp(mcc,mcc_par[i].mcc,4)){
				if(mcc_par[i].T45_tran_bit[j] == '1'){
					return(0);
				}
				errcall(ERROR,"该商户类型[%s]不支持该交易%d",\
					mcc,type);
				return -1;
			}
		   }

		   if (i == mcc_table_size){
			errcall(ERROR,"Out of mcc_table_num![%d]",type);
			return(-1);
		   }
		}
	}

	if (index_mcc_param[j] == -1) {
		//errcall(ERROR, "Out of limit![%d]", type);
		//return(-1);
		return(0);
	}
	return(-1);
}
#endif

#ifdef wyz_del_0409
int check_mcc_mer_type ( char *mcc , char *merchant_id )
{
	
	if(!memcmp(mcc,"6010",4) || !memcmp(mcc,"6011",4)){
	 	if(merchant_id[4] == '1')
			return 0;
		else  
			return -1;	
	}
	
	return 0;
}
#endif

/*
 * 判断联行的NAS版本是否新版本(NAS6.0版)
 */
int newversion(bankid, hostid)
char *bankid, *hostid;
{
	char	version[4];

	if (NasVersion(bankid, hostid, version) < 0)
		return 0;

	if (!strcmp(version, "060"))	/* NAS6.0版 */
		return 1;

	return 0;
}

/*
 * 获取联行的NAS版本(051=5.1版,060=6.0版)
 */
int NasVersion(bankid, hostid, version)
$parameter char *bankid, *hostid;
char	*version;
{

#ifdef zgx010419_modify
	char s[81];
	FILE *fp;

	fp = fopen("tetr","r");

	if(fp == NULL){
		return 0;
	}
	while (!feof(fp)){

		fgets(s,80,fp);

		if(!strncmp(s,bankno,4)){
			fclose(fp);
			return 1;
		}
	}
	fclose(fp);
	return 0;
#else

	$char	ver[4];

	version[0] = '\0';

	EXEC SQL select nas_version into :ver
	from bank_base
	where bank_id = :bankid
	and host_id = :hostid;

	if (SQLCODE)
		return -1;

	DelSpace(ver);
	strcpy(version, ver);

	return 0;
#endif
}

/***************************************************************
功能:
	根据交易类型从tran_limit_amt表中获得交易的最大和最小限额
	以及交易手续费的费率。
ENTRY:	
	tran_type	交易类型
RETURN:	-1,	FAIL
	0,	SUCC, RESULT-->G_tran_limit_amt 
****************************************************************/
#ifdef wyz020619
int select_tran_limit_amt(int tran_type)
#else
int select_tran_limit_amt(int tran_type, char *card_type)
#endif
{
EXEC SQL BEGIN DECLARE SECTION;
S_tran_limit_amt	tmp_tran_lmt_amt;
int			tmp_tran_type;
char			tmp_card_type[4];
EXEC SQL END DECLARE SECTION;

	tmp_tran_type = tran_type;
#ifdef wyz020619_mod
#else
	strcpy(tmp_card_type, card_type);
#endif

$ifdef wyz020619_mod;
	EXEC SQL SELECT * into :tmp_tran_lmt_amt from tran_limit_amt
	where tran_type = :tmp_tran_type;
$else;
	EXEC SQL SELECT * into :tmp_tran_lmt_amt from tran_limit_amt
	where tran_type = :tmp_tran_type
	and card_type = :tmp_card_type;
$endif;

	if (SQLCODE == SQLNOTFOUND) {//Set default values
		G_tran_limit_amt.max_tran_amt = 1000000;
		G_tran_limit_amt.min_tran_amt = 0.01;
		G_tran_limit_amt.fee_rate = 0;
		return 0;
	}
	if (SQLCODE) {
		errcall(ERROR, "select tran_limit_amt failed(%d)",SQLCODE);
		return -1;
	}

	del_st_space("tran_limit_amt", &tmp_tran_lmt_amt);
	memcpy(&G_tran_limit_amt, &tmp_tran_lmt_amt, sizeof(S_tran_limit_amt));
	
	return 0;
}

/*=========================================================
功能:
	判断该EDC受理卡类表的状态
ENTER:  S_edc_card	*t_edc_card
RETURN:	-1	FAIL
	0 	SUCC
	-2	NOT FOUND
===========================================================*/
int select_edc_card(S_edc_card *t_edc_card)
{
EXEC SQL BEGIN DECLARE SECTION;
S_edc_card	tmp_edc_card;
char		sqlstr[256];
EXEC SQL END DECLARE SECTION;

	memset(sqlstr, '\0', sizeof(sqlstr));
	memcpy(&tmp_edc_card, t_edc_card, sizeof(S_edc_card));

	sprintf(sqlstr, "select * from edc_card		\
		where	merchant_id	= \'%s\'	\
		and	terminal_id	= \'%s\'	\
		and	card_type	= \'%s\'",
		tmp_edc_card.merchant_id,
		tmp_edc_card.terminal_id,
		tmp_edc_card.card_type);
	
	EXEC SQL PREPARE sel_edc_crd FROM :sqlstr;
	EXEC SQL DECLARE sel_edc_card CURSOR FOR sel_edc_crd;
	EXEC SQL OPEN sel_edc_card;
	if (SQLCODE < 0) {
		errcall(ERROR, "OPEN Select_edc_card err[%ld] [%s]", SQLCODE, sqlstr);
		return -1;
	}

	EXEC SQL FETCH sel_edc_card into :tmp_edc_card;

	if (SQLCODE < 0) {
		errcall(ERROR, "select_edc_card() failed, SQLCODE(%d)", SQLCODE);
		return -1;
	}

	if (SQLCODE == SQLNOTFOUND){
		return -2;
	}

	del_st_space("edc_card", &tmp_edc_card);
	memcpy(t_edc_card, &tmp_edc_card, sizeof(S_edc_card));
	
	EXEC SQL CLOSE sel_edc_card;
	if (SQLCODE < 0)
		return -1;

	return 0;
}

int search_saf_fromDB(PUBLIC *pub)
{
EXEC SQL BEGIN DECLARE SECTION;
char	card_no[20];
int	cnt=0;
EXEC SQL END DECLARE SECTION;

	memset(card_no, '\0', sizeof(card_no));
	strcpy(card_no, pub->Card_no);
	
	$SELECT count(*) INTO $cnt FROM saf_ls
	WHERE	card_no = $card_no
	AND	saf_flag not in ('C', 'D')
	AND	tran_type = 41;
	
	if (SQLCODE < 0)
		return -1;
	else if (cnt > 0) {
		strcpy(pub->Resp_code, RE_ENTER_TRANS);
		strcpy(pub->Resp_bank_id, G_sys_param.bank_id);
		strcpy(pub->Resp_host_id, G_sys_param.host_id);
		return 1;
	}
	else
		return 0;
}

int upd_edc_tran_stat(pub)
PUBLIC	*pub;
{
EXEC SQL BEGIN DECLARE SECTION;
S_edc_tran_stat	edc_tran;
double		tran_amt=0.;
char		term_id[9];
char		merch_id[16];
int		cnt=0;
EXEC SQL END DECLARE SECTION;

	//不成功交易不处理 
	if (strcmp(pub->Resp_code, SUCCESS))
		return 0;

	//非收单行不进行EDC交易实时统计 
	if (strcmp(pub->Acq_bank_id, G_sys_param.bank_id)	||
	    strcmp(pub->Acq_host_id, G_sys_param.host_id))
		return 0;

	//特殊的终端号不处理
	if (!memcmp(pub->Terminal_id, "TEL", 3) ||
	    !memcmp(pub->Terminal_id, "TLX", 3) ||
	    !memcmp(pub->Terminal_id, "VOC", 3) ||
	    !memcmp(pub->Terminal_id, "TRM", 3))
		return 0;

	memset(term_id, '\0', sizeof(term_id));
	memset(merch_id, '\0', sizeof(merch_id));

	strcpy(term_id, pub->Terminal_id);
	strcpy(merch_id, pub->Merchant_id);

	//初始化EDC交易实时统计表
	EXEC SQL SELECT count(*) into :cnt FROM edc_tran_stat
	WHERE	merchant_id = :merch_id
	AND	terminal_id = :term_id;

	if (SQLCODE < 0) {
		errcall(ERROR, "查询EDC交易实时统计表错!![%ld]", SQLCODE);
		return -1;
	}
	else if (SQLCODE == SQLNOTFOUND || cnt == 0) {
		EXEC SQL INSERT INTO edc_tran_stat
		VALUES(:merch_id, :term_id, '156', 0, 0, "", "", "","00",
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

		if (SQLCODE) {
			errcall(ERROR, "初始化EDC交易实时统计表错!![%ld]", SQLCODE);
			return -1;
		}
	}

	switch(pub->Tran_type) {
	case	INQUERY:
	case	MUL_QUY:
		EXEC SQL UPDATE edc_tran_stat
		SET edc_quy_cnt = edc_quy_cnt + 1
		WHERE merchant_id = :merch_id
		AND terminal_id = :term_id;

		if (SQLCODE) {
			errcall(ERROR, "更新EDC交易统计表错![%ld]", SQLCODE);
			return -1;
		}
		return 0;

	case 	PURCHASE:
	case 	AUTH_PUR: //授权消费
	case 	CONFIRM:
	case 	OFFLINE:
		tran_amt = atol(pub->Tran_amount)/100.;

		EXEC SQL UPDATE edc_tran_stat
		SET edc_pur_cnt=edc_pur_cnt+1, 
		edc_pur_amt = edc_pur_amt + :tran_amt

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -