📄 audit.ec
字号:
/*
* 审计处理
* 同时处理上下传
*
* 周国祥 2001/04/07 修改操作员库表处理
* 周国祥 2001/05/15 修改dict[]定义,以及有关上下传键值的处理
*/
#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <curses.h>
#include <sys/types.h>
#include "mytools.h"
#include "shmsys.h"
#include "tool.h"
$include "db_struct.h"
EXEC SQL INCLUDE sqlca;
EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;
extern WINDOW *sql_win;
extern char *mstr;
extern int do_update, do_insert, do_delete;
$extern char *sql_str;
$static char date[9], time[7];
$static char oper_no[7], oper_name[11];
#ifndef zgx010407
$static char role_code[4];
#endif
#ifdef zgx010515_del /* move to incl/db_dict.h */
static struct db_dict {
char *tablename;
char *key_field[6];
char downloadflag;
char uploadflag;
} dict[] = {
{ "bank_info", { "bank_id", "host_id", NULL },1,1 },
{ "bank_base", { "bank_id", "host_id", NULL },0,1 },
{ "bank_acct", { "bank_id", "host_id", NULL },0,0 },
{ "merchant_base", { "merchant_id", NULL },0,1 },
{ "vip_card", { "card_no", NULL },0,1 },
{ "bank_limit_amt", { "bank_id", "host_id", NULL },1,1 },
{ "edc_terminal", { "terminal_id", "merchant_id" },0,1 },
{ "edc_dl_ctl", { "terminal_id", "merchant_id" },0,1 },
{ "edc_trans", { "terminal_id", "merchant_id" },0,1 },
{ "edc_card", { "terminal_id", "merchant_id" },0,1 },
{ "edc_dl_param", { "mode_type", NULL },0,1 },
{ "adm_bank_ctrl", { "bank_id", "host_id", NULL },1,0 },
{ "wb_list", { "card_no", NULL },0,0 },
{ "card_acct", { "card_no", NULL },0,0 },
{ "cur_tran_ls", { "merchant_id","terminal_id","card_no",NULL },0,0 },
{ "err_tran_ls", { "merchant_id", "terminal_id", "card_no",NULL },0,0 },
//{ "hjd", { "merchant_id", "batch_no", NULL },0,0 },
//{ "rmb_rate", { "currency", "date", NULL },0,0 },
{ "center_oper", { "oper_no", NULL },0,0 },
{ "merchant_oper", { "merchant_id", "oper_no", NULL },0,0 },
{ "sys_param", { "bank_id", NULL },0,0 },
{ "card_type", { "card_no", NULL },0,0 },
{ "sys_module", { "module_id", NULL },0,0 },
//{ "pos_param", { "mode_type", NULL },0,0 },
{ "card_route", {"first_card_no", "last_card_no", "rcv_bank_id", "rcv_host_id", "module_id", NULL },0,0 },
{ "default_route", { "rcv_bank_id", "rcv_host_id", "module_id", NULL },0,0 },
{ "control_card", { "card_no", NULL },1,1 },
{ NULL, }};
#else
#include "db_dict.h"
#endif
void rm_sub(char *source, char *pbegin, char *pend)
{
char *ptr, *tmp;
ptr = strstr(source, pbegin);
if (ptr == NULL)
return;
tmp = strstr(ptr, pend);
if (tmp == NULL)
return;
if (!strcmp(pend, "where"))
*(ptr - 1) = ' ';
*ptr = 0;
strcat(source, tmp);
}
static int init_audit()
{
getdatef(date, "");
gettimef(time, "");
strcpy(oper_no, G_oper_no);
EXEC SQL SELECT oper_name, role_code
INTO :oper_name, :role_code
FROM center_oper
WHERE oper_no = :oper_no;
return(SQLCODE);
}
int misc_audit(action, win, row, col)
$parameter char *action;
WINDOW *win;
int row;
int col;
{
if (init_audit())
return(-1);
EXEC SQL INSERT INTO audit
VALUES (:date, :time, :oper_no, :oper_name, :role_code, :action);
if (SQLCODE && win) {
clear_wline(win, row);
h_winprompt(win, row, col, "审计失败(misc_audit)!", 0, 0);
}
return(SQLCODE);
}
int audit(scr)
struct screen_st scr;
{
PSTAT pstat;
pid_t pid;
$S_sys_param sy;
$char action[200];
$long sid;
$short indi;
$char tablename[32], keyval[32], act, down_flag;
char mid[300], bak[200], org[200], tmp[200], key[256/*32*/], *ptr;
struct field_st *f_ptr;
int i, j, k;
char is_key = 0;
char first = 0;
char key_a[6][32], keyval_a[6][32];
for (i = 0; i < 6; i++) {
key_a[i][0] = '\0';
keyval_a[i][0] = '\0';
}
i = 0;
while (1) {
if (!dict[i].tablename) {
errcall(DEBUG, "Audit dictionary not found[%s]!", scr.tablename);
return(0);
}
if (!strcmp(dict[i].tablename, scr.tablename))
break;
i++;
}
if (init_audit()) {
clear_wline(sql_win, 16);
h_winprompt(sql_win, 16, 3, "审计失败!(init_audit)", 0, 0);
return(-1);
}
if (do_insert) strcpy(action, "增加表 ");
if (do_update) strcpy(action, "修改表 ");
if (do_delete) strcpy(action, "删除表 ");
strcat(action, scr.tablename);
strcat(action, " :");
if (do_update) {
bak[0] = 0;
ptr = mstr;
for (f_ptr = scr.fields; ; f_ptr++, ptr += strlen(ptr) + 1) {
if (MV_FORM(f_ptr->option) || MV_EXCEL(f_ptr->option)) {
if (MV_END(f_ptr->option)) break;
continue;
}
/* 判断本字段是否为主键字段 */
is_key = 0;
for (j = 0; dict[i].key_field[j]; j++) {
if (!strcmp(f_ptr->field_name, dict[i].key_field[j])) {
is_key = 1;
break;
}
}
strcpy(org, ptr);
rm_tail_space(org);
fieldtostr(f_ptr, tmp);
rm_tail_space(tmp);
#ifdef zgx010514_modi
/* update by XINGJUN 990406 nas-u-18-990406 */
// if ((i < 10) && dict[i].key_field[j]) {
if ((dict[i].downloadflag==1 || dict[i].uploadflag==1 )
&& dict[i].key_field[j]) {
/* update END */
strcpy(key, f_ptr->field_name);
strcpy(keyval, org);
}
#else
if ((dict[i].downloadflag==1 || dict[i].uploadflag==1 )
&& is_key ) {
strcpy(key_a[j], f_ptr->field_name);
strcat(keyval_a[j], org);
}
#endif
mid[0] = 0;
if (is_key || strcmp(org, tmp)) {
strcpy(mid, " ");
strcat(mid, f_ptr->field_name);
strcat(mid, "[");
strcat(mid, org);
strcat(mid, "]");
/* 若tmp==org则表示结束,无需再加上以下内容 */
if (strcmp(tmp, org)) {
strcat(mid, "[");
strcat(mid, tmp);
strcat(mid, "]");
}
}
if (is_key) {
if (strlen(action) + strlen(mid) > 199)
break;
strcat(action, mid);
} else
if (strlen(action) + strlen(bak) + strlen(mid) < 200)
strcat(bak, mid);
if (MV_END(f_ptr->option))
break;
}
if (strlen(action) < 199) {
j = k = 0;
while (1) {
if (!bak[j]) break;
if (bak[j++] == ']')
if (!bak[j] || (bak[j] == ' '))
if (strlen(action) + j < 200) k = j;
else break;
}
if (strlen(action) + j < 200) k = j;
bak[k] = 0;
strcat(action, bak);
}
} else {
for (f_ptr = scr.fields; ; f_ptr++) {
if (MV_FORM(f_ptr->option) || MV_EXCEL(f_ptr->option)) {
if (MV_END(f_ptr->option)) break;
continue;
}
is_key = 0;
for (j = 0; dict[i].key_field[j]; j++) {
if (!strcmp(f_ptr->field_name, dict[i].key_field[j])) {
is_key = 1;
break;
}
}
if (is_key) {
strcpy(mid, " ");
strcat(mid, f_ptr->field_name);
strcat(mid, "[");
fieldtostr(f_ptr, tmp);
rm_tail_space(tmp);
strcat(mid, tmp);
strcat(mid, "]");
#ifdef zgx010515_modi
if (i < 10) {
strcpy(key, f_ptr->field_name);
strcpy(keyval, tmp);
}
#else
if (dict[i].downloadflag==1 || dict[i].uploadflag==1 ) {
strcat(key_a[j], f_ptr->field_name);
strcat(keyval_a[j], tmp);
}
#endif
if (strlen(action) + strlen(mid) > 199)
break;
strcat(action, mid);
}
if (MV_END(f_ptr->option))
break;
}
}
EXEC SQL INSERT INTO audit
VALUES (:date, :time, :oper_no, :oper_name, :role_code, :action);
if (SQLCODE) {
sprintf(tmp, "审计失败(insert into audit)(%d)!", SQLCODE);
clear_wline(sql_win, 16);
h_winprompt(sql_win, 16, 3, tmp, 0, 0);
return(-1);
}
if (dict[i].downloadflag != 1 && dict[i].uploadflag != 1)
return(0);
// select_sys_param(&sy);
#ifdef zgx010515_moni
if ((i == 0) || (i == 1) || (i == 2) || (i == 6))
if (strncmp(keyval, sy.bank_id, strlen(keyval)))
return(0);
if ((i == 3) || (i == 7))
if (strncmp(keyval, sy.bank_id, 11))
return(0);
if (i == 8) {
for (f_ptr = scr.fields; ; f_ptr++) {
if (MV_FORM(f_ptr->option) || MV_EXCEL(f_ptr->option))
continue;
if (!strcmp(f_ptr->field_name, "merchant_id"))
break;
}
fieldtostr(f_ptr, tmp);
if (strncmp(tmp, sy.bank_id, 11))
return(0);
}
#else
if (!strcmp(dict[i].tablename, "bank_info") ||
!strcmp(dict[i].tablename, "bank_base") ||
!strcmp(dict[i].tablename, "bank_acct") ||
!strcmp(dict[i].tablename, "bank_equip") ||
!strcmp(dict[i].tablename, "bank_limit_amt") ||
!strcmp(dict[i].tablename, "adm_bank_ctrl") ) {
/* 这些表若修改的是他行资料,则无需做上下传 */
for (j = 0; dict[i].key_field[j]; j++) {
if (!strcmp(key_a[j], "bank_id")) {
if (strcmp(keyval_a[j], sy.bank_id))
return(0);
}
if (!strcmp(key_a[j], "host_id")) {
if (strcmp(keyval_a[j], sy.host_id))
return(0);
}
}
}
if (!strcmp(dict[i].tablename, "merchant_base")) {
/* 不是本行签约商户资料的修改无需上传 */
char bankid[12], hostid[3];
bankid[0] = '\0';
hostid[0] = '\0';
for (f_ptr = scr.fields; ; f_ptr++) {
if (MV_FORM(f_ptr->option) || MV_EXCEL(f_ptr->option))
continue;
if (!strcmp(f_ptr->field_name, "sign_bank_id")) {
fieldtostr(f_ptr, tmp);
strncpy(bankid, tmp, 11);
bankid[11] = '\0';
}
if (!strcmp(f_ptr->field_name, "sign_host_id")) {
fieldtostr(f_ptr, tmp);
strncpy(hostid, tmp, 2);
hostid[2] = '\0';
break;
}
}
if (strcmp(bankid, sy.bank_id) || strcmp(hostid, sy.host_id))
return(0);
}
if (!strcmp(dict[i].tablename, "edc_terminal")) {
/* 不是本行签约商户的EDC终端资料的修改无需上传 */
char bankid[12], hostid[3];
tmp[0] = '\0';
for (f_ptr = scr.fields; ; f_ptr++) {
if (MV_FORM(f_ptr->option) || MV_EXCEL(f_ptr->option))
continue;
if (!strcmp(f_ptr->field_name, "merchant_id")) {
fieldtostr(f_ptr, tmp);
break;
}
}
/* 根据商户号获取签约行号主机号 */
get_sign_bank(tmp, bankid, hostid);
if (strcmp(bankid, sy.bank_id) || strcmp(hostid, sy.host_id))
return(0);
}
/*
*按库标主键定义顺序生成键值串,以便上下传时取用
*/
key[0] = '\0';
keyval[0] = '\0';
first = 0;
for (j = 0; dict[i].key_field[j]; j++) {
if (key_a[j][0] == '\0')
break;
if (first == 0) {
strcat(key, key_a[j]);
strcat(keyval, keyval_a[j]);
first = 1;
} else {
strcat(key, ",");
strcat(key, key_a[j]);
strcat(keyval, ",");
strcat(keyval, keyval_a[j]);
}
}
#endif
//上传默认, 下传可选 (省行级不能只做下传,不做上传
if (dict[i].downloadflag != 1)
down_flag = 'N';
else
down_flag = 'Y';
strcpy(tablename, scr.tablename);
if (do_insert) act = 'A';
if (do_update) act = 'U';
if (do_delete) act = 'D';
#ifdef zgx010515_modi
if (do_update && (i == 1)) {
rm_sub(sql_str, "moni_enable", "interval");
rm_sub(sql_str, "log_stat", "settle_flag");
rm_sub(sql_str, "settle_flag", "where");
}
#else
if (do_update && (!strcmp(dict[i].tablename, "bank_base"))) {
rm_sub(sql_str, "moni_enable", "moni_interval");
rm_sub(sql_str, "login_stat", "settle_flag");
rm_sub(sql_str, "settle_flag", "update_oper");
}
#endif
if (!do_insert) {
#ifdef zgx010515_modi
sprintf(mid, "%s=\'%s\'", key, keyval);
#else
/* 根据竹键名及键值构造WHERE串 */
make_where_str(mid, key, keyval);
#endif
j = strlen(sql_str) - 5;
while (strncmp(sql_str + j, "where", 5))
j--;
sql_str[j + 6] = 0;
strcat(sql_str, mid);
}
EXEC SQL LOCK TABLE send_detail IN EXCLUSIVE MODE;
if (SQLCODE) {
clear_wline(sql_win, 16);
h_winprompt(sql_win, 16, 3, "上传失败!", 0, 0);
return(-1);
}
EXEC SQL SELECT MAX(sid)
INTO :sid:indi
FROM send_detail;
if (indi == -1) sid = 1;
else if (SQLCODE) {
clear_wline(sql_win, 16);
h_winprompt(sql_win, 16, 3, "上传失败!", 0, 0);
return(-1);
} else
sid++;
EXEC SQL INSERT INTO send_detail
VALUES (:sy.bank_id, :sy.host_id, :date, :sid, :tablename,
:keyval, :act, :sql_str, :down_flag);
if (SQLCODE) {
clear_wline(sql_win, 16);
h_winprompt(sql_win, 16, 3, "上传失败!", 0, 0);
return(-1);
}
#ifdef wyz020505_mod
strcpy(pstat.name, "updown");
if (!sel_shm_pid(&pstat) && (pstat.pause == ACTIVE)) {
if (get_pid(pstat.name, &pid) == 0 && kill(pid, SIGUSR2) == 0) {
return(0);
}
}
clear_wline(sql_win, 16);
h_winprompt(sql_win, 16, 3, "上传失败!", 0, 0);
return(-1);
#else
/* 通过服务模块进行激活 */
return(0);
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -