#include "stdafx.h"
|
#include "MysqlConn.h"
|
#include <regex>
|
|
|
// ³õʼ»¯Á¬½Ó
|
MysqlConn::MysqlConn() {
|
mysql_ = mysql_init(mysql_);
|
// ÉèÖÃ×Ö·û¼¯
|
if (mysql_) mysql_set_character_set(mysql_, "gbk");
|
}
|
|
// Á¬½ÓÊý¾Ý¿â
|
bool MysqlConn::connect(std::string ip, std::string userName, std::string passwd, std::string db, int port) {
|
mysql_ = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0);
|
if (!mysql_) {
|
return false;
|
}
|
return true;
|
}
|
|
// ÊÍ·Å×ÊÔ´
|
MysqlConn::~MysqlConn() {
|
if (mysql_) {
|
mysql_close(mysql_);
|
mysql_ = nullptr;
|
}
|
freeRes();
|
}
|
|
// ¸üÐÂÊý¾Ý
|
bool MysqlConn::update(std::string sql) {
|
// ²ÎÊý»¯²éѯÓÅ»¯ºóµÄ°²È«¼ì²é
|
MYSQL_STMT* stmt = mysql_stmt_init(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(std::string sql) {
|
freeRes();
|
// ²ÎÊý»¯²éѯÓÅ»¯ºóµÄ°²È«¼ì²é
|
MYSQL_STMT* stmt = mysql_stmt_init(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;
|
}
|
res_ = mysql_stmt_result_metadata(stmt);
|
if (!res_) {
|
mysql_stmt_close(stmt);
|
return false;
|
}
|
mysql_stmt_close(stmt);
|
return true;
|
}
|
|
// µÃµ½½á¹û¼¯
|
bool MysqlConn::getResult() {
|
if (res_) {
|
row_ = mysql_fetch_row(res_);
|
if (row_) return true;
|
}
|
return false;
|
}
|
|
// »ñÈ¡½á¹û¼¯µÄ×Ö¶Î
|
std::string MysqlConn::getField(int index) {
|
int cols = mysql_num_fields(res_);
|
if (index >= cols || index < 0) return std::string("");
|
|
char* value = row_[index];
|
unsigned long len = mysql_fetch_lengths(res_)[index];
|
return std::string(value, len);
|
}
|
|
// ÊÂÎñ²Ù×÷
|
bool MysqlConn::transaction() {
|
return mysql_autocommit(mysql_, false);
|
}
|
|
// Ìá½»ÊÂÎñ
|
bool MysqlConn::commit() {
|
return mysql_commit(mysql_);
|
}
|
|
// ÊÂÎñ»Ø¹ö
|
bool MysqlConn::rollback() {
|
return mysql_rollback(mysql_);
|
}
|
|
void MysqlConn::refreshActiveTime() {
|
activeTime_ = std::chrono::steady_clock::now();
|
}
|
|
long long MysqlConn::getActiveTime() {
|
// ÄÉÃ×
|
std::chrono::nanoseconds nased = std::chrono::steady_clock::now() - activeTime_;
|
// ת»»³ÉºÁÃ×
|
std::chrono::microseconds millsed = std::chrono::duration_cast<std::chrono::microseconds>(nased);
|
return millsed.count(); // ¶àÉÙºÁÃë
|
}
|
|
// °²È«Ð£ÑéʵÏÖ£¬ÕâÀï¼òµ¥Ê¹ÓÃÕýÔò±í´ïʽÅжÏÊÇ·ñ°üº¬Î£ÏÕ×Ö·û
|
bool MysqlConn::isSqlSafe(const std::string& sql) {
|
std::regex dangerousPattern(".*(['\";\\-+=]).*");
|
return!std::regex_search(sql, dangerousPattern);
|
}
|
|
void MysqlConn::freeRes() {
|
if (res_) {
|
mysql_free_result(res_);
|
res_ = nullptr;
|
}
|
}
|