⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leftview.cpp

📁 连接MYSQL数据库
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//author : Jarry
//E-mail : lansingk@online.sh.cn
// LeftView.cpp : implementation of the CLeftView class
//

#include "stdafx.h"
#include "mysqlManager.h"

#include "mysqlManagerDoc.h"
#include "LeftView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CLeftView

IMPLEMENT_DYNCREATE(CLeftView, CTreeView)

BEGIN_MESSAGE_MAP(CLeftView, CTreeView)
	//{{AFX_MSG_MAP(CLeftView)
	ON_WM_CREATE()
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_WM_CONTEXTMENU()
	ON_WM_DESTROY()
	ON_COMMAND(ID_MENUITEM32775, OnMenuitem32775)
	ON_COMMAND(ID_MENUITEM32772, OnMenuitem32772)
	ON_COMMAND(ID_MENUITEM32771, OnMenuitem32771)
	ON_COMMAND(ID_MENUITEM32774, OnMenuitem32774)
	ON_WM_LBUTTONDBLCLK()
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	ON_COMMAND(ID_MENUITEM32786, OnMenuitem32786)
	//}}AFX_MSG_MAP
	// Standard printing commands
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLeftView construction/destruction

CLeftView::CLeftView()
{
}

CLeftView::~CLeftView()
{
}

BOOL CLeftView::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style |= TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES;

	return CTreeView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CLeftView drawing

void CLeftView::OnDraw(CDC* pDC)
{
	CMysqlManagerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
}

void CLeftView::OnInitialUpdate()
{
	CTreeView::OnInitialUpdate();

	// TODO: You may populate your TreeView with items by directly accessing
	//  its tree control through a call to GetTreeCtrl().
}

/////////////////////////////////////////////////////////////////////////////
// CLeftView diagnostics

#ifdef _DEBUG
void CLeftView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CLeftView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}

CMysqlManagerDoc* CLeftView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMysqlManagerDoc)));
	return (CMysqlManagerDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLeftView message handlers

void CLeftView::ShowPopupMenu(CPoint &point)
{
    CMenu menu;
    VERIFY(menu.LoadMenu(IDR_MENU_MYVIEW));
    CMenu* pPopup = menu.GetSubMenu(0);
    ASSERT(pPopup != NULL);
    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
			               point.x, point.y,
						   this);
}

int CLeftView::RegisterServer(LPCTSTR pszServer,LPCTSTR pszHost, unsigned int nPort, bool bTrusted ,LPCTSTR pszUser, LPCTSTR pszPasswd)
{
	CString strServer(pszServer);
	ServerInfo *pCheckServer;
	POSITION   pos;

	strServer.TrimLeft();
	strServer.TrimRight();
	pos = m_lstConnect.GetHeadPosition();
	
	while (pos != NULL)
	{
		pCheckServer = (ServerInfo*)m_lstConnect.GetNext(pos);
		if (stricmp(strServer,pCheckServer->strServer) == 0)  //This server has been registered
		{
			AfxMessageBox(IDS_MSG_EXIST_SERVER);
			return 0;
		}
	}

	//No same server found
	//Create a new server register
	pCheckServer = new ServerInfo;
	pCheckServer->strServer = strServer;
	pCheckServer->pMysql    = mysql_init((MYSQL*)NULL);
	pCheckServer->strHost   = pszHost;
	pCheckServer->nPort     = nPort;
	pCheckServer->bTrusted  = bTrusted;
	pCheckServer->strUser   = pszUser;
	pCheckServer->strPasswd = pszPasswd;

	if (pCheckServer->pMysql == NULL)
	{
		AfxMessageBox(IDS_ERR_INIT_MYSQL);
		delete pCheckServer;
		return 0;
	}
	else if (m_pCurMysql == NULL)
		m_pCurMysql = pCheckServer->pMysql;  //Set default connection

	if (pCheckServer->bTrusted)
	{
		if (!mysql_real_connect(pCheckServer->pMysql,pCheckServer->strHost,NULL,NULL,NULL,pCheckServer->nPort,NULL,0))
		{
			AfxMessageBox(mysql_error(pCheckServer->pMysql));
			//AfxMessageBox(IDS_ERR_CONNECT_DB);
			delete pCheckServer;
			return 0;
		}
	}
	else
	{
		if (!mysql_real_connect(pCheckServer->pMysql,pCheckServer->strHost,
		                                             pCheckServer->strUser,
		 											 pCheckServer->strPasswd,
													 NULL,pCheckServer->nPort,NULL,0))
		{
			AfxMessageBox(mysql_error(pCheckServer->pMysql));
			//AfxMessageBox(IDS_ERR_CONNECT_DB);
			delete pCheckServer;
			return 0;
		}
	}

	m_lstConnect.AddTail(pCheckServer);
	AddServerList(pCheckServer);
	return 1;
}

