diff options
Diffstat (limited to 'VC++Files/mysqlmanager/toolsql.cpp')
-rw-r--r-- | VC++Files/mysqlmanager/toolsql.cpp | 687 |
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(); +} |