#include "stdafx.h"
|
#include "MysqlConn.h"
|
|
|
|
// ³õʼ»¯Á¬½Ó
|
// ³õʼ»¯Á¬½Ó
|
MysqlConn::MysqlConn() {
|
m_mysql = mysql_init(nullptr);
|
if (!m_mysql) {
|
cout << "Failed to initialize MySQL." << endl;
|
return;
|
}
|
// ʹÓÃдËÀµÄ²ÎÊýÁ¬½ÓÊý¾Ý¿â
|
m_mysql = mysql_real_connect(m_mysql, "127.0.0.1", "root", "123456", "mayi_kunlun", 3306, nullptr, 0);
|
if (!m_mysql) {
|
cout << "MysqlConn connect to mysql is failed!" << endl;
|
// È·±£ÔÚÁ¬½Óʧ°ÜʱÕýÈ·ÇåÀí×ÊÔ´
|
mysql_close(m_mysql);
|
m_mysql = nullptr;
|
}
|
// ³õʼ»¯ row_ ºÍ res_
|
if (m_mysql) mysql_set_character_set(m_mysql, "gbk");
|
m_row = nullptr;
|
m_res = nullptr;
|
}
|
bool MysqlConn::isConnected() {
|
return m_mysql != nullptr;
|
}
|
|
// ÊÍ·Å×ÊÔ´
|
MysqlConn::~MysqlConn() {
|
if (m_mysql) {
|
mysql_close(m_mysql);
|
m_mysql = nullptr;
|
}
|
freeRes();
|
}
|
|
// ¸üÐÂÊý¾Ý
|
bool MysqlConn::update(string sql) {
|
// ²ÎÊý»¯²éѯÓÅ»¯ºóµÄ°²È«¼ì²é
|
MYSQL_STMT* stmt = mysql_stmt_init(m_mysql);
|
if (!stmt) {
|
return false;
|
}
|
if (mysql_stmt_prepare(stmt, sql.c_str(), sql.length())) {
|
mysql_stmt_close(stmt);
|
return false;
|
}
|
int paramCount = mysql_stmt_param_count(stmt);
|
if (paramCount > 0) {
|
mysql_stmt_close(stmt);
|
return false;
|
}
|
if (mysql_stmt_execute(stmt)) {
|
mysql_stmt_close(stmt);
|
return false;
|
}
|
mysql_stmt_close(stmt);
|
return true;
|
}
|
|
bool MysqlConn::query(string sql, vector<vector<string>>& result)
|
{
|
freeRes();
|
int ret = mysql_query(m_mysql, sql.c_str());
|
if (ret != 0) {
|
fprintf(stderr, "Query failed: %s\n", mysql_error(m_mysql));
|
return false;
|
}
|
// »ñÈ¡²éѯ½á¹û
|
m_res = mysql_store_result(m_mysql);
|
if (!m_res) return false;
|
//½«½á¹û¼¯×ªµ½¶þάÊý×éresultÀïÃæ
|
//int col_cnt = m_mysql->field_count;
|
int col_cnt = mysql_field_count(m_mysql);
|
cout << col_cnt << endl;
|
MYSQL_ROW m_row;
|
while (m_row = mysql_fetch_row(m_res)) {
|
vector<string> tmp;
|
for (int i = 0; i < col_cnt; i++) {
|
tmp.push_back(m_row[i]);
|
}
|
result.push_back(tmp);
|
}
|
return true;
|
}
|
|
// ²éѯÊý¾Ý¿â
|
bool MysqlConn::query(string sql) {
|
freeRes();
|
//²ÎÊý»¯²éѯÓÅ»¯ºóµÄ°²È«¼ì²é
|
MYSQL_STMT* stmt = mysql_stmt_init(m_mysql);
|
if (!stmt) {
|
return false;
|
}
|
if (mysql_stmt_prepare(stmt, sql.c_str(), sql.length())) {
|
mysql_stmt_close(stmt);
|
return false;
|
}
|
int paramCount = mysql_stmt_param_count(stmt);
|
if (paramCount > 0) {
|
// Èç¹ûÓвÎÊý£¬ÐèÒª½øÐвÎÊý°ó¶¨µÈ²Ù×÷£¬ÕâÀïÔݲ»ÊµÏÖ
|
mysql_stmt_close(stmt);
|
return false;
|
}
|
if (mysql_stmt_execute(stmt)) {
|
mysql_stmt_close(stmt);
|
return false;
|
}
|
m_res = mysql_stmt_result_metadata(stmt);
|
if (!m_row) {
|
mysql_stmt_close(stmt);
|
return false;
|
}
|
mysql_stmt_close(stmt);
|
return true;
|
}
|
|
// µÃµ½½á¹û¼¯
|
bool MysqlConn::getResult() {
|
if (m_row) {
|
m_row = mysql_fetch_row(m_res);
|
if (m_row) return true;
|
}
|
return false;
|
}
|
|
// »ñÈ¡½á¹û¼¯µÄ×Ö¶Î
|
string MysqlConn::getField(int index) {
|
int cols = mysql_num_fields(m_res);
|
if (!m_res || index >= cols || index < 0) return string("");
|
|
char* value = m_row[index];
|
// ʹÓÃÏÔʽÀàÐÍת»»
|
unsigned long len = static_cast<unsigned long>(mysql_fetch_lengths(m_res)[index]);
|
return string(value, len);
|
}
|
|
// ÊÂÎñ²Ù×÷
|
bool MysqlConn::transaction() {
|
return mysql_autocommit(m_mysql, false);
|
}
|
|
// Ìá½»ÊÂÎñ
|
bool MysqlConn::commit() {
|
return mysql_commit(m_mysql);
|
}
|
|
// ÊÂÎñ»Ø¹ö
|
bool MysqlConn::rollback() {
|
return mysql_rollback(m_mysql);
|
}
|
|
void MysqlConn::refreshActiveTime() {
|
m_activeTime = chrono::steady_clock::now();
|
}
|
|
long long MysqlConn::getActiveTime() {
|
// ÄÉÃ×
|
chrono::nanoseconds nased = chrono::steady_clock::now() - m_activeTime;
|
// ת»»³ÉºÁÃ×
|
chrono::microseconds millsed = chrono::duration_cast<chrono::microseconds>(nased);
|
return millsed.count(); // ¶àÉÙºÁÃë
|
}
|
|
// °²È«Ð£ÑéʵÏÖ£¬ÕâÀï¼òµ¥Ê¹ÓÃÕýÔò±í´ïʽÅжÏÊÇ·ñ°üº¬Î£ÏÕ×Ö·û
|
bool MysqlConn::isSqlSafe(const string& sql) {
|
regex dangerousPattern(".*(['\";\\-+=]).*");
|
return!regex_search(sql, dangerousPattern);
|
}
|
|
void MysqlConn::freeRes() {
|
if (m_res) {
|
mysql_free_result(m_res);
|
m_res = nullptr;
|
}
|
}
|