void CLeftView::AddServerList(ServerInfo *pServerInfo)
{
	CTreeCtrl& tvCtrl = GetTreeCtrl();
	HTREEITEM tviDB,tviTAB;
	MYSQL_RES *pResDbs,*pResTabs;

	tviDB = tvCtrl.InsertItem(pServerInfo->strServer,0,0,m_tviServerGrp);
	pResDbs = mysql_list_dbs(pServerInfo->pMysql,"%");  //Get all database
	if (pResDbs != NULL)
	{
		MYSQL_ROW rowDbs;
		while (rowDbs = mysql_fetch_row(pResDbs))
		{
			if ((rowDbs[0] == NULL) || (strlen(rowDbs[0]) <= 0))
				tvCtrl.InsertItem("UNKNOWN DATABASE",1,1,tviDB);
			else
			{
				tviTAB = tvCtrl.InsertItem(rowDbs[0],1,1,tviDB);
				mysql_select_db(pServerInfo->pMysql,rowDbs[0]);
				pResTabs = mysql_list_tables(pServerInfo->pMysql,"%");  //Get all tables
				if (pResTabs != NULL)
				{
					MYSQL_ROW rowTabs;
					while (rowTabs = mysql_fetch_row(pResTabs))
					{
						if ((rowTabs[0] == NULL) || (strlen(rowTabs[0]) <= 0))
							tvCtrl.InsertItem("UNKNOWN TABLE",2,2,tviTAB);
						else
							tvCtrl.InsertItem(rowTabs[0],2,2,tviTAB);
					}
					mysql_free_result(pResTabs);
				}
			}
		}
		mysql_free_result(pResDbs);
	}
}

int CLeftView::ItemStyle(HTREEITEM tviThis,MYSQL **ppMysql)
{
	CTreeCtrl& tvCtrl = GetTreeCtrl();
	POSITION   pos;
	ServerInfo *pCheckServer;
	CString strServer;
	
	int i = 0;

	*ppMysql = NULL;

	while ((tviThis != NULL) && (tviThis != m_tviServerGrp))
	{
		i++;
		strServer = tvCtrl.GetItemText(tviThis);
		tviThis = tvCtrl.GetParentItem(tviThis);
	}

	pos = m_lstConnect.GetHeadPosition();
	
	while (pos != NULL)
	{
		pCheckServer = (ServerInfo*)m_lstConnect.GetNext(pos);
		if (stricmp(strServer,pCheckServer->strServer) == 0)  //
			*ppMysql = pCheckServer->pMysql;	
	}
	return i;
}

void CLeftView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CTreeCtrl& tvCtrl = GetTreeCtrl();
	UINT uFlags;
	HTREEITEM tviItem = tvCtrl.HitTest(point,&uFlags);
	if ((tviItem != NULL) && (uFlags & TVHT_ONITEM))
        tvCtrl.Select(tviItem, TVGN_DROPHILITE);
	
	CTreeView::OnLButtonDown(nFlags, point);
}

