summaryrefslogtreecommitdiff
path: root/VC++Files/mysqlmanager/toolsql.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'VC++Files/mysqlmanager/toolsql.cpp')
-rw-r--r--VC++Files/mysqlmanager/toolsql.cpp687
1 files changed, 687 insertions, 0 deletions
diff --git a/VC++Files/mysqlmanager/toolsql.cpp b/VC++Files/mysqlmanager/toolsql.cpp
new file mode 100644
index 00000000000..1773a3a6dc7
--- /dev/null
+++ b/VC++Files/mysqlmanager/toolsql.cpp
@@ -0,0 +1,687 @@
+// ToolSql.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "MySqlManager.h"
+#include "ToolSql.h"
+
+#define WINDOW_COORDS 0
+#define CLIENT_COORDS 1
+
+#define MY_TIMER_ID 0x1234
+
+#ifdef _DEBUG
+ #define new DEBUG_NEW
+ #undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+
+CToolSql::CToolSql(CWnd* pParent,CResource* pServer,CResource* pResource)
+: CDialog(CToolSql::IDD, pParent)
+, m_pQuery(0)
+, m_pResults(0)
+, m_pStatus(0)
+, m_pServer(pServer)
+, m_pResource(pResource)
+, m_ui_timer(0)
+{
+ //{{AFX_DATA_INIT(CToolSql)
+ m_nIntervalTimerSeconds = 10;
+ m_bClear = FALSE;
+ //}}AFX_DATA_INIT
+ memset ( & m_lf, 0,sizeof(m_lf) );
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+CToolSql::~CToolSql()
+{
+
+ if (m_ui_timer)
+ {
+ KillTimer(MY_TIMER_ID);
+ }
+
+ if (m_pdb)
+ {
+ mysql_close(m_pdb);
+ }
+ if (m_pQuery)
+ {
+ m_pQuery->DestroyWindow();
+ delete m_pQuery;
+ }
+ if (m_pResults)
+ {
+ m_pResults->DestroyWindow();
+ delete m_pResults;
+ }
+ if (m_pStatus)
+ {
+ m_pStatus->DestroyWindow();
+ delete m_pStatus;
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+ //{{AFX_DATA_MAP(CToolSql)
+ DDX_Control(pDX, IDC_STOP_PB, m_ctl_Stop);
+ DDX_Control(pDX, IDC_START_PB, m_ctl_Start);
+ DDX_Control(pDX, IDC_SERVER_CB, m_ctl_Server);
+ DDX_Control(pDX, IDC_TAB1, m_tabs);
+ DDX_Text(pDX, IDC_TIMER_SECS, m_nIntervalTimerSeconds);
+ DDV_MinMaxInt(pDX, m_nIntervalTimerSeconds, 1, 120);
+ DDX_Check(pDX, IDC_CLEAR, m_bClear);
+ //}}AFX_DATA_MAP
+}
+
+
+BEGIN_MESSAGE_MAP(CToolSql, CDialog)
+//{{AFX_MSG_MAP(CToolSql)
+ ON_BN_CLICKED(IDC_QUERY_PB, OnQueryPb)
+ ON_BN_CLICKED(IDC_DATABASES_PB, OnQueryDatabases)
+ ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelchangeTab1)
+ ON_BN_CLICKED(IDC_FONT_PB, OnFontPb)
+ ON_WM_SIZE()
+ ON_BN_CLICKED(IDC_START_PB, OnStartPb)
+ ON_BN_CLICKED(IDC_STOP_PB, OnStopPb)
+ ON_WM_TIMER()
+ ON_WM_DESTROY()
+ ON_BN_CLICKED(IDC_CLEAR, OnClear)
+ ON_COMMAND(IDM_QUERY_EXEC, OnQueryPb)
+ ON_COMMAND(IDM_QUERY_DATABASES, OnQueryDatabases)
+ ON_EN_CHANGE(IDC_TIMER_SECS, OnChangeTimerSecs)
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+
+BOOL CToolSql::OnInitDialog()
+{
+
+ CDialog::OnInitDialog();
+
+ m_ctl_Start . EnableWindow(TRUE);
+ m_ctl_Stop . EnableWindow(FALSE);
+
+ CString strTitle;
+
+ strTitle.Format ("mySql Query to %s on %s",m_pServer->GetDisplayName(),m_pServer->GetHostName());
+
+ m_ctl_Server.AddString ( m_pServer->GetDisplayName() );
+ m_ctl_Server.SetCurSel (0);
+
+ SetWindowText(strTitle);
+
+ CWaitCursor x;
+
+ m_btn_QueryExec.AutoLoad ( IDC_QUERY_PB, this );
+ m_btn_QueryDatabases.AutoLoad ( IDC_DATABASES_PB, this );
+ m_btn_Font.AutoLoad ( IDC_FONT_PB, this );
+
+ m_tabs.GetWindowRect ( m_rectTab[WINDOW_COORDS] );
+ GetWindowRect ( m_rectDlg[WINDOW_COORDS] );
+
+ m_tabs.GetClientRect ( m_rectTab[CLIENT_COORDS] );
+ GetClientRect ( m_rectDlg[CLIENT_COORDS] );
+
+ CMenu* pSysMenu = GetSystemMenu(FALSE);
+ if (pSysMenu != NULL)
+ {
+ CString strText;
+ strText.LoadString(IDS_QUERY_EXEC);
+ if (!strText.IsEmpty())
+ {
+ pSysMenu->AppendMenu(MF_SEPARATOR);
+ pSysMenu->AppendMenu(MF_STRING, IDM_QUERY_EXEC, strText);
+ }
+ strText.LoadString(IDS_QUERY_DATABASES);
+ if (!strText.IsEmpty())
+ {
+ pSysMenu->AppendMenu(MF_STRING, IDM_QUERY_DATABASES, strText);
+ }
+ }
+
+
+ m_pdb = new MYSQL;
+
+ CString strQuery ( "Query" );
+ CString strResults ( "Results" );
+ CString strStatus ( "Status" );
+
+ TC_ITEM tc1 = { TCIF_TEXT, 0,0, (LPSTR)(LPCTSTR)strQuery, strQuery.GetLength(), 0,0};
+ TC_ITEM tc2 = { TCIF_TEXT, 0,0, (LPSTR)(LPCTSTR)strResults, strResults.GetLength(), 0,0};
+ TC_ITEM tc3 = { TCIF_TEXT, 0,0, (LPSTR)(LPCTSTR)strStatus, strStatus.GetLength(), 0,0};
+
+ m_tabs.InsertItem ( 0,&tc1 );
+ m_tabs.InsertItem ( 1,&tc2 );
+ m_tabs.InsertItem ( 2,&tc3 );
+
+ m_pQuery = new CToolSqlQuery ( NULL );
+ m_pResults = new CToolSqlResults ( NULL );
+ m_pStatus = new CToolSqlStatus ( NULL );
+
+ try
+ {
+
+// OpenDatabase();
+//
+// m_pSelection->SetDatabase ( & m_db );
+// m_pScript->SetDatabase ( & m_db );
+// m_pLog->SetDatabase ( & m_db );
+
+ m_pQuery -> Create ( (LPCTSTR)IDD_TOOL_SQL_QUERY, &m_tabs );
+ m_pResults -> Create ( (LPCTSTR)IDD_TOOL_SQL_RESULTS, &m_tabs );
+ m_pStatus -> Create ( (LPCTSTR)IDD_TOOL_SQL_STATUS, &m_tabs );
+
+ ActivateTab ( 0 );
+
+ m_pQuery -> SetWindowPos(NULL,20,24,0,0,SWP_NOZORDER|SWP_NOSIZE);
+ m_pResults -> SetWindowPos(NULL,20,24,0,0,SWP_NOZORDER|SWP_NOSIZE);
+ m_pStatus -> SetWindowPos(NULL,20,24,0,0,SWP_NOZORDER|SWP_NOSIZE);
+
+ DoOnSize( SIZE_RESTORED, m_rectDlg[CLIENT_COORDS].Width(), m_rectDlg[CLIENT_COORDS].Height() );
+
+ }
+ catch (...)
+ {
+ }
+
+ mysql_init(m_pdb);
+ if (!mysql_real_connect(m_pdb,m_pServer->GetHostName(), m_pServer->GetUserName(),m_pServer->GetPassword(),0,m_pServer->GetPortNumber(), NullS,0))
+ {
+// my_printf_error(0,"connect to server at '%s' failed; error: '%s'",
+// MYF(ME_BELL), pResource->GetHostName(), mysql_error(&mysql));
+ CString strText;
+ strText.Format ( "connect to server at '%s' failed; error: '%s'", m_pServer->GetHostName(), mysql_error(m_pdb));
+ AfxMessageBox(strText);
+ EndDialog(IDCANCEL);
+ return FALSE;
+ }
+
+ if ( m_pResource && m_pResource->GetType() == CResource::eDatabase )
+ {
+ CString strDB = m_pResource->GetDisplayName();
+ strDB.TrimRight();
+ if (mysql_select_db(m_pdb,strDB))
+ {
+ }
+ }
+
+ return FALSE; // return TRUE unless you set the focus to a control
+ // EXCEPTION: OCX Property Pages should return FALSE
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::ActivateTab ( int tab )
+
+{
+ switch (tab)
+ {
+ case 0: ;
+ m_pResults-> ShowWindow(SW_HIDE);
+ m_pStatus-> ShowWindow(SW_HIDE);
+ m_pQuery-> ShowWindow(SW_SHOW);
+ m_pQuery->m_ctl_edit.SetFocus();
+ break;
+ case 1: ;
+ m_pQuery-> ShowWindow(SW_HIDE);
+ m_pStatus-> ShowWindow(SW_HIDE);
+ m_pResults-> ShowWindow(SW_SHOW);
+ m_pResults->m_ctl_edit.SetFocus();
+ break;
+ case 2: ;
+ m_pResults-> ShowWindow(SW_HIDE);
+ m_pQuery-> ShowWindow(SW_HIDE);
+ m_pStatus-> ShowWindow(SW_SHOW);
+ m_pStatus->m_ctl_edit.SetFocus();
+ break;
+ default:
+ break;
+ }
+
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CalculateFontSize ( CEdit& ed, CSize& sizeRet )
+
+{
+
+ CDC* pdc = ed.GetDC();
+
+ int nAveWidth , nAveHeight;
+ int i ;
+
+ CSize size ;
+
+ static BOOL bFirstTime = TRUE;
+ static char rgchAlphabet [54] ;
+
+ if ( bFirstTime )
+ {
+ bFirstTime = false;
+ for ( i = 0 ; i <= 25 ; i++)
+ {
+ rgchAlphabet[i] = (char)(i+(int)'a') ;
+ rgchAlphabet[i+26] = (char)(i+(int)'A') ;
+ }
+ rgchAlphabet[52] = 0x20;
+ rgchAlphabet[53] = 0x20;
+ }
+
+ CFont* pf = ed.GetFont();
+ LOGFONT lf;
+ pf->GetLogFont(&lf);
+ pdc->SelectObject (pf);
+ GetTextExtentPoint32 ( pdc->m_hDC, (LPSTR) rgchAlphabet, 54, & size ) ;
+
+ nAveWidth = size.cx / 54 ;
+
+ if ( size.cx % 54 )
+ {
+ nAveWidth++;
+ }
+
+ nAveHeight = size.cy; //6 * size.cy / 4;
+
+ sizeRet.cx = nAveWidth;
+ sizeRet.cy = nAveHeight; // tm.tmHeight;
+
+ ed.ReleaseDC(pdc);
+
+}
+
+///////////////////////////////////////////////////////////////////////////////
+int ProcessYieldMessage ()
+{
+
+ CWinApp* pApp = AfxGetApp();
+
+ if ( pApp )
+ {
+ MSG msgx;
+ while (::PeekMessage(&msgx, NULL, NULL, NULL, PM_NOREMOVE))
+ try
+ {
+ if (!pApp->PumpMessage())
+ {
+// ExitProcess(1);
+ }
+ }
+ catch (...)
+ {
+ }
+ }
+
+ return 0;
+
+}
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+void print_table_data(MYSQL_RES *result,CString& str,CEdit& ed,LOGFONT& lf)
+{
+ MYSQL_ROW cur;
+ uint length;
+ MYSQL_FIELD* field;
+ bool* num_flag;
+ my_ulonglong nRows = mysql_num_rows(result);
+ uint nFields = mysql_num_fields(result);
+ int* rgi = new int [nFields];
+ memset ( rgi, 0, nFields*sizeof(int) );
+ num_flag=(bool*) my_alloca(sizeof(bool)*nFields);
+
+ ed.SetLimitText(65535*16);
+
+ CSize sizeFont;
+ CalculateFontSize ( ed, sizeFont );
+ uint index = 0;
+ rgi[index++]=0;
+ CString separator("");
+
+ mysql_field_seek(result,0);
+
+ for (uint off=0; (field = mysql_fetch_field(result)) ; off++)
+ {
+ uint length= (uint) strlen(field->name);
+ length=max(length,field->max_length);
+ if (length < 4 && !IS_NOT_NULL(field->flags))
+ length=4; // Room for "NULL"
+ field->max_length=length+1;
+ int n=length+2;
+ for (uint i=lstrlen(field->name); i-- > 0 ; ) separator+="-";
+ if ( index!= nFields )
+ {
+ int o = rgi[index-1];
+ rgi[index++]=o+((n+1)*sizeFont.cx)/2;
+ }
+ separator+='\t';
+ str += field->name;
+ str += "\t";
+ num_flag[off]= IS_NUM(field->type);
+ }
+ separator += "\r\n";
+ str += "\r\n";
+ str += separator;
+ ed.SetSel(-1,-1);
+ ed.ReplaceSel(str);
+
+ if ( 1 || nRows > 100 )
+ {
+ while ((cur = mysql_fetch_row(result)))
+ {
+ ProcessYieldMessage ();
+ mysql_field_seek(result,0);
+ str.Empty();
+ ed.SetSel(-1,-1);
+ for (uint off=0 ; off < mysql_num_fields(result); off++)
+ {
+ field = mysql_fetch_field(result);
+ length=field->max_length;
+ CString strText;
+ strText.Format ("%s", cur[off] ? (char*) cur[off] : "NULL");
+ str += strText;
+ str += "\t";
+ }
+ str += "\r\n";
+ ed.SetSel(-1,-1);
+ ed.ReplaceSel(str);
+ }
+ }
+ else
+ {
+ while ((cur = mysql_fetch_row(result)))
+ {
+ mysql_field_seek(result,0);
+ for (uint off=0 ; off < mysql_num_fields(result); off++)
+ {
+ field = mysql_fetch_field(result);
+ length=field->max_length;
+ CString strText;
+ strText.Format ("%s", cur[off] ? (char*) cur[off] : "NULL");
+ str += strText;
+ str += "\t";
+ }
+ str += "\r\n";
+ }
+ }
+ my_afree((gptr) num_flag);
+ str += "\r\n";
+ ed.SetTabStops(nFields,rgi);
+ delete [] rgi;
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnQueryPb()
+{
+
+ CWaitCursor x;
+// mysql_select_db(m_pdb,"mysql");
+
+ if ( m_pResource && m_pResource->GetType() == CResource::eDatabase )
+ {
+ CString strDB = m_pResource->GetDisplayName();
+ strDB.TrimRight();
+ if (mysql_select_db(m_pdb,strDB))
+ {
+ }
+ }
+
+ m_pQuery->UpdateData();
+ m_pResults->m_edit.Empty();
+ CString str = m_pQuery->m_edit;
+ if ( mysql_real_query(m_pdb,str,str.GetLength())==0 )
+ {
+ MYSQL_RES *result;
+ if ((result=mysql_store_result(m_pdb)))
+ {
+ my_ulonglong nRows = mysql_num_rows(result);
+ m_pResults->UpdateData(FALSE);
+ m_tabs.SetCurSel(1);
+ ActivateTab ( 1 );
+ print_table_data(result,m_pResults->m_edit,m_pResults->m_ctl_edit,m_lf);
+// m_pResults->UpdateData(FALSE);
+ m_pResults->m_ctl_edit.SetSel(-1,-1);
+ CString strText;
+ strText.Format ( "\r\n(%d row(s) affected)\r\n", nRows );
+ m_pResults->m_ctl_edit.ReplaceSel(strText);
+ mysql_free_result(result);
+ }
+ else
+ {
+ m_pResults->m_edit = mysql_error(m_pdb);
+ m_pResults->UpdateData(FALSE);
+ }
+ }
+ else
+ {
+ m_pResults->m_edit = mysql_error(m_pdb);
+ m_pResults->UpdateData(FALSE);
+ }
+
+ m_tabs.SetCurSel(1);
+ ActivateTab ( 1 );
+
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnQueryDatabases()
+{
+ CWaitCursor x;
+ MYSQL_RES *result;
+ m_pResults->m_edit.Empty();
+ if ((result=mysql_list_dbs(m_pdb,0)))
+ {
+ my_ulonglong nRows = mysql_num_rows(result);
+ print_table_data(result,m_pResults->m_edit,m_pResults->m_ctl_edit,m_lf);
+ //m_pResults->UpdateData(FALSE);
+ mysql_free_result(result);
+ }
+ else
+ {
+ m_pResults->m_edit = mysql_error(m_pdb);
+ m_pResults->UpdateData(FALSE);
+ }
+
+ m_tabs.SetCurSel(1);
+ ActivateTab ( 1 );
+
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
+{
+ ActivateTab ( m_tabs.GetCurSel() );
+ *pResult = 0;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnFontPb()
+{
+
+ CFontDialog FontDlg ( & m_lf );
+
+ if ( FontDlg.DoModal ( ) == IDOK )
+ {
+ if (m_font.GetSafeHandle())
+ m_font.DeleteObject();
+ m_lf = *FontDlg.m_cf.lpLogFont;
+ m_font.CreateFontIndirect(FontDlg.m_cf.lpLogFont);
+ m_pQuery->SetFont(&m_font);
+ m_pResults->SetFont(&m_font);
+ m_pStatus->SetFont(&m_font);
+ }
+
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::DoOnSize(UINT nType, int cx, int cy)
+{
+
+ int nx = cx - ( m_rectDlg[CLIENT_COORDS].Width ( ) - m_rectTab[CLIENT_COORDS].Width ( ) );
+ int ny = cy - ( m_rectDlg[CLIENT_COORDS].Height ( ) - m_rectTab[CLIENT_COORDS].Height ( ) );
+
+ if (IsWindow(m_tabs.GetSafeHwnd()))
+ {
+ m_tabs.SetWindowPos ( NULL
+ , 0
+ , 0
+ , nx
+ , ny
+ , SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW );
+
+ if (m_pResults&&IsWindow(m_pResults->GetSafeHwnd()))
+ m_pResults -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE );
+ if (m_pQuery&&IsWindow(m_pQuery->GetSafeHwnd()))
+ m_pQuery -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE );
+ if (m_pStatus&&IsWindow(m_pStatus->GetSafeHwnd()))
+ m_pStatus -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE );
+// switch ( m_tabs.GetCurSel() )
+// {
+// case 0:
+// {
+// if (m_pResults&&IsWindow(m_pResults->GetSafeHwnd()))
+// m_pResults -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE | SWP_HIDEWINDOW );
+// if (m_pQuery&&IsWindow(m_pQuery->GetSafeHwnd()))
+// m_pQuery -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW );
+// break;
+// }
+// case 1:
+// {
+// if (m_pQuery&&IsWindow(m_pQuery->GetSafeHwnd()))
+// m_pQuery -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE | SWP_HIDEWINDOW );
+// if (m_pResults&&IsWindow(m_pResults->GetSafeHwnd()))
+// m_pResults -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW );
+// break;
+// }
+// }
+ }
+
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnSize(UINT nType, int cx, int cy)
+{
+
+ CDialog::OnSize(nType, cx, cy);
+
+ DoOnSize ( nType, cx, cy );
+
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnOK()
+{
+ CDialog::OnOK();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnCancel()
+{
+ CDialog::OnCancel();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+BOOL CToolSql::PreTranslateMessage(MSG* pMsg)
+{
+ return CDialog::PreTranslateMessage(pMsg);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::DoProcessListQuery()
+{
+
+ MYSQL_RES *result;
+ if (result=mysql_list_processes(m_pdb))
+ {
+ if (m_bClear)
+ {
+ m_pStatus->m_edit.Empty();
+ m_pStatus->UpdateData(FALSE);
+ }
+ print_table_data(result,m_pStatus->m_edit,m_pStatus->m_ctl_edit,m_lf);
+ mysql_free_result(result);
+ }
+ else
+ {
+// my_printf_error(0,"process list failed; error: '%s'",MYF(ME_BELL),mysql_error(mysql));
+ }
+
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnStartPb()
+{
+ UpdateData();
+ if (m_ui_timer) return;
+ if (m_nIntervalTimerSeconds<1) return;
+ ActivateTab ( 2 );
+ m_ui_timer = SetTimer( MY_TIMER_ID, m_nIntervalTimerSeconds*1000, NULL );
+ m_ctl_Start . EnableWindow(FALSE);
+ m_ctl_Stop . EnableWindow(TRUE);
+ DoProcessListQuery();
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnStopPb()
+{
+ UpdateData();
+ if (m_ui_timer)
+ {
+ KillTimer(MY_TIMER_ID);
+ m_ui_timer = 0;
+ }
+ m_ctl_Start . EnableWindow(TRUE);
+ m_ctl_Stop . EnableWindow(FALSE);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+void CToolSql::OnTimer(UINT nIDEvent)
+{
+ DoProcessListQuery();
+ CDialog::OnTimer(nIDEvent);
+}
+
+void CToolSql::OnDestroy()
+{
+ if (m_ui_timer)
+ {
+ KillTimer(MY_TIMER_ID);
+ m_ui_timer = 0;
+ }
+ CDialog::OnDestroy();
+}
+
+void CToolSql::OnClear()
+{
+ UpdateData();
+}
+
+void CToolSql::OnChangeTimerSecs()
+{
+ UpdateData();
+}