//MySqlConn.h
#pragma once
#include <WinSock.h>
#include <mysql.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"libmysql.lib")
enum
{
CmdText = 0,
CmdFunc,
CmdStore,
};
class MySqlConn
{
public:
MySqlConn(void);
~MySqlConn(void);
private:
MYSQL *m_MySql;
char *m_pConnStr;
CRITICAL_SECTION m_csConn;
LARGE_INTEGER m_CountsOfSecond;
LARGE_INTEGER m_PrevCounts;
LARGE_INTEGER m_CurrCounts;
public:
bool InitConnect(const char* phost,const char* pUser,const char* pPwd,const char* pDbname,double &ftime, UINT uPort = 3306);
void CloseMysqlConn(void);
MYSQL_RES* GetResult(const char* pParam,double &ftime,UINT uType = CmdText);
void Lock(void);
void UnLock(void);
void ReleaseRes(MYSQL_RES* result);
};
//MySqlConn.cpp
#include <stdio.h>
#include "MySqlConn.h"
MySqlConn::MySqlConn(void)
{
m_MySql = NULL;
m_pConnStr = NULL;
InitializeCriticalSection(&m_csConn);
QueryPerformanceFrequency(&m_CountsOfSecond);
}
MySqlConn::~MySqlConn(void)
{
if(m_pConnStr)
{
delete[] m_pConnStr;
m_pConnStr = NULL;
}
DeleteCriticalSection(&m_csConn);
mysql_library_end();
}
/************************************************************************/
/*初始化mysql连接
bool InitConnect(
const char* phost, [IN]数据库IP地址,本机: localhost
const char* pUser, [IN]数据库登录用户 root
const char* pPwd, [IN]数据库登录密码,若为空: NULL
const char* pDbname, [IN]数据库名称: database
double &ftime, [OUT]连接数据库需要的时间: s
UINT uPort [IN]数据库开放端口: 3306
)
*/
/************************************************************************/
bool MySqlConn::InitConnect(const char* phost,const char* pUser,const char* pPwd,const char* pDbname,double &ftime,UINT uPort /* = 3306 */)
{
QueryPerformanceCounter(&m_PrevCounts);
m_MySql = mysql_init(0);
if(!mysql_real_connect(m_MySql,phost,pUser,pPwd,pDbname,uPort,NULL,CLIENT_MULTI_STATEMENTS))
{
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
const char* pErr = mysql_error(m_MySql);
printf(pErr);
return false;
}
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
return true;
}
void MySqlConn::CloseMysqlConn(void)
{
mysql_close(m_MySql);
}
/************************************************************************/
/*获取数据结果集
MYSQL_RES* MySqlConn::GetResult(
const char* pParam, [IN]数据库sql语句: select * from table / call procedrue / select function
double &ftime [OUT]访问数据库所用时间: s
UINT uType [IN]数据库访问类型CmdText,CmdFunc,CmdStore
)
*/
/************************************************************************/
MYSQL_RES* MySqlConn::GetResult(const char* pParam,double &ftime,UINT uType)
{
MYSQL_RES *pResult;
QueryPerformanceCounter(&m_PrevCounts);
Lock();
if(uType = CmdStore)
{
if(mysql_query(m_MySql,pParam) != 0)
{
UnLock();
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
const char* pErr = mysql_error(m_MySql);
printf(pErr);
return NULL;
}
}
else
{
if((mysql_real_query(m_MySql,pParam,strlen(pParam))) != 0)
{
UnLock();
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
const char* pErr = mysql_error(m_MySql);
printf(pErr);
return NULL;
}
}
pResult = mysql_use_result(m_MySql);
if(!pResult)
{
UnLock();
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
const char* pErr = mysql_error(m_MySql);
printf(pErr);
return NULL;
}
UnLock();
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
return pResult;
}
/************************************************************************/
/*释放数据结果集
void MySqlConn::ReleaseRes(
MYSQL_RES* result [IN]需要释放的结果集
)
*/
/************************************************************************/
void MySqlConn::ReleaseRes(MYSQL_RES* result)
{
if(result)
{
mysql_free_result(result);
}
}
void MySqlConn::Lock(void)
{
EnterCriticalSection(&m_csConn);
}
void MySqlConn::UnLock(void)
{
LeaveCriticalSection(&m_csConn);
}
#pragma once
#include <WinSock.h>
#include <mysql.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"libmysql.lib")
enum
{
CmdText = 0,
CmdFunc,
CmdStore,
};
class MySqlConn
{
public:
MySqlConn(void);
~MySqlConn(void);
private:
MYSQL *m_MySql;
char *m_pConnStr;
CRITICAL_SECTION m_csConn;
LARGE_INTEGER m_CountsOfSecond;
LARGE_INTEGER m_PrevCounts;
LARGE_INTEGER m_CurrCounts;
public:
bool InitConnect(const char* phost,const char* pUser,const char* pPwd,const char* pDbname,double &ftime, UINT uPort = 3306);
void CloseMysqlConn(void);
MYSQL_RES* GetResult(const char* pParam,double &ftime,UINT uType = CmdText);
void Lock(void);
void UnLock(void);
void ReleaseRes(MYSQL_RES* result);
};
//MySqlConn.cpp
#include <stdio.h>
#include "MySqlConn.h"
MySqlConn::MySqlConn(void)
{
m_MySql = NULL;
m_pConnStr = NULL;
InitializeCriticalSection(&m_csConn);
QueryPerformanceFrequency(&m_CountsOfSecond);
}
MySqlConn::~MySqlConn(void)
{
if(m_pConnStr)
{
delete[] m_pConnStr;
m_pConnStr = NULL;
}
DeleteCriticalSection(&m_csConn);
mysql_library_end();
}
/************************************************************************/
/*初始化mysql连接
bool InitConnect(
const char* phost, [IN]数据库IP地址,本机: localhost
const char* pUser, [IN]数据库登录用户 root
const char* pPwd, [IN]数据库登录密码,若为空: NULL
const char* pDbname, [IN]数据库名称: database
double &ftime, [OUT]连接数据库需要的时间: s
UINT uPort [IN]数据库开放端口: 3306
)
*/
/************************************************************************/
bool MySqlConn::InitConnect(const char* phost,const char* pUser,const char* pPwd,const char* pDbname,double &ftime,UINT uPort /* = 3306 */)
{
QueryPerformanceCounter(&m_PrevCounts);
m_MySql = mysql_init(0);
if(!mysql_real_connect(m_MySql,phost,pUser,pPwd,pDbname,uPort,NULL,CLIENT_MULTI_STATEMENTS))
{
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
const char* pErr = mysql_error(m_MySql);
printf(pErr);
return false;
}
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
return true;
}
void MySqlConn::CloseMysqlConn(void)
{
mysql_close(m_MySql);
}
/************************************************************************/
/*获取数据结果集
MYSQL_RES* MySqlConn::GetResult(
const char* pParam, [IN]数据库sql语句: select * from table / call procedrue / select function
double &ftime [OUT]访问数据库所用时间: s
UINT uType [IN]数据库访问类型CmdText,CmdFunc,CmdStore
)
*/
/************************************************************************/
MYSQL_RES* MySqlConn::GetResult(const char* pParam,double &ftime,UINT uType)
{
MYSQL_RES *pResult;
QueryPerformanceCounter(&m_PrevCounts);
Lock();
if(uType = CmdStore)
{
if(mysql_query(m_MySql,pParam) != 0)
{
UnLock();
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
const char* pErr = mysql_error(m_MySql);
printf(pErr);
return NULL;
}
}
else
{
if((mysql_real_query(m_MySql,pParam,strlen(pParam))) != 0)
{
UnLock();
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
const char* pErr = mysql_error(m_MySql);
printf(pErr);
return NULL;
}
}
pResult = mysql_use_result(m_MySql);
if(!pResult)
{
UnLock();
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
const char* pErr = mysql_error(m_MySql);
printf(pErr);
return NULL;
}
UnLock();
QueryPerformanceCounter(&m_CurrCounts);
ftime = ((double)(m_CurrCounts.QuadPart - m_PrevCounts.QuadPart)) / m_CountsOfSecond.QuadPart;
return pResult;
}
/************************************************************************/
/*释放数据结果集
void MySqlConn::ReleaseRes(
MYSQL_RES* result [IN]需要释放的结果集
)
*/
/************************************************************************/
void MySqlConn::ReleaseRes(MYSQL_RES* result)
{
if(result)
{
mysql_free_result(result);
}
}
void MySqlConn::Lock(void)
{
EnterCriticalSection(&m_csConn);
}
void MySqlConn::UnLock(void)
{
LeaveCriticalSection(&m_csConn);
}