📄 db_op.ec
字号:
#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 + -