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

📄 backupdlg.cpp

📁 1采用了tcp通信。 2实现自由选择主辅库。 backup:数据库监视备份软件(backup.exe,backup.ini,backup.log,sendclient.log)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if(m_status == 5) 
		{//主库断了
			SendStatus(m_CurMain,m_status);
            ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
			KillTimer(10);
            m_status = 6;
			KillTimer(1);
			SendStatus(m_CurMain,m_status);
            ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
			if(StartSecondBase())//启动辅库
			{
				m_status = 1;
                ChangeServer();
			}
			else 
			{
				m_status = 0;
				m_check = 0;
			}
			
			SendStatus(m_CurMain,m_status);
            ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
			
			if(m_status != 0)
			{
				SetTimer(10,m_checkinterval,NULL); 
			}
		}
		else if (m_status == 0)
		{
			KillTimer(1);
			KillTimer(10);
			m_check = 0;
			SendStatus(m_CurMain,m_status);
			ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
		} 
		else if(m_status == 1)
		{   
			if(	m_laststatus != m_status)
			{
				KillTimer(1);
				KillTimer(10);
				SendStatus(m_CurMain,m_status);
				ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
				m_laststatus = m_status;
				SetTimer(10,m_checkinterval,NULL); 
			}
		}
	}
	CDialog::OnTimer(nIDEvent);
}
//
//手工启动辅库,停止备份.
//
void CBackupDlg::OnOK() 
{
	if(StartSecondBase())
		m_status = 2;
	else 
		m_status = 0;
	SendStatus(m_CurMain,m_status);
    ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
}

void CBackupDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	CDialog::OnCancel();
}
//
//清除零时文件:上次备份的零时文件
//
void CBackupDlg::OnClear() 
{
	// TODO: Add your control notification handler code here
	
    WIN32_FIND_DATA FindFileData;
	CString fullfilename = m_datapath;
    CString findfilename =m_datapath + "*.tra";
	while( FindFirstFile(findfilename,&FindFileData)!= INVALID_HANDLE_VALUE)
	{ 
		fullfilename += FindFileData.cFileName;
		DeleteFile(fullfilename);
        fullfilename = m_datapath;
	}
    findfilename =m_datapath + "*.bak";
	while( FindFirstFile(findfilename,&FindFileData)!= INVALID_HANDLE_VALUE)
	{ 
		fullfilename += FindFileData.cFileName;
		DeleteFile(fullfilename);
        fullfilename = m_datapath;
	}
	
}
//
//监视子程序
// 返回 0,1,5
void CBackupDlg::GetDataBaseStatus(int &status)
{
	//status
	//0 主库断开,辅库断开;
	//1 主库正常,辅库断开;
	//2 主库正常,辅库正常但未开始备份工作;
	//3 主库正常,辅库正常但备份失败;
	//4 主库正常,辅库正常备份;
	//5 主库断开,辅库未工作.
	//6 主辅库切换中...
	if (status == 1)
		TRY
	{
		m_MainBase->m_Cdatabase->ExecuteSQL (m_teststring);
	}
	CATCH(CDBException, e)
	{
		status = 0;
	}
	END_CATCH
		else if(status == 5)		
		TRY
	{
		m_BackupBase->m_Cdatabase->ExecuteSQL (m_teststring);
	}
	CATCH(CDBException, e)
	{
		status = 0;
	}
	END_CATCH
		else 
	{
		TRY
		{
			m_MainBase->m_Cdatabase->ExecuteSQL (m_teststring);
		}
		CATCH(CDBException, e)
		{
			status = 5;
		}
		END_CATCH
			TRY
		{
			m_BackupBase->m_Cdatabase->ExecuteSQL (m_teststring);
		}
		CATCH(CDBException, e)
		{
			if(status == 5)
				status = 0;
			else
				status = 1;
		}
		END_CATCH
	}
	
	if (status == 0)
	{
		m_MainBase->m_Cdatabase->Close ();
		m_BackupBase->m_Cdatabase->Close ();
	}
	else if (status == 1)
	{
		m_BackupBase->m_Cdatabase->Close ();
		
	}
	else if(status == 5)
	{
		m_MainBase->m_Cdatabase->Close ();
	}
}
//
//状态广播函数
//
void CBackupDlg::SendStatus(int curmain,int status)
{
	CString res;
	res.Format ("%ld",status);
	CTime nowtime =CTime::GetCurrentTime ();
    WritePrivateProfileString("result",nowtime.Format ("%Y年%m月%d日%H:%M:%S"),res,m_curpath +"sendclient.log");
    CSendSock *tempsock;
	POSITION pt = m_sendsock.GetStartPosition ();
    BYTE * buff;
	buff = new BYTE[8];
	*(int *)buff =curmain;
    *(int *)(buff + 4) = status;
    int index;
    while(pt)
	{
		m_sendsock.GetNextAssoc(pt,index,tempsock);
		tempsock->Send(buff,8);
	}
	delete buff;
}
//
//启动辅数据库工作;
//
BOOL CBackupDlg::StartSecondBase()
{
	KillTimer(1);//停止备份
	if((m_MainBase->m_Cdatabase)&&(m_BackupBase->m_Cdatabase))//当库中断了,连接如何处理?
	{
		if (m_MainBase->m_Cdatabase->IsOpen ()&&m_BackupBase->m_Cdatabase->IsOpen())
			dumploadtransaction();
		POSITION pt;
		CString basename;
		pt= m_database.GetHeadPosition ();
		CTime nowtime = CTime::GetCurrentTime ();
		while(pt)
		{
			m_sqlstring = "online database  " + m_database.GetNext (pt);
			TRY
			{
				m_BackupBase->m_Cdatabase->ExecuteSQL (m_sqlstring);
			}
			CATCH(CDBException,e)
			{
				WritePrivateProfileString("result",nowtime.Format ("%Y年%m月%d日%H:%M:%S恢复辅数据库工作"),"失败",m_log);
				return false;
			}
			END_CATCH
		}
		WritePrivateProfileString("result",nowtime.Format ("%Y年%m月%d日%H:%M:%S恢复辅数据库工作"),"成功",m_log);
	}
	return true;
}