void CLeftView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	CTreeCtrl& tvCtrl = GetTreeCtrl();
	UINT uFlags;
	HTREEITEM tviItem = tvCtrl.HitTest(point,&uFlags);
	if ((tviItem != NULL) && (uFlags & TVHT_ONITEM))
	{
		m_tviOldSel = tvCtrl.GetSelectedItem();
        tvCtrl.Select(tviItem, TVGN_DROPHILITE);
	}
}

void CLeftView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	CTreeCtrl& tvCtrl = GetTreeCtrl();
	UINT uFlags;
	ScreenToClient(&point);
	HTREEITEM tviItem = tvCtrl.HitTest(point,&uFlags);
	if ((tviItem != NULL) && (uFlags & TVHT_ONITEM))
	{
		ClientToScreen(&point);
		ShowPopupMenu(point);
		m_tviCurSel = tviItem;
	//  No need , when tviItem equal to m_tviOldSel , it will
	//  cause unlight the selected item
	//	tvCtrl.SetItemState(tviItem, TVIS_DROPHILITED, TVIS_DROPHILITED);
	}
	else
		CTreeView::OnContextMenu(pWnd, point);

	if (m_tviOldSel != NULL)
	{
		tvCtrl.Select(m_tviOldSel, TVGN_DROPHILITE);
		m_tviOldSel = NULL;
	}
}

int CLeftView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTreeView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	m_lstImage.Create(16,16,FALSE,16,0);
	HICON hIcon = ::LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_SERVER));
	m_lstImage.Add(hIcon);
	hIcon = ::LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_DB));
	m_lstImage.Add(hIcon);
	hIcon = ::LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_TABLE));
	m_lstImage.Add(hIcon);
	hIcon = ::LoadIcon (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON_SERVER_GROUP));
	m_lstImage.Add(hIcon);
	GetTreeCtrl().SetImageList(&m_lstImage,LVSIL_NORMAL);

	InitServerGrp();

//	while (dlgRegister.DoModal() == IDOK &&
//		  !RegisterServer(dlgRegister.m_strServer,
//		                  dlgRegister.m_strHost,
//						  dlgRegister.m_nPort,
//						  dlgRegister.m_bTrust,
//						  dlgRegister.m_strUser,
//						  dlgRegister.m_strPasswd));

	return 0;
}

void CLeftView::RemoveAllServer()
{
	ServerInfo *pCheckServer;
	POSITION   pos;

	pos = m_lstConnect.GetHeadPosition();
	
	while (pos != NULL)
	{
		pCheckServer = (ServerInfo*)m_lstConnect.GetNext(pos);
		if (pCheckServer != NULL)
		{
			m_lstConnect.RemoveAt(m_lstConnect.Find(pCheckServer));
			if (pCheckServer->pMysql != NULL)
			{
				mysql_close(pCheckServer->pMysql); 
				pCheckServer->pMysql = NULL;
			}

			delete pCheckServer;
		}
	}
}

void CLeftView::RemoveServer(LPTSTR pszServer)
{
	ServerInfo *pCheckServer;
	POSITION   pos;

	pos = m_lstConnect.GetHeadPosition();
	
	while (pos != NULL)
	{
		pCheckServer = (ServerInfo*)m_lstConnect.GetNext(pos);
		if ((pCheckServer != NULL) && stricmp(pCheckServer->strServer,pszServer) == 0)  //Server found
		{
			m_lstConnect.RemoveAt(m_lstConnect.Find(pCheckServer));
			if (pCheckServer->pMysql != NULL)
			{
				mysql_close(pCheckServer->pMysql); 
				pCheckServer->pMysql = NULL;
			}

			delete pCheckServer;	
		}
	}
}

void CLeftView::OnDestroy() 
{
	CTreeView::OnDestroy();

	RemoveAllServer();	
}

