240717班级,工业化控制系统,煤矿相关行业,昆仑系统
Administrator
2024-11-06 731aab44a67db573ab7a9e6af8bfecf6efebbd23
Server/ÍõçûÔª/code/MysqlConn.cpp
@@ -1,115 +1,144 @@
#include "stdafx.h"
#include "MysqlConn.h"
#include <regex>
// åˆå§‹åŒ–连接
MysqlConn::MysqlConn() {
   mysql_ = mysql_init( mysql_ );
   // è®¾ç½®å­—符集
   if( mysql_ )   mysql_set_character_set(mysql_ , "gbk");
    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;
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();
    if (mysql_) {
        mysql_close(mysql_);
        mysql_ = nullptr;
    }
    freeRes();
}
// æ›´æ–°æ•°æ®
bool MysqlConn::update( std::string sql ) {
   if (!isSqlSafe(sql))
   {
      return false;
   }
   int ret = mysql_query( mysql_ , sql.c_str());
   if( ret != 0 ){
      return false;
   }
   return true;
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( );
   if (!isSqlSafe(sql))
   {
      return false;
   }
   int ret = mysql_query(mysql_, sql.c_str());
   if (ret != 0)   return false;
   // èŽ·å–æŸ¥è¯¢ç»“æžœ
   res_ = mysql_store_result(mysql_);
   if (!res_)   return false;
   return true;
    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;
    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);
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 );
    return mysql_autocommit(mysql_, false);
}
// æäº¤äº‹åŠ¡
bool MysqlConn::commit() {
   return mysql_commit(mysql_);
    return mysql_commit(mysql_);
}
// äº‹åŠ¡å›žæ»š
bool MysqlConn::rollback() {
   return mysql_rollback(mysql_);
    return mysql_rollback(mysql_);
}
void MysqlConn::refreshActiveTime()
{
   activeTime_  = std::chrono::steady_clock::now();
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( );   // å¤šå°‘毫秒
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);
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;
   }
    if (res_) {
        mysql_free_result(res_);
        res_ = nullptr;
    }
}