toolsql.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:17k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. // ToolSql.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MySqlManager.h"
  5. #include "ToolSql.h"
  6. #define WINDOW_COORDS 0
  7. #define CLIENT_COORDS 1
  8. #define MY_TIMER_ID 0x1234
  9. #ifdef _DEBUG
  10.    #define new DEBUG_NEW
  11.    #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. CToolSql::CToolSql(CWnd* pParent,CResource* pServer,CResource* pResource)
  16. : CDialog(CToolSql::IDD, pParent)
  17. , m_pQuery(0)
  18. , m_pResults(0)
  19. , m_pStatus(0)
  20. , m_pServer(pServer)
  21. , m_pResource(pResource)
  22. , m_ui_timer(0)
  23. {
  24.    //{{AFX_DATA_INIT(CToolSql)
  25. m_nIntervalTimerSeconds = 10;
  26. m_bClear = FALSE;
  27. //}}AFX_DATA_INIT
  28.    memset ( & m_lf, 0,sizeof(m_lf) );
  29. }
  30. /////////////////////////////////////////////////////////////////////////////
  31. CToolSql::~CToolSql()
  32. {
  33. if (m_ui_timer)
  34. {
  35. KillTimer(MY_TIMER_ID);
  36. }
  37. if (m_pdb)
  38.    {
  39.       mysql_close(m_pdb);
  40.    }
  41.    if (m_pQuery)
  42.    {
  43.       m_pQuery->DestroyWindow();
  44.       delete m_pQuery;
  45.    }
  46.    if (m_pResults)
  47.    {
  48.       m_pResults->DestroyWindow();
  49.       delete m_pResults;
  50.    }
  51.    if (m_pStatus)
  52.    {
  53.       m_pStatus->DestroyWindow();
  54.       delete m_pStatus;
  55.    }
  56. }
  57. /////////////////////////////////////////////////////////////////////////////
  58. void CToolSql::DoDataExchange(CDataExchange* pDX)
  59. {
  60.    CDialog::DoDataExchange(pDX);
  61.    //{{AFX_DATA_MAP(CToolSql)
  62. DDX_Control(pDX, IDC_STOP_PB, m_ctl_Stop);
  63. DDX_Control(pDX, IDC_START_PB, m_ctl_Start);
  64. DDX_Control(pDX, IDC_SERVER_CB, m_ctl_Server);
  65.    DDX_Control(pDX, IDC_TAB1, m_tabs);
  66. DDX_Text(pDX, IDC_TIMER_SECS, m_nIntervalTimerSeconds);
  67. DDV_MinMaxInt(pDX, m_nIntervalTimerSeconds, 1, 120);
  68. DDX_Check(pDX, IDC_CLEAR, m_bClear);
  69. //}}AFX_DATA_MAP
  70. }
  71. BEGIN_MESSAGE_MAP(CToolSql, CDialog)
  72. //{{AFX_MSG_MAP(CToolSql)
  73. ON_BN_CLICKED(IDC_QUERY_PB, OnQueryPb)
  74. ON_BN_CLICKED(IDC_DATABASES_PB, OnQueryDatabases)
  75. ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelchangeTab1)
  76. ON_BN_CLICKED(IDC_FONT_PB, OnFontPb)
  77. ON_WM_SIZE()
  78. ON_BN_CLICKED(IDC_START_PB, OnStartPb)
  79. ON_BN_CLICKED(IDC_STOP_PB, OnStopPb)
  80. ON_WM_TIMER()
  81. ON_WM_DESTROY()
  82. ON_BN_CLICKED(IDC_CLEAR, OnClear)
  83. ON_COMMAND(IDM_QUERY_EXEC, OnQueryPb)
  84. ON_COMMAND(IDM_QUERY_DATABASES, OnQueryDatabases)
  85. ON_EN_CHANGE(IDC_TIMER_SECS, OnChangeTimerSecs)
  86. //}}AFX_MSG_MAP
  87. END_MESSAGE_MAP()
  88. /////////////////////////////////////////////////////////////////////////////
  89. BOOL CToolSql::OnInitDialog()
  90. {
  91.    CDialog::OnInitDialog();
  92. m_ctl_Start . EnableWindow(TRUE);
  93. m_ctl_Stop  . EnableWindow(FALSE);
  94.    CString strTitle;
  95.    strTitle.Format ("mySql Query to %s on %s",m_pServer->GetDisplayName(),m_pServer->GetHostName());
  96. m_ctl_Server.AddString ( m_pServer->GetDisplayName() );
  97. m_ctl_Server.SetCurSel (0);
  98.    SetWindowText(strTitle);
  99.    CWaitCursor x;
  100.    m_btn_QueryExec.AutoLoad ( IDC_QUERY_PB, this );
  101.    m_btn_QueryDatabases.AutoLoad ( IDC_DATABASES_PB, this );
  102.    m_btn_Font.AutoLoad ( IDC_FONT_PB, this );
  103.    m_tabs.GetWindowRect ( m_rectTab[WINDOW_COORDS] );
  104.    GetWindowRect        ( m_rectDlg[WINDOW_COORDS] );
  105.    m_tabs.GetClientRect ( m_rectTab[CLIENT_COORDS] );
  106.    GetClientRect        ( m_rectDlg[CLIENT_COORDS] );
  107.    CMenu* pSysMenu = GetSystemMenu(FALSE);
  108.    if (pSysMenu != NULL)
  109.    {
  110.       CString strText;
  111.       strText.LoadString(IDS_QUERY_EXEC);
  112.       if (!strText.IsEmpty())
  113.       {
  114.          pSysMenu->AppendMenu(MF_SEPARATOR);
  115.          pSysMenu->AppendMenu(MF_STRING, IDM_QUERY_EXEC, strText);
  116.       }
  117.       strText.LoadString(IDS_QUERY_DATABASES);
  118.       if (!strText.IsEmpty())
  119.       {
  120.          pSysMenu->AppendMenu(MF_STRING, IDM_QUERY_DATABASES, strText);
  121.       }
  122.    }
  123.    m_pdb = new MYSQL;
  124.    CString strQuery   ( "Query" );
  125.    CString strResults ( "Results" );
  126.    CString strStatus  ( "Status" );
  127.    TC_ITEM tc1 = { TCIF_TEXT, 0,0, (LPSTR)(LPCTSTR)strQuery,   strQuery.GetLength(), 0,0};
  128.    TC_ITEM tc2 = { TCIF_TEXT, 0,0, (LPSTR)(LPCTSTR)strResults, strResults.GetLength(), 0,0};
  129.    TC_ITEM tc3 = { TCIF_TEXT, 0,0, (LPSTR)(LPCTSTR)strStatus,  strStatus.GetLength(), 0,0};
  130.    m_tabs.InsertItem ( 0,&tc1 );
  131.    m_tabs.InsertItem ( 1,&tc2 );
  132.    m_tabs.InsertItem ( 2,&tc3 );
  133.    m_pQuery   = new CToolSqlQuery ( NULL );
  134.    m_pResults = new CToolSqlResults ( NULL );
  135.    m_pStatus  = new CToolSqlStatus ( NULL );
  136.    try
  137.    {
  138. //   OpenDatabase();
  139. //
  140. //   m_pSelection->SetDatabase ( & m_db );
  141. //   m_pScript->SetDatabase ( & m_db );
  142. //   m_pLog->SetDatabase ( & m_db );
  143.       m_pQuery   -> Create ( (LPCTSTR)IDD_TOOL_SQL_QUERY,   &m_tabs );
  144.       m_pResults -> Create ( (LPCTSTR)IDD_TOOL_SQL_RESULTS, &m_tabs );
  145.       m_pStatus  -> Create ( (LPCTSTR)IDD_TOOL_SQL_STATUS,  &m_tabs );
  146.       ActivateTab ( 0 );
  147.       m_pQuery   -> SetWindowPos(NULL,20,24,0,0,SWP_NOZORDER|SWP_NOSIZE);
  148.       m_pResults -> SetWindowPos(NULL,20,24,0,0,SWP_NOZORDER|SWP_NOSIZE);
  149.       m_pStatus  -> SetWindowPos(NULL,20,24,0,0,SWP_NOZORDER|SWP_NOSIZE);
  150.       DoOnSize( SIZE_RESTORED, m_rectDlg[CLIENT_COORDS].Width(), m_rectDlg[CLIENT_COORDS].Height() );
  151.    }
  152.    catch (...)
  153.    {
  154.    }
  155.    mysql_init(m_pdb);
  156.    if (!mysql_real_connect(m_pdb,m_pServer->GetHostName(), m_pServer->GetUserName(),m_pServer->GetPassword(),0,m_pServer->GetPortNumber(), NullS,0))
  157.    {
  158. //     my_printf_error(0,"connect to server at '%s' failed; error: '%s'",
  159. //     MYF(ME_BELL), pResource->GetHostName(), mysql_error(&mysql));
  160.       CString strText;
  161.       strText.Format ( "connect to server at '%s' failed; error: '%s'", m_pServer->GetHostName(), mysql_error(m_pdb));
  162.       AfxMessageBox(strText);
  163.       EndDialog(IDCANCEL);
  164.       return FALSE;
  165.    }
  166.    if ( m_pResource && m_pResource->GetType() == CResource::eDatabase )
  167.    {
  168.       CString strDB = m_pResource->GetDisplayName();
  169.       strDB.TrimRight();
  170.       if (mysql_select_db(m_pdb,strDB))
  171.       {
  172.       }
  173.    }
  174.    return FALSE;  // return TRUE unless you set the focus to a control
  175.    // EXCEPTION: OCX Property Pages should return FALSE
  176. }
  177. /////////////////////////////////////////////////////////////////////////////
  178. void CToolSql::ActivateTab ( int tab )
  179. {
  180.    switch (tab)
  181.    {
  182.       case 0:   ;
  183.          m_pResults-> ShowWindow(SW_HIDE);
  184.          m_pStatus-> ShowWindow(SW_HIDE);
  185.          m_pQuery-> ShowWindow(SW_SHOW);
  186.          m_pQuery->m_ctl_edit.SetFocus();
  187.          break;
  188.       case 1:   ;
  189.          m_pQuery-> ShowWindow(SW_HIDE);
  190.          m_pStatus-> ShowWindow(SW_HIDE);
  191.          m_pResults-> ShowWindow(SW_SHOW);
  192.          m_pResults->m_ctl_edit.SetFocus();
  193.          break;
  194.       case 2:   ;
  195.          m_pResults-> ShowWindow(SW_HIDE);
  196.          m_pQuery-> ShowWindow(SW_HIDE);
  197.          m_pStatus-> ShowWindow(SW_SHOW);
  198.          m_pStatus->m_ctl_edit.SetFocus();
  199.          break;
  200.       default:
  201.          break;
  202.    }
  203. }
  204. /////////////////////////////////////////////////////////////////////////////
  205. void CalculateFontSize ( CEdit& ed, CSize& sizeRet )
  206. {
  207.    CDC* pdc = ed.GetDC();
  208.    int nAveWidth , nAveHeight;
  209.    int i ;
  210.    CSize size ;
  211.    static BOOL bFirstTime = TRUE;
  212.    static char rgchAlphabet [54] ;
  213.    if ( bFirstTime )
  214.    {
  215.       bFirstTime = false;
  216.       for ( i = 0 ; i <= 25 ; i++)
  217.       {
  218.          rgchAlphabet[i]    = (char)(i+(int)'a') ;
  219.          rgchAlphabet[i+26] = (char)(i+(int)'A') ;
  220.       }
  221.       rgchAlphabet[52] = 0x20;
  222.       rgchAlphabet[53] = 0x20;
  223.    }
  224.    CFont* pf = ed.GetFont();
  225.    LOGFONT lf;
  226.    pf->GetLogFont(&lf);
  227.    pdc->SelectObject (pf);
  228.    GetTextExtentPoint32 ( pdc->m_hDC, (LPSTR) rgchAlphabet, 54, & size ) ;
  229.    nAveWidth = size.cx / 54 ;
  230.    if ( size.cx % 54 )
  231.    {
  232.       nAveWidth++;
  233.    }
  234.    nAveHeight = size.cy; //6 * size.cy / 4;
  235.    sizeRet.cx = nAveWidth;
  236.    sizeRet.cy = nAveHeight; // tm.tmHeight;
  237.    ed.ReleaseDC(pdc);
  238. }
  239. ///////////////////////////////////////////////////////////////////////////////
  240. int ProcessYieldMessage ()
  241. {
  242.    CWinApp* pApp = AfxGetApp();
  243.    if ( pApp )
  244.    {
  245.       MSG msgx;
  246.       while (::PeekMessage(&msgx, NULL, NULL, NULL, PM_NOREMOVE))
  247.          try
  248.          {
  249.             if (!pApp->PumpMessage())
  250.             {
  251. //       ExitProcess(1);
  252.             }
  253.          }
  254.          catch (...)
  255.          {
  256.          }
  257.    }
  258.    return 0;
  259. }
  260. /////////////////////////////////////////////////////////////////////////////
  261. void print_table_data(MYSQL_RES *result,CString& str,CEdit& ed,LOGFONT& lf)
  262. {
  263.    MYSQL_ROW    cur;
  264.    uint         length;
  265.    MYSQL_FIELD* field;
  266.    bool*        num_flag;
  267.    my_ulonglong nRows  =  mysql_num_rows(result);
  268.    uint         nFields = mysql_num_fields(result);
  269.    int*         rgi = new int [nFields];
  270.    memset ( rgi, 0,   nFields*sizeof(int) );
  271.    num_flag=(bool*) my_alloca(sizeof(bool)*nFields);
  272.    ed.SetLimitText(65535*16);
  273.    CSize sizeFont;
  274.    CalculateFontSize ( ed, sizeFont );
  275.    uint index = 0;
  276.    rgi[index++]=0;
  277.    CString separator("");
  278.    mysql_field_seek(result,0);
  279.    for (uint off=0; (field = mysql_fetch_field(result)) ; off++)
  280.    {
  281.       uint length= (uint) strlen(field->name);
  282.       length=max(length,field->max_length);
  283.       if (length < 4 && !IS_NOT_NULL(field->flags))
  284.          length=4;               // Room for "NULL"
  285.       field->max_length=length+1;
  286.       int n=length+2;
  287.       for (uint i=lstrlen(field->name); i-- > 0 ; ) separator+="-";
  288.       if ( index!= nFields )
  289.       {
  290.          int o = rgi[index-1];
  291.          rgi[index++]=o+((n+1)*sizeFont.cx)/2;
  292.       }
  293.       separator+='t';
  294.       str += field->name;
  295.       str += "t";
  296.       num_flag[off]= IS_NUM(field->type);
  297.    }
  298.    separator += "rn";
  299.    str += "rn";
  300.    str += separator;
  301.    ed.SetSel(-1,-1);
  302.    ed.ReplaceSel(str);
  303.    if ( 1 || nRows > 100 )
  304.    {
  305.       while ((cur = mysql_fetch_row(result)))
  306.       {
  307.          ProcessYieldMessage ();
  308.          mysql_field_seek(result,0);
  309.          str.Empty();
  310.          ed.SetSel(-1,-1);
  311.          for (uint off=0 ; off < mysql_num_fields(result); off++)
  312.          {
  313.             field = mysql_fetch_field(result);
  314.             length=field->max_length;
  315.             CString strText;
  316.             strText.Format ("%s", cur[off] ? (char*) cur[off] : "NULL");
  317.             str += strText;
  318.             str += "t";
  319.          }
  320.          str += "rn";
  321.          ed.SetSel(-1,-1);
  322.          ed.ReplaceSel(str);
  323.       }
  324.    }
  325.    else
  326.    {
  327.       while ((cur = mysql_fetch_row(result)))
  328.       {
  329.          mysql_field_seek(result,0);
  330.          for (uint off=0 ; off < mysql_num_fields(result); off++)
  331.          {
  332.             field = mysql_fetch_field(result);
  333.             length=field->max_length;
  334.             CString strText;
  335.             strText.Format ("%s", cur[off] ? (char*) cur[off] : "NULL");
  336.             str += strText;
  337.             str += "t";
  338.          }
  339.          str += "rn";
  340.       }
  341.    }
  342.    my_afree((gptr) num_flag);
  343.    str += "rn";
  344.    ed.SetTabStops(nFields,rgi);
  345.    delete [] rgi;
  346. }
  347. /////////////////////////////////////////////////////////////////////////////
  348. void CToolSql::OnQueryPb()
  349. {
  350.    CWaitCursor x;
  351. //   mysql_select_db(m_pdb,"mysql");
  352.    if ( m_pResource && m_pResource->GetType() == CResource::eDatabase )
  353.    {
  354.       CString strDB = m_pResource->GetDisplayName();
  355.       strDB.TrimRight();
  356.       if (mysql_select_db(m_pdb,strDB))
  357.       {
  358.       }
  359.    }
  360.    m_pQuery->UpdateData();
  361.    m_pResults->m_edit.Empty();
  362.    CString str = m_pQuery->m_edit;
  363.    if ( mysql_real_query(m_pdb,str,str.GetLength())==0 )
  364.    {
  365.       MYSQL_RES *result;
  366.       if ((result=mysql_store_result(m_pdb)))
  367.       {
  368.          my_ulonglong nRows = mysql_num_rows(result);
  369.          m_pResults->UpdateData(FALSE);
  370.          m_tabs.SetCurSel(1);
  371.          ActivateTab ( 1 );
  372.          print_table_data(result,m_pResults->m_edit,m_pResults->m_ctl_edit,m_lf);
  373. //       m_pResults->UpdateData(FALSE);
  374.          m_pResults->m_ctl_edit.SetSel(-1,-1);
  375.          CString strText;
  376.          strText.Format ( "rn(%d row(s) affected)rn", nRows );
  377.          m_pResults->m_ctl_edit.ReplaceSel(strText);
  378. mysql_free_result(result);
  379.       }
  380.       else
  381.       {
  382.          m_pResults->m_edit = mysql_error(m_pdb);
  383.          m_pResults->UpdateData(FALSE);
  384.       }
  385.    }
  386.    else
  387.    {
  388.       m_pResults->m_edit = mysql_error(m_pdb);
  389.       m_pResults->UpdateData(FALSE);
  390.    }
  391.    m_tabs.SetCurSel(1);
  392.    ActivateTab ( 1 );
  393. }
  394. /////////////////////////////////////////////////////////////////////////////
  395. void CToolSql::OnQueryDatabases()
  396. {
  397.    CWaitCursor x;
  398.    MYSQL_RES *result;
  399.    m_pResults->m_edit.Empty();
  400.    if ((result=mysql_list_dbs(m_pdb,0)))
  401.    {
  402.       my_ulonglong nRows = mysql_num_rows(result);
  403.       print_table_data(result,m_pResults->m_edit,m_pResults->m_ctl_edit,m_lf);
  404.       //m_pResults->UpdateData(FALSE);
  405.       mysql_free_result(result);
  406.    }
  407.    else
  408.    {
  409.       m_pResults->m_edit = mysql_error(m_pdb);
  410.       m_pResults->UpdateData(FALSE);
  411.    }
  412.    m_tabs.SetCurSel(1);
  413.    ActivateTab ( 1 );
  414. }
  415. /////////////////////////////////////////////////////////////////////////////
  416. void CToolSql::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
  417. {
  418.    ActivateTab ( m_tabs.GetCurSel() );
  419.    *pResult = 0;
  420. }
  421. /////////////////////////////////////////////////////////////////////////////
  422. void CToolSql::OnFontPb()
  423. {
  424.    CFontDialog FontDlg ( & m_lf );
  425.    if ( FontDlg.DoModal ( ) == IDOK )
  426.    {
  427.       if (m_font.GetSafeHandle())
  428.          m_font.DeleteObject();
  429.       m_lf = *FontDlg.m_cf.lpLogFont;
  430.       m_font.CreateFontIndirect(FontDlg.m_cf.lpLogFont);
  431.       m_pQuery->SetFont(&m_font);
  432.       m_pResults->SetFont(&m_font);
  433.       m_pStatus->SetFont(&m_font);
  434.    }
  435. }
  436. /////////////////////////////////////////////////////////////////////////////
  437. void CToolSql::DoOnSize(UINT nType, int cx, int cy)
  438. {
  439.    int nx = cx - ( m_rectDlg[CLIENT_COORDS].Width  ( ) - m_rectTab[CLIENT_COORDS].Width  ( ) );
  440.    int ny = cy - ( m_rectDlg[CLIENT_COORDS].Height ( ) - m_rectTab[CLIENT_COORDS].Height ( ) );
  441.    if (IsWindow(m_tabs.GetSafeHwnd()))
  442.    {
  443.       m_tabs.SetWindowPos ( NULL
  444.                             , 0
  445.                             , 0
  446.                             , nx
  447.                             , ny
  448.                             , SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW );
  449.       if (m_pResults&&IsWindow(m_pResults->GetSafeHwnd()))
  450.          m_pResults -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE );
  451.       if (m_pQuery&&IsWindow(m_pQuery->GetSafeHwnd()))
  452.          m_pQuery -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE );
  453.       if (m_pStatus&&IsWindow(m_pStatus->GetSafeHwnd()))
  454.          m_pStatus -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE );
  455. //     switch ( m_tabs.GetCurSel() )
  456. //     {
  457. //        case 0:
  458. //        {
  459. //          if (m_pResults&&IsWindow(m_pResults->GetSafeHwnd()))
  460. //             m_pResults -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE | SWP_HIDEWINDOW );
  461. //          if (m_pQuery&&IsWindow(m_pQuery->GetSafeHwnd()))
  462. //             m_pQuery -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW );
  463. //          break;
  464. //        }
  465. //        case 1:
  466. //        {
  467. //          if (m_pQuery&&IsWindow(m_pQuery->GetSafeHwnd()))
  468. //             m_pQuery -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE | SWP_HIDEWINDOW );
  469. //          if (m_pResults&&IsWindow(m_pResults->GetSafeHwnd()))
  470. //             m_pResults -> SetWindowPos(NULL,20,24,nx-40,ny-48,SWP_NOZORDER | SWP_NOMOVE | SWP_SHOWWINDOW );
  471. //          break;
  472. //        }
  473. //     }
  474.    }
  475. }
  476. /////////////////////////////////////////////////////////////////////////////
  477. void CToolSql::OnSize(UINT nType, int cx, int cy)
  478. {
  479.    CDialog::OnSize(nType, cx, cy);
  480.    DoOnSize ( nType, cx, cy );
  481. }
  482. /////////////////////////////////////////////////////////////////////////////
  483. void CToolSql::OnOK()
  484. {
  485.    CDialog::OnOK();
  486. }
  487. /////////////////////////////////////////////////////////////////////////////
  488. void CToolSql::OnCancel()
  489. {
  490.    CDialog::OnCancel();
  491. }
  492. /////////////////////////////////////////////////////////////////////////////
  493. BOOL CToolSql::PreTranslateMessage(MSG* pMsg)
  494. {
  495.    return CDialog::PreTranslateMessage(pMsg);
  496. }
  497. /////////////////////////////////////////////////////////////////////////////
  498. void CToolSql::DoProcessListQuery()
  499. {
  500. MYSQL_RES *result;
  501. if (result=mysql_list_processes(m_pdb))
  502. {
  503. if (m_bClear)
  504. {
  505. m_pStatus->m_edit.Empty();
  506. m_pStatus->UpdateData(FALSE);
  507. }
  508. print_table_data(result,m_pStatus->m_edit,m_pStatus->m_ctl_edit,m_lf);
  509. mysql_free_result(result);
  510. }
  511. else
  512. {
  513. // my_printf_error(0,"process list failed; error: '%s'",MYF(ME_BELL),mysql_error(mysql));
  514. }
  515. }
  516. /////////////////////////////////////////////////////////////////////////////
  517. void CToolSql::OnStartPb()
  518. {
  519. UpdateData();
  520. if (m_ui_timer) return;
  521. if (m_nIntervalTimerSeconds<1) return;
  522. ActivateTab ( 2 );
  523. m_ui_timer = SetTimer( MY_TIMER_ID, m_nIntervalTimerSeconds*1000, NULL );
  524. m_ctl_Start . EnableWindow(FALSE);
  525. m_ctl_Stop  . EnableWindow(TRUE);
  526. DoProcessListQuery();
  527. }
  528. /////////////////////////////////////////////////////////////////////////////
  529. void CToolSql::OnStopPb()
  530. {
  531. UpdateData();
  532. if (m_ui_timer)
  533. {
  534. KillTimer(MY_TIMER_ID);
  535. m_ui_timer = 0;
  536. }
  537. m_ctl_Start . EnableWindow(TRUE);
  538. m_ctl_Stop  . EnableWindow(FALSE);
  539. }
  540. /////////////////////////////////////////////////////////////////////////////
  541. void CToolSql::OnTimer(UINT nIDEvent)
  542. {
  543. DoProcessListQuery();
  544. CDialog::OnTimer(nIDEvent);
  545. }
  546. void CToolSql::OnDestroy()
  547. {
  548. if (m_ui_timer)
  549. {
  550. KillTimer(MY_TIMER_ID);
  551. m_ui_timer = 0;
  552. }
  553. CDialog::OnDestroy();
  554. }
  555. void CToolSql::OnClear()
  556. {
  557. UpdateData();
  558. }
  559. void CToolSql::OnChangeTimerSecs()
  560. {
  561. UpdateData();
  562. }