240717班级,工业化控制系统,煤矿相关行业,昆仑系统
wangky
2024-11-07 3ed51f1c3194d7a4a1e992fe845e023a488563f3
Server/ÍõçûÔª/code/MysqlConn.cpp
@@ -1,174 +1,179 @@
#include "stdafx.h"
#include "MysqlConn.h"
MysqlConn::MysqlConn()//初始化数据库
{
   m_result = nullptr;
   m_mysqlRow = nullptr;
   // ä¼ å…¥nullptr空指针时,会自动分配一个MYSQL对象
   m_conn = mysql_init(nullptr);
// åˆå§‹åŒ–连接
// åˆå§‹åŒ–连接
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;
}
MysqlConn::~MysqlConn()//释放数据库连接
{
   freeRes(); // é‡Šæ”¾ç»“果集
   if (m_conn != nullptr) {
      mysql_close(m_conn);
      m_conn = nullptr;
   }
}
void MysqlConn::freeRes()//结果集释放
{
   if (m_result) {
      mysql_free_result(m_result);
      m_result = nullptr;
   }
}
bool MysqlConn::connect(const string user, const string passwd, \
   const string dbName, string ip, \
   const unsigned short port)//连接数据库
{
   MYSQL* res = mysql_real_connect(m_conn, ip.c_str(), user.c_str(), \
      passwd.c_str(), dbName.c_str(), port, nullptr, 0);
   // ä¿®æ”¹ç¼–码
   mysql_set_character_set(m_conn, "gb2312");
   return res != nullptr;
}
bool MysqlConn::update(const string sql) const
{
   // æ‰§è¡ŒæˆåŠŸè¿”å›ž0;
   int res = mysql_real_query(m_conn, sql.c_str(), static_cast<unsigned int>(sql.size()));
   if (res != 0) {
      return false; // æç¤º
   }
   return true;
}
bool MysqlConn::query(const string sql)
{
   freeRes();
   int res = mysql_real_query(m_conn, sql.c_str(), static_cast<unsigned int>(sql.size()));
   if (res != 0) {
      return false; // æç¤º
   }
   m_result = mysql_store_result(m_conn);
   return true;
}
bool MysqlConn::getRes()
{
   if (m_result != nullptr) {
      // char** èŽ·å–å•è¡Œè®°å½•
      m_mysqlRow = mysql_fetch_row(m_result);
      if (m_mysqlRow != nullptr) {
         return true;
      }
      freeRes();
   }
   return false;
}
string MysqlConn::getValue(const int fieldIndex) const
{
   int fieldCount = mysql_num_fields(m_result);
   if (fieldIndex >= fieldCount || fieldIndex < 0) {
      return string(); // æç¤º
   }
   char* value = m_mysqlRow[fieldIndex];
   // å¾—到一个保存各字段值长度的数组
   unsigned long* len = mysql_fetch_lengths(m_result);
   unsigned long length = len[fieldIndex];
   // é˜²æ­¢ç»“果中存在\0导致数据丢失
   return string(value, length);
}
bool MysqlConn::selectDB(const string dbName) const
{
   int res = mysql_select_db(m_conn, dbName.c_str());
   if (res != 0) {
      return false;  // æç¤º
   }
   return true;
}
void MysqlConn::backupCurrentDB(const string path)
{
   string sql = "show tables";
   int r = mysql_real_query(m_conn, sql.c_str(), static_cast<unsigned long>(sql.size()));
   if (r != 0) {
      return; // æç¤º
   }
   MYSQL_RES* tableRes = mysql_store_result(m_conn);
   for (int i = 0; i < mysql_num_rows(tableRes); ++i) {
      MYSQL_ROW tableName = mysql_fetch_row(tableRes);
      backupCurrentTable(path, tableName[0]);
   }
}
void MysqlConn::backupCurrentTable(const string path, const string tableName)
{
   string file = path + tableName + ".sql";
   ofstream ofs(file);
   if (!ofs.is_open()) {
      return; // æç¤º
   }
   // è¡¨ç»“构写入
   string showCreate = "show create table " + tableName + ";";
   bool res = query(showCreate);
   if (!res) {
      return; // æç¤º
   }
   if (getRes()) {
      string writeSQL = getValue(1) + ";\n";
      ofs.write(writeSQL.c_str(), writeSQL.size());
      // cout << writeSQL << endl;
   }
   // è¡¨æ•°æ®å†™å…¥
   string sql = "select * from " + tableName + ";";
   res = query(sql);
   if (!res) {
      return; // æç¤º
   }
   while (getRes()) {
      string writeSQL = "insert into `" + tableName + "` values(";
      for (int i = 0; !getValue(i).empty(); ++i) {
         if (i != 0) {
            writeSQL += ",";
         }
         MYSQL_FIELD* valueType = mysql_fetch_field_direct(m_result, i);
         if (valueType->type == MYSQL_TYPE_DECIMAL
            || valueType->type == MYSQL_TYPE_TINY
            || valueType->type == MYSQL_TYPE_SHORT
            || valueType->type == MYSQL_TYPE_LONG
            || valueType->type == MYSQL_TYPE_FLOAT
            || valueType->type == MYSQL_TYPE_DOUBLE
            || valueType->type == MYSQL_TYPE_TIMESTAMP
            || valueType->type == MYSQL_TYPE_LONGLONG
            || valueType->type == MYSQL_TYPE_INT24) {
            writeSQL += getValue(i);
         }
         else {
            writeSQL += "'" + getValue(i) + "'";
         }
      }
      writeSQL += ");\n";
      ofs.write(writeSQL.c_str(), writeSQL.size());
   }
   ofs.close();
}
bool MysqlConn::transaction() const
{
   // å°†äº‹åŠ¡æäº¤è®¾ç½®ä¸ºæ‰‹åŠ¨æäº¤
   return mysql_autocommit(m_conn, false);
}
bool MysqlConn::commit() const
{
   return mysql_commit(m_conn);
}
bool MysqlConn::rollback() const
{
   return mysql_rollback(m_conn);
}
void MysqlConn::refreashAliveTime()
{
   m_alivetime = steady_clock::now();
}
ll MysqlConn::getAliveTime()
{
   // æ¯«ç§’ <<= çº³ç§’:精度降低
   milliseconds res = duration_cast<milliseconds>(steady_clock::now() - m_alivetime);
   return res.count();
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;
    }
}