void CBackupDlg::ShowBackupStart()
{
	GetDlgItem(IDC_BACKUP)->SetWindowText("备份服务已启动");
	m_hIcon = AfxGetApp()->LoadIcon(IDI_START);
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
}

void CBackupDlg::ShowBackupStop()
{
	GetDlgItem(IDC_BACKUP)->SetWindowText("备份服务停止");
	m_hIcon = AfxGetApp()->LoadIcon(IDI_STOP);
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
}

void CBackupDlg::ShowBackupHalf()
{
	GetDlgItem(IDC_BACKUP)->SetWindowText("备份服务正在启动……");
	
}
void CBackupDlg::ShowServerChange()
{
	GetDlgItem(IDC_BACKUP)->SetWindowText("数据库正在切换中……");
	
}

void CBackupDlg::ShowWatch(int status)
{
	if (status == 1)
		GetDlgItem(IDC_WATCH)->SetWindowText("监视服务已启动");
	else
		GetDlgItem(IDC_WATCH)->SetWindowText("监视服务停止");
	
}
void CBackupDlg::ShowAServer(int status)
{//status:0 断开,1:备份;2正常工作.
	if (status ==0) 
		m_mainIcon = AfxGetApp()->LoadIcon(IDI_STOP);
	else if (status == 1)
		m_mainIcon = AfxGetApp()->LoadIcon(IDI_HALF);
	else 
		m_mainIcon = AfxGetApp()->LoadIcon(IDI_START);
	m_main.SetIcon (m_mainIcon);
}
void CBackupDlg::ShowBServer(int status)
{//status:0 断开,1:备份;2正常工作.
	if (status ==0) 
		m_backupIcon = AfxGetApp()->LoadIcon(IDI_STOP);
	else if(status == 1)
		m_backupIcon = AfxGetApp()->LoadIcon(IDI_HALF);
	else
		m_backupIcon = AfxGetApp()->LoadIcon(IDI_START);
	m_backup.SetIcon (m_backupIcon);
}
void CBackupDlg::ShowDirect(int status)
{
	if(status == 0)
		m_direct = AfxGetApp()->LoadIcon(IDI_DOWN);
	else if(status ==1)
		m_direct = AfxGetApp()->LoadIcon(IDI_UP);
    else 
		m_direct = NULL;
	m_direction.SetIcon (m_direct);
	
}
//
//设定主数据库
//
void CBackupDlg::OnChoose() 
{
	// TODO: Add your control notification handler code here
    CChooseMain  pchoosemain;
    pchoosemain.m_Radion_main = m_CurChoose;
    pchoosemain.DoModal ();
	// m_CurChoose = pchoosemain.m_Radion_main;
	if(pchoosemain.m_Radion_main != m_CurChoose)//变化了
	{
        m_CurChoose = pchoosemain.m_Radion_main;
        ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);	
	}
}
//
//连接数据库
//
void CBackupDlg::OnConnect() 
{
	// TODO: Add your control notification handler code here
    //连接
	connect();
    SendStatus(m_CurMain,m_status);
    // 启动监视线程
	if(m_status > 0)
	{
		SetTimer(10,m_checkinterval,NULL); 
        m_check = 1;
	}
    ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
   GetDlgItem(IDC_CLEAR)->EnableWindow(false);
}
//
//用于界面显示当前的状态和选择,并置下一步操作的可能.
//
void CBackupDlg::ShowThestatus(int curmain, int choosemain, int status, int check)
{
	if (curmain == choosemain)
	{
		GetDlgItem(IDC_OPERATION)->SetWindowText("提示");
		if(curmain)
		{
			
			GetDlgItem(IDC_A_CHA)->SetWindowText("备份库");
			GetDlgItem(IDC_B_CHA)->SetWindowText("主库");
			
		}
		else
		{
			GetDlgItem(IDC_A_CHA)->SetWindowText("主库");
			GetDlgItem(IDC_B_CHA)->SetWindowText("备份库");
		}
		GetDlgItem(IDC_DOCHANGE)->EnableWindow(false);
	}
	else 
	{
		if (choosemain == 0)
			GetDlgItem(IDC_OPERATION)->SetWindowText("已更改主数据库为A,等待确认.");
		else
			GetDlgItem(IDC_OPERATION)->SetWindowText("已更改主数据库为B,等待确认.");
		GetDlgItem(IDC_DOCHANGE)->EnableWindow(true);
	}
	if (status!= m_laststatus)//当状态有变
	{
		switch(status)
		{
		case 0://0 主库断开,辅库断开;
			ShowBServer(0);	
			ShowAServer(0);
			ShowBackupStop();
			ShowDirect(-1);
            GetDlgItem(IDC_CONNECT)->EnableWindow(true);
            GetDlgItem(IDC_CHOOSE)->EnableWindow(false);
			GetDlgItem(IDC_DO)->EnableWindow(false);
			break;	
		case 1://1 主库正常,辅库断开;
			if (curmain)
			{//B为主
				ShowBServer(2);	
				ShowAServer(0);
				ShowBackupStop();
			}
			else
			{//A为主
				ShowBServer(0);	
				ShowAServer(2);
				ShowBackupStop();
			}
			ShowDirect(-1);
            GetDlgItem(IDC_CONNECT)->EnableWindow(true);
            GetDlgItem(IDC_CHOOSE)->EnableWindow(false);
			GetDlgItem(IDC_DO)->EnableWindow(false);
			break;	
		case 2://2 主库正常,辅库正常但未开始备份工作;
			if (curmain)
			{//B为主
				ShowBServer(2);	
				ShowAServer(1);
			}
			else
			{//A为主
				ShowBServer(1);	
				ShowAServer(2);
			}
            ShowBackupStop();
			ShowDirect(-1);
            GetDlgItem(IDC_CONNECT)->EnableWindow(false);
            GetDlgItem(IDC_CHOOSE)->EnableWindow(true);
			GetDlgItem(IDC_DO)->EnableWindow(true);
			break;	
		case 3://3 主库正常,辅库正常但备份失败;
			if (curmain)
			{//B为主
				ShowBServer(2);	
				ShowAServer(1);
				ShowBackupStop();
			}
			else
			{//A为主
				ShowBServer(1);	
				ShowAServer(2);
				ShowBackupStop();
			}
			ShowDirect(-1);
            GetDlgItem(IDC_CONNECT)->EnableWindow(false);
            GetDlgItem(IDC_CHOOSE)->EnableWindow(true);
			GetDlgItem(IDC_DO)->EnableWindow(true);
			break;	
		case 4://4 主库正常,辅库正常备份;
			if (curmain)
			{//B为主
				ShowBServer(2);	
				ShowAServer(1);
				ShowBackupStart();
			}
			else
			{//A为主
				ShowBServer(1);	
				ShowAServer(2);
				ShowBackupStart();
			}
			ShowDirect(curmain);
			GetDlgItem(IDC_CONNECT)->EnableWindow(false);
            GetDlgItem(IDC_CHOOSE)->EnableWindow(true);
			GetDlgItem(IDC_DO)->EnableWindow(false);
			break;	
		case 5://5 主库断开,辅库未工作.
			if (curmain)
			{//B为主
				ShowBServer(0);	
				ShowAServer(1);
				ShowBackupStop();
			}
			else
			{//A为主
				ShowBServer(1);	
				ShowAServer(0);
				ShowBackupStop();
			}
			ShowDirect(-1);
            GetDlgItem(IDC_CONNECT)->EnableWindow(true);
            GetDlgItem(IDC_CHOOSE)->EnableWindow(false);
			GetDlgItem(IDC_DO)->EnableWindow(false);
			break;	
		case 6://6 主辅库切换中...
			if (curmain)
			{//B为主
				ShowBServer(2);	
				ShowAServer(1);
				ShowServerChange();
			}
			else
			{//A为主
				ShowBServer(1);	
				ShowAServer(2);
				ShowServerChange();
			}
			ShowDirect(-1);
			break;
			
		case 7://7 备份启动中...
			if (curmain)
			{//B为主
				ShowBServer(2);	
				ShowAServer(1);
				ShowBackupHalf();
			}
			else
			{//A为主
				ShowBServer(1);	
				ShowAServer(2);
				ShowBackupHalf();
			}
			ShowDirect(-1);
			break;
			
			
		default:
			break;	
		}
	}
	ShowWatch(check);
	m_laststatus =status;
}


