📄 backupdlg.cpp
字号:
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 + -