📄 db_op.ec
字号:
ENTRY:
RETURN:
****************************************************************/
int bank_cmp ( void *bank1 , void *bank2 )
{
return (strcmp(((S_bank_base *)bank1)->bank_id, ((S_bank_base *)bank2)->bank_id));
}
/***************************************************************
功能:
根据行号获取联行技术资料(数据库表中获取)
ENTRY: bank_base
RETUN: -1 FAIL
0 SUCC,RESULT --> bk
-2 NOTFOUND
****************************************************************/
int select_bank( bank_base )
S_bank_base *bank_base;
{
EXEC SQL BEGIN DECLARE SECTION;
S_bank_base l_bank_base;
EXEC SQL END DECLARE SECTION;
memcpy( &l_bank_base, bank_base, sizeof( S_bank_base ) );
EXEC SQL SELECT * INTO :l_bank_base FROM bank_base
WHERE bank_id = :l_bank_base.bank_id
AND host_id = :l_bank_base.host_id;
if (SQLCODE < 0) {
errcall(ERROR, "查找联行[%s(%s)]信息失败![%d]",
l_bank_base.bank_id,
l_bank_base.host_id,
SQLCODE);
return -1;
}
if (SQLCODE == SQLNOTFOUND) {
errcall(DEBUG, "没有找到联行[%s(%s)]信息",
l_bank_base.bank_id,
l_bank_base.host_id);
return -2;
}
del_st_space("bank_base", &l_bank_base);
memcpy( bank_base, &l_bank_base, sizeof( S_bank_base ));
return 0;
}
/***************************************************************
功能:
根据商户号和银行类型取他行商户号和商户类型
ENTRY:
中行商户号和他行银行类型
RETURN:
0 SUCC 商户编号转换表==>merchant_switch
-1 FAIL
-2 NOTFOUND
****************************************************************/
int select_merchant_switch ( S_merchant_switch *merchant_switch )
{
EXEC SQL BEGIN DECLARE SECTION;
S_merchant_switch l_merchant_switch;
EXEC SQL END DECLARE SECTION;
memcpy(&l_merchant_switch, merchant_switch, sizeof(S_merchant_switch));
EXEC SQL SELECT * INTO :l_merchant_switch FROM merchant_switch
WHERE merchant_id = :l_merchant_switch.merchant_id
AND bank_type = :l_merchant_switch.bank_type;
if (SQLCODE == SQLNOTFOUND)
return -2;
if (SQLCODE < 0)
return -1;
del_st_space("merchant_switch", &l_merchant_switch);
memcpy(merchant_switch, &l_merchant_switch, sizeof(S_merchant_switch));
return 0;
}
/*******************************************************************
* 根据银行类型(外卡即卡号)、商户号获取他行或外卡的商户号
* 20011/08/19 added by 周国祥
**********************************************************************/
int get_rebate(char *mer_id, char *card_type, double *rebate)
{
EXEC SQL BEGIN DECLARE SECTION;
char merchant_id[16];
char cardtype[4];
char banktype[4];
double card_rebate=0.;
EXEC SQL END DECLARE SECTION;
strcpy(merchant_id, mer_id);
strcpy(cardtype, card_type);
if (!strcmp(cardtype, CREDIT_CARD) || !strcmp(cardtype, DEBIT_CARD))
strcpy(banktype, BOC_BANK);
else
strcpy(banktype, cardtype);
EXEC SQL select card_discount
into :card_rebate from merchant_card
where merchant_id = :merchant_id
and card_type = :cardtype
and bank_type = :banktype;
if (SQLCODE) {
*rebate = 0.0;
return -1;
} else {
*rebate = card_rebate * 0.01;
return 0;
}
}
/**********************************************************************
* 根据银行类型(外卡即卡号)、商户号获取他行或外卡的商户号
* 2001/08/19 added by 周国祥
**********************************************************************/
int get_oth_merchant_id(char *bank_type, char *mer_id, char *oth_mer_id)
{
EXEC SQL BEGIN DECLARE SECTION;
char merchant_id[16];
char oth_merchant_id[16];
char banktype[5];
EXEC SQL END DECLARE SECTION;
strcpy(merchant_id, mer_id);
strcpy(banktype, bank_type);
strcpy(oth_mer_id, mer_id);
EXEC SQL SELECT oth_merchant_id
INTO :oth_merchant_id
FROM merchant_switch
WHERE merchant_id = :merchant_id
AND bank_type = :banktype;
if (sqlca.sqlcode == 0) {
DelSpace(oth_merchant_id);
if (oth_merchant_id[0] != '\0')
strcpy(oth_mer_id, oth_merchant_id);
}
if (sqlca.sqlcode < 0) {
errcall(ERROR, "没有找到外卡商户号或数据库错,(%ld)", sqlca.sqlcode);
strcpy(oth_mer_id, mer_id);
}
if (sqlca.sqlcode == SQLNOTFOUND) {
strcpy(oth_mer_id, mer_id);
}
return 0;
}
/***************************************************************
功能:
根据行号和主机号取联行基本信息。
ENTRY:
RETURN:
0 SUCC
-1 FAIL
-2 NOT FOUND
****************************************************************/
int select_bank_info(S_bank_info *t )
{
EXEC SQL BEGIN DECLARE SECTION;
S_bank_info l_bank_info;
EXEC SQL END DECLARE SECTION;
memcpy(&l_bank_info, t, sizeof(S_bank_info));
EXEC SQL SELECT * INTO :l_bank_info FROM bank_info
WHERE bank_id = :l_bank_info.bank_id
AND host_id = :l_bank_info.host_id;
if (SQLCODE == SQLNOTFOUND)
return -2;
if (SQLCODE < 0)
return -1;
del_st_space("bank_info", &l_bank_info);
memcpy(t, &l_bank_info, sizeof(S_bank_info));
return 0;
}
/***************************************************************
功能:
根据行号和主机号取联行技术信息。
ENTRY:
RETURN:
0 SUCC
-1 FAIL
-2 NOT FOUND
****************************************************************/
int select_bank_base ( S_bank_base *t )
{
EXEC SQL BEGIN DECLARE SECTION;
S_bank_base l_bank_base;
EXEC SQL END DECLARE SECTION;
memcpy(&l_bank_base, t, sizeof(S_bank_base));
EXEC SQL SELECT * INTO :l_bank_base FROM bank_base
WHERE bank_id = :l_bank_base.bank_id and
host_id = :l_bank_base.host_id;
if (SQLCODE == SQLNOTFOUND)
return -2;
if (SQLCODE < 0)
return -1;
del_st_space("bank_base", &l_bank_base);
memcpy(t, &l_bank_base, sizeof(S_bank_base));
return 0;
}
/***************************************************************
功能:
从内存路由表中查找卡段路由
ENTRY:
tablename 路由表名
type 交易类型
c_type 卡类型
RETURN:
0 SUCC 路由信息=>lo中
-1 FAIL
****************************************************************/
int select_card_router(lo, type, tablename, c_type)
S_card_route *lo;
int type;
char *tablename;
char *c_type;
{
char *p=NULL;
char cardno[20];
int i, j;
int index_trans[32] = {
PURCHASE, /* 消 费 */
#ifdef wyz_del_010821
AUTH_PUR, /* 授权消费 */
#endif
WITHDRAWAL, /* 取 现 */
PRE_AUTH, /* 预 授 权 */
CONFIRM, /* 确 认 */
ADJUST, /* 帐务调整 */
DEPOSIT, /* 存 款 */
REFUND, /* 退 货 */
POS_VOID, /* 撤 消 */
REVERSAL, /* 冲 正 */
CHG_PWD, /* 改 卡 密 */
ISS_CARD, /* 领卡交易 */
DISUSE_CARD, /* 销卡交易 */
EXPIRE, /* 挂失交易 */
OPEN_ACC, /* 开户 */
DISUSE_ACC, /* 销户 */
ISS_ADVICE, /* 发卡行通知 */
ISS_REV_ADVICE, /* 发卡行冲正交易通知 */
INQUERY, /* 查询余额 */
MUL_QUY, /* 多笔查询 */
TRANS_IN,
TRANS_OUT,
TRANS_DUP,
-1
};
if (G_card_router_tab == NULL) {
errcall(ERROR, "卡路由表为空!");
return -1;
}
memcpy(cardno, lo->first_card_no, 20);
cardno[19] = '\0';
for (i = 0; i < G_card_router_num; i++) {
$ifdef wyz021115_modi;
if((strcmp(cardno, G_card_router_tab[i].first_card_no)>= 0) &&
(strcmp(cardno, G_card_router_tab[i].last_card_no) <= 0)){
$else;
if ( strcmp(cardno, G_card_router_tab[i].first_card_no) >= 0 &&
strcmp(cardno, G_card_router_tab[i].last_card_no) <= 0 &&
strcmp(c_type, G_card_router_tab[i].card_type) == 0 ) {
$endif;
for (j = 0; index_trans[j] != -1; j++) {
if ( index_trans[j] == type ){
if(G_card_router_tab[i].tran_bit[j] == '1') {
memcpy(lo, &(G_card_router_tab[i]),
sizeof(S_card_route));
return 0;
}
else break;
}
}
}
}
if (i == G_card_router_num) {
errcall(DEBUG, "没有找到卡路由!卡[%s]交易[%d]", cardno, type);
return -1;
}
return -1;
}
/***************************************************************
功能:
从内存交易路由表中查找特殊交易路由
ENTRY:
tablename 路由表名
type 交易类型
RETURN:
0 SUCC 路由信息=>tran_lo中
-1 FAIL
****************************************************************/
int select_tran_router(tran_lo, tablename,type)
S_tran_route *tran_lo;
char *tablename;
int type;
{
char *p=NULL;
int i, j;
//定义交易路由表中交易使能位图所对应的交易类型
int index_tran_route[32] = {
OFFLINE, /*离线交易*/
AUTH_PUR, /* 授权消费 */
$ifdef wyz_del_010711;
ACQ_ADVICE, /* 收单行通知 */
ACQ_REV_ADVICE, /* 收单行冲正交易通知 */
$endif;
CHECK_WB, /* 查 止 付 */
TEST_TRAN, /*测试交易*/
POS_LOGIN, /* EDC 签到 */
POS_SETTLE, /* POS 对帐 */
POS_SETTLE_2, /* POS二次结算 */
POS_BATCH_UP, /* POS批 上 送 */
POS_LOGOUT, /* EDC 签退 */
NET_LOGIN, /* 网络签到 */
NET_LOGOUT, /* 网络签退 */
NET_CHGKEY, /* 网间密钥交换*/
CUT_START, /* 日终切换开始 */
CUT_END, /* 日终切换结束 */
HOST_LOGIN, /* HOST签到 */
HOST_LOGOUT, /* HOST签退 */
HOST_BATCH_UP, /* HOST批 上 送 */
NET_SETTLE, /* 网间对帐 */
HOST_SETTLE, /* 主机对帐 */
-1
};
if (G_tran_router_tab == NULL) {
errcall(ERROR, "交易路由为空!");
return -1;
}
for (j = 0; index_tran_route[j] != -1; j++) {
if (index_tran_route[j] == type) {
for (i = 0; i < G_tran_router_num; i++){
if(G_tran_router_tab[i].tran_bit[j] == '1'){
memcpy(tran_lo,&(G_tran_router_tab[i]),
sizeof(S_tran_route));
return 0;
}
}
if (i == G_tran_router_num){
errcall(DEBUG,"没有找到交易[%d]的交易路由!",type);
return -1;
}
}
}
if (index_tran_route[j] == -1)
errcall(DEBUG,"没有找到交易[%d]的交易路由!",type);
return -1;
}
#ifdef wyz020813_mod
#else
/***************************************************************
功能:
从内存银行卡交易路由表中查找该银行卡的交易路由
ENTRY:
card_type 卡类型
bank_type 银行类型
RETURN:
0 SUCC 路由信息=>bankcard_lo中
-1 FAIL
****************************************************************/
int select_bankcard_router(bankcard_lo, bank_type, card_type)
S_bankcard_route *bankcard_lo;
char *bank_type;
char *card_type;
{
char *p=NULL;
int i, j;
if (G_bankcard_router_tab == NULL) {
errcall(DEBUG, "银行卡交易路由为空!");
return -1;
}
for (i = 0; i < G_bankcard_router_num; i++){
if (strcmp(G_bankcard_router_tab[i].bank_type, bank_type) == 0) {
memcpy(bankcard_lo,&(G_bankcard_router_tab[i]), sizeof(S_bankcard_route));
return 0;
}
}
if (i == G_bankcard_router_num){
errcall(DEBUG,"没有找到银行卡交易路由!");
return -1;
}
return -1;
}
#endif
/***************************************************************
功能:
从内存交易路由表中查找收单行通知交易路由
ENTRY:
type 交易类型
card_type 卡类型
RETURN:
0 SUCC 路由信息=>tran_lo中
-1 FAIL
****************************************************************/
int select_adv_router(adv_loc, type, card_type)
S_adv_route *adv_loc;
int type;
char *card_type;
{
int i;
if (G_adv_router_tab == NULL) {
errcall(DEBUG, "通知路由为空!");
return -1;
}
for (i = 0; i < G_adv_router_num; i++){
if ((G_adv_router_tab[i].tran_type == type) &&
!(strcmp(G_adv_router_tab[i].card_type, card_type))){
memcpy(adv_loc, &(G_adv_router_tab[i]),
sizeof(S_adv_route));
return 0;
}
}
return -1;
}
/***************************************************************
功能:
获取程序模板信息
ENTRY:
RETURN: -1 FAIL
0 SUCC, RESULT --> pr
****************************************************************/
int select_program_mode( pr )
S_sys_module *pr;
{
EXEC SQL BEGIN DECLARE SECTION;
S_sys_module l_sys_module;
EXEC SQL END DECLARE SECTION;
memcpy(&l_sys_module, pr, sizeof(S_sys_module));
EXEC SQL SELECT * INTO :l_sys_module FROM sys_module
WHERE module_id = :l_sys_module.module_id;
if (SQLCODE) {
errcall(ERROR, "取系统模块表失败[%d][%d]", SQLCODE,
l_sys_module.module_id );
return -1;
}
del_st_space("sys_module", &l_sys_module);
memcpy(pr, &l_sys_module, sizeof(S_sys_module));
return 0;
}
/***************************************************************
计算instr后 num 天的日期
ENTRY: instr --- 开始日期,格式: YYYYMMDD
num --- 天数( 日期可正,可负 )
RETURN: outstr --- 结果日期,格式: YYYYMMDD
-1 FAIL
0 SUCC
****************************************************************/
int dateadd( instr, num, outstr )
char *instr;
int num;
char *outstr;
{
char daystr[40];
long i_date;
int i;
memset(daystr, '\0', sizeof(daystr));
sprintf(daystr, "%2.2s/%2.2s/%4.4s",
&instr[4], &instr[6], &instr[0]);
i = rstrdate(daystr, &i_date);
i_date = i_date + num;
rdatestr(i_date, daystr);
sprintf(outstr, "%4.4s%2.2s%2.2s",
&daystr[6], &daystr[0], &daystr[3]);
return 0;
}
/***************************************************************
功能:
装载相关的联行信息(从所有路由表搜取)
ENTRY:
RETURN:
0 SUCC
-1 FAIL
****************************************************************/
int load_bank_tab ()
{
EXEC SQL BEGIN DECLARE SECTION;
S_bank_base bank_base_item;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -