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

📄 audit.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 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 + -