HandleDB.h
/*
数据库操作类
*/
#ifndef _HANDLEDB_H
#define _HANDLEDB_H
#include <iostream>
#include <stdlib.h>
#include <mysql/mysql.h>
using namespace std;
#define TIMEOUT 1 //设置连接超时选项的宏标识
#define COMPRESS 2 //设置传输中压缩数据的宏标识
typedef struct SysInfo {
const char* m_clientinfo; //客户端库文件版本信息
const char* m_hostinfo; //服务器连接信息
const char* m_serverinfo; //当前连接的服务器信息
const char* m_queryinfo; //最近一次执行的query的信息,只针对update和insert有效
} SysInfo;
class HandleDB {
public:
//构造函数,初始化连接句柄
HandleDB();
//析构函数,释放连接
~HandleDB();
//连接选项设置
int setOptions(int flag, const char* timeout = NULL);
MYSQL* createConnection(const char* p_sql_server_host,
const char* p_sql_user_name,
const char* p_sql_user_pwd,
const char* p_sql_db_name);
//执行SQL命令
int executeSQL(const char* str_sql, bool isselect = false);
//获取系统信息
SysInfo getSysInfo();
//中断操作并退出系统
void endHandle();
//打印错误信息
void printErrInfo();
private:
MYSQL* mp_connection;
MYSQL_RES* mp_res;
MYSQL_ROW m_row;
};
#endif //_HANDLEDB_H
HandleDB.cpp
/*
数据库操作类
*/
#include "HandleDB.h"
//构造函数,初始化连接句柄
HandleDB::HandleDB() {
mp_connection = mysql_init(NULL);
if(mp_connection == NULL) {
cout << "error: init connection failed!" << endl;
exit(-1);
}
}
//析构函数,关闭连接
HandleDB::~HandleDB() {
if(mp_connection != NULL) {
mysql_close(mp_connection);
}
}
//连接选项设置
int HandleDB::setOptions(int flag, const char* timeout) {
if(flag == TIMEOUT) {
return mysql_options(mp_connection, MYSQL_OPT_CONNECT_TIMEOUT, timeout);
}else if(flag == COMPRESS){
return mysql_options(mp_connection, MYSQL_OPT_COMPRESS, 0);
}else {
cout << "error: please input incorrect flag(TIMEOUT/COMPRESS)!" << endl;
return -1;
}
}
//创建连接
MYSQL* HandleDB::createConnection(const char* p_sql_server_host,
const char* p_sql_user_name,
const char* p_sql_user_pwd,
const char* p_sql_db_name) {
MYSQL* p_tempconnection = mysql_real_connect(mp_connection,
p_sql_server_host,
p_sql_user_name,
p_sql_user_pwd,
p_sql_db_name,
0, NULL, 0);
if(p_tempconnection == NULL) {
endHandle();
}
}
//执行SQL命令
int HandleDB::executeSQL(const char* str_sql, bool isselect) {
if(mysql_query(mp_connection, str_sql)) {
printErrInfo();
return -1;
}
mp_res = mysql_store_result(mp_connection);
if(isselect) {
cout << "查询到" << mysql_num_rows(mp_res) << "条记录" << endl;
while((m_row = mysql_fetch_row(mp_res))) {
for(size_t i = 0; i < mysql_field_count(mp_connection); i++) {
cout << m_row[i] << " ";
}
cout << endl;
}
}else {
cout << "影响到了" << mysql_affected_rows(mp_connection) << "条记录" << endl;
}
return 0;
}
//获取系统信息
SysInfo HandleDB::getSysInfo() {
SysInfo sysinfo = {};
sysinfo.m_clientinfo = mysql_get_client_info();
sysinfo.m_hostinfo = mysql_get_host_info(mp_connection);
sysinfo.m_serverinfo = mysql_get_server_info(mp_connection);
sysinfo.m_queryinfo = mysql_info(mp_connection);
return sysinfo;
}
//中断操作并退出系统
void HandleDB::endHandle() {
printErrInfo();
exit(-1);
}
//打印错误信息
void HandleDB::printErrInfo() {
cout << "error: "
<< mysql_errno(mp_connection)
<< ": "
<< mysql_error(mp_connection)
<< endl;
}
test.cpp
#include "HandleDB.h"
int main() {
HandleDB mydb;
unsigned int timeout = 3;
//设置连接超时
mydb.setOptions(TIMEOUT, (const char*)&timeout);
//设置传输压缩
mydb.setOptions(COMPRESS);
mydb.setOptions(3);
mydb.createConnection("localhost", "***", "***", "***");
//mydb.executeSQL("select * from PlayerInfo order by logname", true);
//mydb.executeSQL("insert into PlayerInfo values(2, 'Tony', 'Tony123')", false);
//mydb.executeSQL("delete from PlayerInfo where id=7", false);
mydb.executeSQL("insert into PlayerInfo values(8, 'jay', 'jay123')", false);
SysInfo sysinfo = mydb.getSysInfo();
cout << "客户端库文件版本:" << sysinfo.m_clientinfo << endl;
cout << "服务器连接信息:" << sysinfo.m_hostinfo << endl;
cout << "当前连接的服务器信息:" << sysinfo.m_serverinfo << endl;
cout << "最近一次执行的query:" << sysinfo.m_queryinfo << endl;
return 0;
}