void CBackupDlg::ChangeServer()
{
	m_CurMain = ! m_CurMain;
	m_CurChoose = m_CurMain;
	DATABASE *m_TempBase;   
	m_TempBase =m_MainBase;
	m_MainBase = m_BackupBase;
	m_BackupBase = m_TempBase;
}
//
//删除一个连接
//
void CBackupDlg::OnSocketMessae(WORD EventType, long SubType)
{
	CSendSock * tempsock;
	if(m_sendsock.Lookup(EventType,tempsock))
	{
		tempsock ->Close ();
		delete tempsock;
		m_sendsock.RemoveKey(EventType);
	}
}
//
//实施交换主辅库角色
//
void CBackupDlg::OnDochange() 
{
	// TODO: Add your control notification handler code here
	if(m_CurMain != m_CurChoose)
	{
		KillTimer(1);//停止备份服务
		KillTimer(10);//
		ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
		if((m_status == 2)||(m_status == 3))
		{
			m_status = 6;
			SendStatus(m_CurMain,m_status);
			ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
			if( dumploaddatabase())
			{
				if( StartSecondBase())
				{
					ChangeServer();
					m_status = 2;
					SendStatus(m_CurMain,m_status);
				}
				else
					return ;
			}
			else 
				return ;
		}
		else if(m_status == 4)
		{
			m_status = 6;
			SendStatus(m_CurMain,m_status);
			ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
			if( StartSecondBase())
			{
				ChangeServer();
				m_status = 2;
				SendStatus(m_CurMain,m_status);
			}
			else
				return ;
		}
		SetTimer(10,m_checkinterval,NULL); 
	}
    ShowThestatus(m_CurMain,m_CurChoose,m_status,m_check);
}

⌨️ 快捷键说明

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