//头文件
#ifndef MYSQL_TOOL_H_
#define MYSQL_TOOL_H_
#include <string>
#include <map>
#include <vector>
#include <mysql.h>
/**
* /file Magic_Mysql.hh
* /brief this file supplied common mysql access API.
*/
/**
* Magic_Mysql used to supply common mysql db access API.
*/
class CMysql
{
typedef std::map<std::string, int> STRING2INT;
public:
//default constructor
CMysql();
/**
* @param szHost indicates db host name or ip.
* @param szUser indicates db account user name.
* @param szPass indicates db account password .
*/
CMysql(const char* szHost, const char* szUser, const char* szPass);
//default destructor
~CMysql();
/**
* @param szHost indicates db host name or ip.
* @param szUser indicates db account user name.
* @param szPass indicates db account password .
* @return 0 on success, -1 on failure.
*/
int Connect(const char* szHost, const char* szUser, const char* szPass);
/**
* Used to establist db connection.
*/
int Connect();
/**
* Used to execute db sql query.
* @param szSqlString indicates sql string .
* @return 0 onsuccess -1 fail..
*/
int Query(const char* szSqlString);
/**
* Used to execute db sql query.
* @param szSqlString indicates sql string which should include binary data.
* @param size indicates sql size of szSqlString.
* @return 0 on scuesss -1 fail.
*/
int Query(const char* szSqlString,unsigned int size);
/**
* Used to store query result.
* @return 0 onsuccess -1 on failure.
*/
int StoreResult();
/**
* Used to Free Query result.
*/
int FreeResult();
/**
* Used to get result row .
* @return NULL on failure
* else result row of query.
*/
char** FetchRow();
/**
* Used to strip abnormal character .
* @param to indictes striped stirng.
* @param from indicates original string.
* @param len indicates from string length.
* @return 0 on success,else fail.
*/
int StripField(std::string& to, const char* from,unsigned long len);
/**
* Used to get field result by ordinal number.
* @param iFiled indicates field ordinal number.
* @return NULL on failure.
* else field result.
*/
char* GetField(unsigned int iField);
/**
* Used to get field result by field name.
* @param szFieldName indicates field name.
* @return NULL on failure.
* else field result.
*/
char* GetField(const char* szFieldName);
/**
* Used to get query affected rows.
* @return affected row count.
*/
unsigned int GetAffectedRows();
/**
* Used to get mysql sock handle.
* @return sock handle.
*/
inline MYSQL* GetConnectHandle()
{
return &m_connection;
}
inline const char* getErrMsg(void) const
{
return m_ErrMsg;
}
private:
char m_ErrMsg[1024];
char m_szHost[64]; // 数据库主机名
char m_szUser[64]; // 数据库用户名
char m_szPass[64]; // 数据库用户密码
unsigned int m_iField;
MYSQL m_connection;
MYSQL_RES *m_result;
MYSQL_ROW m_row;
STRING2INT m_FieldIndex;
bool m_bFieldIndexInitialized;
bool m_bConnected;
int InitFieldName();
};
#endif /*MYSQL_TOOL_H_*/
//cpp文件
#include "mysql_tool.h"
#include <stdio.h>
using namespace std;
//
//
CMysql:: CMysql()
{
mysql_init (&m_connection);
m_bConnected = false;
m_iField = 0;
m_result = NULL;
bzero (m_szHost, sizeof(m_szHost));
bzero (m_szUser, sizeof(m_szUser));
bzero (m_szPass, sizeof(m_szPass));
m_bFieldIndexInitialized = false;
}
CMysql:: CMysql(const char* szHost, const char* szUser, const char* szPass)
{
mysql_init(&m_connection);
m_bConnected = false;
m_iField = 0;
m_result = NULL;
strncpy (m_szHost, szHost, sizeof(m_szHost));
strncpy (m_szUser, szUser, sizeof(m_szUser));
strncpy (m_szPass, szPass, sizeof(m_szPass));
m_bFieldIndexInitialized = false;
}
CMysql:: ~CMysql()
{
if (m_bConnected)
{
FreeResult();
mysql_close(&m_connection);
}
}
int CMysql::StripField(string& to, const char* from,unsigned long len)
{
if(from==NULL) return -1;
char *tostr = new char[2*len+1];
mysql_real_escape_string(&m_connection,tostr,from,len);
to = tostr;
delete [] tostr;
return 0;
}
int CMysql:: Connect(const char* szHost, const char* szUser, const char* szPass)
{
strncpy (m_szHost, szHost, sizeof(m_szHost));
strncpy (m_szUser, szUser, sizeof(m_szUser));
strncpy (m_szPass, szPass, sizeof(m_szPass));
return Connect();
}
int CMysql:: Connect()
{
if (!m_bConnected)
{
if (mysql_real_connect(&m_connection, m_szHost, m_szUser, m_szPass, NULL, 0, NULL, 0) == NULL)
{
sprintf (m_ErrMsg, "连接数据库失败:%s", mysql_error(&m_connection));
return -1;
}
m_bConnected = true;
}
return 0;
}
int CMysql:: Query(const char* szSqlString)
{
Connect();
if (mysql_query(&m_connection, szSqlString) != 0)
{
sprintf (m_ErrMsg, "查询数据库失败:%s", mysql_error(&m_connection));
return -1;
}
return 0;
}
int CMysql:: Query(const char* szSqlString,unsigned int size)
{
Connect();
if (mysql_real_query(&m_connection, szSqlString,size) != 0)
{
sprintf (m_ErrMsg, "查询数据库失败:%s", mysql_error(&m_connection));
return -1;
}
return 0;
}
int CMysql:: FreeResult()
{
if (m_result != NULL)
mysql_free_result (m_result);
m_iField = 0;
if (m_bFieldIndexInitialized)
{
m_FieldIndex.erase(m_FieldIndex.begin(), m_FieldIndex.end());
m_bFieldIndexInitialized = false;
}
m_result = NULL ;
return 0;
}
int CMysql:: StoreResult()
{
FreeResult();
m_result = mysql_store_result (&m_connection);
if (m_result == NULL)
{
sprintf (m_ErrMsg, "保存结果出错:%s!", mysql_error(&m_connection));
return -1;
}
m_iField = mysql_num_fields (m_result);
return 0;
}
char** CMysql:: FetchRow()
{
if (m_result == NULL)
StoreResult();
m_row = mysql_fetch_row (m_result);
return m_row;
}
int CMysql:: InitFieldName()
{
if ((!m_bFieldIndexInitialized) && (m_result!=NULL))
{
unsigned int i;
MYSQL_FIELD *fields;
fields = mysql_fetch_fields(m_result);
for(i = 0; i < m_iField; i++)
{
m_FieldIndex[fields[i].name] = i;
}
m_bFieldIndexInitialized = true;
}
return 0;
}
/*
返回结果的行数
*/
unsigned int CMysql:: GetAffectedRows()
{
my_ulonglong iNumRows;
if (m_result == NULL) return 0;
iNumRows = mysql_affected_rows(&m_connection);
return (unsigned int)iNumRows;
}
/*
按照字段名取回当前行的结果
*/
char* CMysql:: GetField(const char* szFieldName)
{
InitFieldName();
return GetField(m_FieldIndex[szFieldName]);
}
/*
按照字段索引取回当前行的结果
*/
char* CMysql:: GetField(unsigned int iField)
{
if (iField > m_iField)
return NULL;
return m_row[iField];
}