void CLeftView::OnMenuitem32775()
{
//property
	CTreeCtrl& tvCtrl = GetTreeCtrl();
	MYSQL *pMysql;
//	CString strInfo;
	CHAR szDb[512];
	HTREEITEM tviDb;

	switch (ItemStyle(m_tviCurSel,&pMysql))
	{
	case 0 :
		break;
	case 1 :  //Server property
//		strInfo.LoadString(IDS_MSG_SERVER_VERSION);
//		strInfo += mysql_get_server_info(pMysql);
//		AfxMessageBox(strInfo,MB_ICONINFORMATION);
		dlgServer.m_strHost = pMysql->host;
		dlgServer.m_strVersion = pMysql->server_version;
		dlgServer.m_strConnection = pMysql->host_info;
		dlgServer.m_strPort.Format("%d",pMysql->port);
		dlgServer.m_strUser = pMysql->user;
		dlgServer.DoModal();
		break;
	case 2 : //Database property
		break;
	case 3 : //Table property
		dlgTable.m_strTableName = tvCtrl.GetItemText(m_tviCurSel);
		dlgTable.m_pMysql = pMysql;
		tviDb = tvCtrl.GetParentItem(m_tviCurSel);
		strcpy(szDb,tvCtrl.GetItemText(tviDb));  //Get the database name
		if (mysql_select_db(pMysql,szDb) != 0) //Error
		{
			AfxMessageBox(mysql_error(pMysql));
			break;
		}
		dlgTable.DoModal();
		if (m_pCurMysql != NULL)
			mysql_select_db(m_pCurMysql,m_strCurDb);  //back to original database
		break;
	default :
		;
	}
}

void CLeftView::OnMenuitem32772() 
{
//Delete
	CTreeCtrl& tvCtrl = GetTreeCtrl();
	MYSQL *pMysql;
	CString strInfo;
	HTREEITEM tviDb;
	CHAR szSQL[1024],szServer[512],szDb[512],szTable[512];

	switch (ItemStyle(m_tviCurSel,&pMysql))
	{
	case 0 :  //Server group
		break;
	case 1 : //Server
		strInfo.LoadString(IDS_MSG_UNREGISTER_SERVER);
		strcpy(szServer,tvCtrl.GetItemText(m_tviCurSel));
		strInfo += szServer;
		if (AfxMessageBox(strInfo,MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
		{
			RemoveServer(szServer);
			tvCtrl.DeleteItem(m_tviCurSel);
			m_tviCurSel = NULL;
#ifdef INFO_SUCCESS
			AfxMessageBox(IDS_MSG_SUCCESS_UNREGISTER_SERVER,MB_ICONINFORMATION);
#endif //INFO_SUCCESS
		}
		break;
	case 2 : //Database
		if (tvCtrl.ItemHasChildren(m_tviCurSel))
			AfxMessageBox(IDS_MSG_DB_HAVE_TABLES);
		else
		{
			strInfo.LoadString(IDS_MSG_DELETE_DATABASE);
			strcpy(szDb,tvCtrl.GetItemText(m_tviCurSel));
			strInfo += szDb;
			if (AfxMessageBox(strInfo,MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
			{
//				if (mysql_drop_db(pMysql,szDb) == 0)  //Success in drop the database
				if (1)
				{
					tvCtrl.DeleteItem(m_tviCurSel);
					m_tviCurSel = NULL;
					if (stricmp(m_strCurDb,szDb) == 0)
						m_strCurDb = "";
#ifdef INFO_SUCCESS
					AfxMessageBox(IDS_MSG_SUCCESS_DELETE_DATABASE,MB_ICONINFORMATION);
#endif //INFO_SUCCESS
				}
				else
				{
					AfxMessageBox(mysql_error(pMysql));
					//AfxMessageBox(IDS_ERR_DELETE_DATABASE);
				}
			}
		}
		break;
	case 3 : //Table
		strInfo.LoadString(IDS_MSG_DELETE_TABLE);
		strcpy(szTable,tvCtrl.GetItemText(m_tviCurSel));
		strInfo += szTable;
		if (AfxMessageBox(strInfo,MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
		{
			//Note : you need not care the old selected item ,
			//       all things will be fine .
			tviDb = tvCtrl.GetParentItem(m_tviCurSel);
			strcpy(szDb,tvCtrl.GetItemText(tviDb));  //Get the database name
			if (mysql_select_db(pMysql,szDb) == 0) //Success
			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -