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

📄 backup.ec

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 EC
字号:
/*******************************************************
 *	数据备份与恢复(backup_proc,rescovery_proc)
 *
 * 最后修改:	周国祥 2001/08/18
 *******************************************************/
#include <stdio.h>
#include <curses.h>
#include <varargs.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <time.h>

#include "all.h"
#include "macro_def.h"
#include "tool.h"

$include "db_struct.h";
$include sqlca;

#define WD	getenv ( "WORKDIR" )
#define  COL_LEE	2

void error_handler ();
void warning_handler ();
void notfound_handler ();

/*
extern WINDOW *my_win;
*/
WINDOW *my_win;

EXEC SQL WHENEVER SQLERROR CALL error_handler;
EXEC SQL WHENEVER SQLWARNING CALL warning_handler;
EXEC SQL WHENEVER NOT FOUND CALL notfound_handler;

char	backup_table[100][40] = {
		"cur_tran_ls",
		"his_tran_ls",
		"err_tran_ls",
		"cur_settle_ls",
		"his_settle_ls",
		"saf_ls",
		"cur_hand_ls",
		"his_hand_ls",
	
		"",
		NULL,
};

int backup_ls ()
{
	char buff[1024];
	int ret;
	int i = 0;
	
	while (backup_table[i] != NULL && backup_table[i][0] != '\0') {
#ifdef Wubin_mod_20020509
		sprintf ( buff ,\
			"dbaccess - - 2>/dev/null 1>/dev/null <<!\ndatabase %s;\nunload to \"%s/backup/%s\" select * from %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_table[i], backup_table[i] );
		ret = system ( buff );
	
		if ( ret ) {
			errcall ( ERROR , "Unable unload %s!", backup_table[i]);
			return -1;
		}
#else
		sprintf ( buff ,\
			"unload to %s/backup/%s select * from %s ", getenv("WORKDIR"), backup_table[i], backup_table[i] );
		ret = sql_run(buff);
	
		if (ret < 0) {
			errcall ( ERROR , "Unable unload %s! failed![%d]", backup_table[i], ret);
			return -1;
	        }
#endif	

	}

	return 0;
}

int recovery_ls ()
{
	char buff[1024];
	int ret;
	
	int i = 0;
	
	while (backup_table[i] != NULL && backup_table[i][0] != '\0') {
#ifdef Wubin_mod_20020509
		sprintf ( buff ,\
			"dbaccess - - 2>/dev/null 1>/dev/null <<!\ndatabase %s;\nload from \"%s/backup/%s\" insert into %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_table[i], backup_table[i]);
		ret=system ( buff );
	
		if ( ret ) {
			errcall ( ERROR , "Unable load %s!", backup_table[i] );
			return -1;
		}
#else
		sprintf ( buff ,\
			"load from %s/backup/%s insert into %s ", getenv("WORKDIR"), backup_table[i], backup_table[i]);
		ret = sql_run(buff);
	
		if (ret < 0) {
			errcall ( ERROR , "Unable load %s! failed![%d]", backup_table[i], ret );
			return -1;
	        }
#endif	
	}

	return 0;
}

int backup_proc ()
{
	char	filename[250], tmp[81];
	int		ch, line, ret;
	char	cmd[300], fileout[128], backup_date[9];

	tmp[0] = backup_date[0] = 0;	
	ch = ret = 0;

	sprintf(filename, "/tmp/.backup_proc.%d", getpid());
	scr_dump(filename);
	
	DispBelow("数据备份处理");
	clear_wline(stdscr, LINES-1);
	my_win = newwin(19, 80, 3, 0);
	mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
	wrefresh(my_win);

	line = COL_LEE;

	if ( yorn(my_win, line++, "    是否进行数据备份处理?", "1.是", "0.否", 1, 0)) {
		goto end;
	}

	strcpy(fileout, " 磁带 ");
	ch = strlen(fileout) + 1;
	strcpy(fileout + ch, " 硬盘 ");
	ch += strlen(fileout + ch) + 1;
	strcpy(fileout + ch, " 取消 ");
	ch = multi_select(my_win, 1, "    请选择备份存储设备:", fileout, 3, 1, 0, 0);

	if (ch == 2) {
		goto end;
	}

	if (ch == 1) {
		getdatef(backup_date,"");
		mvwprintw(my_win, 2, 4, "请输入备份日期(YYYYMMDD): [%s]", backup_date);
		if (in_item(my_win, "", 2, 31, backup_date, 8, NULL, NULL, 0, 0) != ENTER) {
			goto end;
		}
		mvwprintw(my_win, 2, 4, "                                                               ");

		strcpy(fileout, " 交易流水 ");
		ch = strlen(fileout) + 1;
		strcpy(fileout + ch, " 所有路由 ");
		ch += strlen(fileout + ch) + 1;
		strcpy(fileout + ch, " 基本资料 ");
		ch += strlen(fileout + ch) + 1;
		strcpy(fileout + ch, " 取消 ");
		ch = multi_select(my_win, 1, "    请选择需要备份的数据:", fileout, 4, 3, 0, 0);

		switch (ch) {
		    case 0:
			strcpy(tmp, "TRAN_LS");
			break;
	 	  	case 1:
			strcpy(tmp, "ROUTE");
			break;
	 	  	case 2:
			strcpy(tmp, "INFOMATION");
			break;
	 	  	case 3:
			goto end;
			break;

	  	  	default:
			goto end;
			break;
		}

/* 		daylog(DEBUG, "正在生成备份数据, 备份日期: %s, 请稍候 ...", backup_date);		 */
		mvwprintw(my_win, 4, 4, "正在生成备份数据, 请稍候 ...");
		wrefresh(my_win);

		ret = backup_db(tmp, backup_date);
		
		if (ret == 0) {
			sprintf ( cmd , "备份数据成功, 按任一键继续... [%s/backup/%s]", getenv("WORKDIR"), backup_date);
/* 			sprintf ( cmd , "备份数据成功, 按任一键继续..."); */
			mvwaddstr ( my_win , 17 , 4 , cmd );
			wgetch ( my_win );
			goto end;
		} else {
			errcall ( ERROR , "Unable backup ls !\n" );
			sprintf ( cmd , "备份数据失败, 按任一键继续... [%s/backup/%s]", getenv("WORKDIR"), backup_date);
			sprintf ( cmd , "备份数据失败, 按任一键继续...");
			mvwaddstr ( my_win , 17 , 4 , cmd );
			wgetch ( my_win );

			delwin(my_win);
			scr_restore(filename);
			unlink(filename);
			return -1;
		}
	}

	sprintf ( cmd , "rm -f %s/backup/*" , WD );
	system ( cmd );

	if ( backup_ls () < 0 ) {
		errcall ( ERROR , "Unable backup ls !\n" );
		sprintf ( cmd , "备份数据失败, 按任一键继续...");
		mvwaddstr ( my_win , 17 , 4 , cmd );
		wgetch ( my_win );

		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return -1;
	}
	
	if ( yorn(my_win, line++,
		"    是否将数据倒入磁带?", "1.是", "0.否", 1, 0)) {
		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return(0);
	}

	sprintf(cmd,
	"tar cv8 2>/dev/null 1>/dev/null %s/etc %s/install %s/backup %s/box",
		WD , WD , WD , WD );
	if ( system ( cmd ) != 0 ) {
		wrefresh( my_win );
		sprintf ( cmd , "备份数据失败, 按任一键继续...");
		mvwaddstr ( my_win , 17 , 4 , cmd );
		wgetch ( my_win );
	} else {
		sprintf ( cmd , "备份数据成功, 按任一键继续...");
		mvwaddstr ( my_win , 17 , 4 , cmd );
		wgetch ( my_win );
	}

end:
	delwin(my_win);
	scr_restore(filename);
	unlink(filename);
	
	return 0;
}

int recovery_proc ()
{
	char	filename[250], tmp[81], backup_date[9];
	int		ch, line, ret;
	char	cmd[300], fileout[128];

	ret = 0;	tmp[0] = backup_date[0] = 0;	
	ch = ret = 0;

	sprintf(filename, "/tmp/.recovery_proc.%d", getpid());
	scr_dump(filename);
	
	DispBelow("数据恢复处理");
	clear_wline(stdscr, LINES-1);
	my_win = newwin(19, 80, 3, 0);
	mvwprintw(my_win, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
	wrefresh(my_win);
	
	line = COL_LEE;
	
	if (yorn(my_win, line++, " 注意: 如果恢复数据将覆盖当前数据库中的数据, 是否进行数据恢复?", "1.是", "0.否", 1, 0)) {
		goto end;
	}

	strcpy(fileout, " 磁带 ");
	ch = strlen(fileout) + 1;
	strcpy(fileout + ch, " 硬盘 ");
	ch += strlen(fileout + ch) + 1;
	strcpy(fileout + ch, " 取消 ");
	ch = multi_select(my_win, 1, "    请选择存储恢复数据的设备:", fileout, 3, 2, 0, 0);

	if (ch == 2) {
		goto end;
	}

	if (ch == 1) {
		strcpy(backup_date,"        ");
		mvwprintw(my_win, 2, 4, "请输入恢复数据日期(YYYYMMDD): [%s]", backup_date);
		if (in_item(my_win, "", 2, 35, backup_date, 8, NULL, NULL, 0, 0) != ENTER) {
			goto end;
		}
	sprintf(tmp, "cd %s/backup/%s >/dev/null 2>&1", getenv("WORKDIR"), backup_date);
	ret = system(tmp);
	if ( ret ) {
		errcall ( ERROR , "Not found %s/backup/%s", getenv("WORKDIR"), backup_date);
			sprintf ( cmd , "需要恢复的数据[%s/backup/%s]不存在", getenv("WORKDIR"), backup_date);
			mvwaddstr ( my_win , 17 , 4 , cmd );
			wgetch ( my_win );

			delwin(my_win);
			scr_restore(filename);
			unlink(filename);
			return -1;
		}

		mvwprintw(my_win, 2, 4, "                                                               ");

		strcpy(fileout, " 交易流水 ");
		ch = strlen(fileout) + 1;
		strcpy(fileout + ch, " 所有路由 ");
		ch += strlen(fileout + ch) + 1;
		strcpy(fileout + ch, " 基本资料 ");
		ch += strlen(fileout + ch) + 1;
		strcpy(fileout + ch, " 取消 ");
		ch = multi_select(my_win, 1, "    请选择需要恢复的数据:", fileout, 4, 3, 0, 0);

		if (ch == 3)
			 goto end;
		if (yorn(my_win, line++, " 注意: 数据恢复将覆盖当前数据库中的数据, 是否进行数据恢复?", "1.是", "0.否", 1, 0)) {
			goto end;
		}

		switch (ch) {
		    case 0:
			strcpy(tmp, "TRAN_LS");
			break;
	 	  	case 1:
			strcpy(tmp, "ROUTE");
			break;
	 	  	case 2:
			strcpy(tmp, "INFOMATION");
			break;
	 	  	case 3:
			goto end;
			break;

	  	  	default:
			goto end;
			break;
		}

		mvwprintw(my_win, 4, 4, "正在向数据库中恢复数据, 请稍候 ...");
		wrefresh(my_win);

		ret = recovery_db(tmp, backup_date);
		
		if (ret == 0) {
			sprintf ( cmd , "恢复数据成功, 按任一键继续...");
			mvwaddstr ( my_win , 17 , 4 , cmd );
			wgetch ( my_win );
			goto end;
		} else {
			errcall ( ERROR , "Unable recovery ls !\n" );
			sprintf ( cmd , "恢复数据失败, 按任一键继续...");
			mvwaddstr ( my_win , 17 , 4 , cmd );
			wgetch ( my_win );

			delwin(my_win);
			scr_restore(filename);
			unlink(filename);
			return -1;
		}
	}

	if (yorn(my_win, line++, "    是否从磁带装入数据?", "1.是", "0.否", 1, 0))
		goto end;
	else {
		sprintf ( cmd , "rm -f %s/backup/* >/dev/null 2>&1" , WD );
		system ( cmd );

		sprintf ( cmd , "tar xv8 >/dev/null 2>&1" );
		ret = system ( cmd );
		if ( ret ) {
			errcall ( ERROR , "Execute error!(%s) ", cmd);
			sprintf ( cmd , "读写磁带设备失败, 请确认磁带设备是否正常 按任一键继续...");
			mvwaddstr ( my_win , 17 , 4 , cmd );
			wgetch ( my_win );

			delwin(my_win);
			scr_restore(filename);
			unlink(filename);
			return -1;
		}
	}

	
	if ( recovery_ls () < 0 ) {
		errcall ( ERROR , "Unable recovery ls !\n" );
		sprintf ( cmd , "恢复数据失败, 按任一键继续...");
		mvwaddstr ( my_win , 17 , 4 , cmd );
		wgetch ( my_win );

		delwin(my_win);
		scr_restore(filename);
		unlink(filename);
		return -1;
	}
	
	sprintf ( cmd , "恢复数据成功, 按任一键继续...");
	mvwaddstr ( my_win , 17 , 4 , cmd );
	wgetch ( my_win );

end:
	delwin(my_win);
	scr_restore(filename);
	unlink(filename);
	
	return 0;
}


/*================== WuBin 2001-9-8 15:33 ======Start==============
根据库表名备份数据到相应日期的目录
===========================2001-9-8 15:33=======End==============*/

int backup_db (char *table_name, char *backup_date)
{
	$char buff[1024], tmp[150];
	int ret, i;
	struct table_arry_st table_arry[50];	/* 目标数组名 */
	
	memset(table_arry, '\0', sizeof(table_arry));
	i = ret = 0;
	
	sprintf(buff, "mkdir %s/backup/%s >/dev/null 2>&1", getenv("WORKDIR"), backup_date);
	system(buff);

	sprintf(tmp, "%s/etc/backup_table", getenv("WORKDIR"));
	ret = readtab2arry(tmp, table_name, table_arry);

	if ( ret ) {
			errcall ( ERROR , "Read %s Error! ", tmp);
			return -1;
	}

	while (table_arry[i].table_name[0] != 0 ) {
		sprintf(buff, "rm -f %s/backup/%s/%s >/dev/null 2>&1", getenv("WORKDIR"), backup_date, table_arry[i].table_name);
		system(buff);
		i++;
	}
	i = 0;
	while (table_arry[i].table_name[0] != 0) {
		memset(buff, 0, sizeof(buff));
#ifdef Wubin_mod_20020509
		sprintf ( buff , "dbaccess - - 2>/dev/null 1>/dev/null <<!\ndatabase %s;\nunload to \"%s/backup/%s/%s\" select * from %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_date, table_arry[i].table_name, table_arry[i].table_name );
		ret = system ( buff );
		if ( ret ) {
			errcall ( ERROR , "Unable unload %s! [ret =  %d]", table_arry[i].table_name, ret);
			return -1;
		}
#else
		sprintf ( buff , "unload to %s/backup/%s/%s select * from %s ", getenv("WORKDIR"), backup_date, table_arry[i].table_name, table_arry[i].table_name );

		ret = sql_run(buff);
	
		if (ret < 0) {
			errcall(ERROR, "Unable unload %s! failed![%d]", table_arry[i].table_name, ret);
			return -1;
	        }
#endif
		i++;
	}
	return 0;
}



/*================== WuBin 2001-9-8 15:33 ======Start==============
根据库表名恢复数据从相应日期的目录
===========================2001-9-8 15:33=======End==============*/
int recovery_db (char *table_name, char *backup_date)
{
	char buff[1024], tmp[150];
	int ret, i;
	struct table_arry_st rc_table_arry[50];	/* 目标数组名 */
	
	memset(rc_table_arry, '\0', sizeof(rc_table_arry));
	i = ret = 0;
	
	sprintf(buff, "cd %s/backup/%s >/dev/null 2>&1", getenv("WORKDIR"), backup_date);
	ret = system(buff);
	if ( ret ) {
			errcall ( ERROR , "Not found %s", buff);
			return -1;
		}

	sprintf(tmp, "%s/etc/backup_table", getenv("WORKDIR"));
	ret = readtab2arry(tmp, table_name, rc_table_arry);

	if ( ret ) {
			errcall ( ERROR , "Read %s Error!", tmp);
			return -1;
	}
	
	while (rc_table_arry[i].table_name[0] != 0 ) {
		sprintf(buff, "ls %s/backup/%s/%s >/dev/null 2>&1", getenv("WORKDIR"), backup_date, rc_table_arry[i].table_name);
		ret = system(buff);
		if ( ret ) {
			errcall ( ERROR , "Read %s Error!", rc_table_arry[i].table_name);
			return -1;
		}
		i++;
	}
	i = 0;
	while (rc_table_arry[i].table_name[0] != 0) {
#ifdef Wubin_mod_20020509
		sprintf ( buff , "dbaccess - - 2>/dev/null 1>/dev/null <<!\ndatabase %s;\ndelete from %s;\n!", getenv("DBNAME"), rc_table_arry[i].table_name );
		ret = system ( buff );
		if ( ret ) {
			errcall ( ERROR , "Unable delete %s [ret = %d]!", rc_table_arry[i].table_name, ret);
			return -1;
		}
#else
		sprintf ( buff , "delete from %s;\n!", rc_table_arry[i].table_name );
		ret = sql_run(buff);
	
		if (ret < 0) {
			errcall ( ERROR , "Unable delete %s failed![%d]", rc_table_arry[i].table_name, ret);
			return -1;
		}
#endif

#ifdef Wubin_mod_20020509
		sprintf ( buff , "dbaccess - - 2>/dev/null 1>/dev/null <<!\ndatabase %s;\nload from \"%s/backup/%s/%s\" insert into %s;\n!", getenv("DBNAME"), getenv("WORKDIR"), backup_date, rc_table_arry[i].table_name, rc_table_arry[i].table_name );
		ret = system ( buff );
		if ( ret ) {
			errcall ( ERROR , "Unable load %s [ret = %d]!", rc_table_arry[i].table_name, ret);
			return -1;
		}
#else
		sprintf ( buff , "dload from %s/backup/%s/%s insert into %s ", getenv("WORKDIR"), backup_date, rc_table_arry[i].table_name, rc_table_arry[i].table_name );
		ret = sql_run(buff);
	
		if (ret < 0) {
			errcall ( ERROR , "Unable load %s failed![%d]", rc_table_arry[i].table_name, ret);
			return -1;
		}
#endif
		i++;
	}

	return 0;
}

⌨️ 快捷键说明

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