home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysqlmanager / toolsql.cpp < prev    next >
C/C++ Source or Header  |  2000-08-23  |  17KB  |  688 lines

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