240717班级,工业化控制系统,煤矿相关行业,昆仑系统
congmu
2024-11-07 39a14bc7e206fbfa93bde1677b9fc26487bd8c3b
Server/ÍõçûÔª/code/MysqlConn.cpp
@@ -1,37 +1,60 @@
#include "stdafx.h"
#include "MysqlConn.h"
#include <regex>
// åˆå§‹åŒ–连接
// åˆå§‹åŒ–连接
MysqlConn::MysqlConn() {
    mysql_ = mysql_init(mysql_);
    m_mysql = mysql_init(nullptr);
    if (!m_mysql) {
        cout << "Failed to initialize MySQL." << endl;
        return;
    }
    // è®¾ç½®å­—符集
    if (mysql_) mysql_set_character_set(mysql_, "gbk");
    if (m_mysql) mysql_set_character_set(m_mysql, "gbk");
    // ä½¿ç”¨å†™æ­»çš„参数连接数据库
    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_
    m_row = nullptr;
    m_res = nullptr;
}
bool MysqlConn::isConnected() {
    return m_mysql != nullptr;
}
// è¿žæŽ¥æ•°æ®åº“
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() {
//    string ip = "127.0.0.1";
//    string userName = "root";
//    string passwd = "123456";
//    string db = "mayi_kunlun";
//    int port = 3306;
//    m_mysql = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0);
//    if (!m_mysql) {
//        return false;
//    }
//    return true;
//}
// é‡Šæ”¾èµ„源
MysqlConn::~MysqlConn() {
    if (mysql_) {
        mysql_close(mysql_);
        mysql_ = nullptr;
    if (m_mysql) {
        mysql_close(m_mysql);
        m_mysql = nullptr;
    }
    freeRes();
}
// æ›´æ–°æ•°æ®
bool MysqlConn::update(std::string sql) {
bool MysqlConn::update(string sql) {
    // å‚数化查询优化后的安全检查
    MYSQL_STMT* stmt = mysql_stmt_init(mysql_);
    MYSQL_STMT* stmt = mysql_stmt_init(m_mysql);
    if (!stmt) {
        return false;
    }
@@ -53,11 +76,36 @@
    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;
    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(std::string sql) {
bool MysqlConn::query(string sql) {
    freeRes();
    // å‚数化查询优化后的安全检查
    MYSQL_STMT* stmt = mysql_stmt_init(mysql_);
    MYSQL_STMT* stmt = mysql_stmt_init(m_mysql);
    if (!stmt) {
        return false;
    }
@@ -75,8 +123,8 @@
        mysql_stmt_close(stmt);
        return false;
    }
    res_ = mysql_stmt_result_metadata(stmt);
    if (!res_) {
    m_res = mysql_stmt_result_metadata(stmt);
    if (!m_row) {
        mysql_stmt_close(stmt);
        return false;
    }
@@ -86,59 +134,60 @@
// å¾—到结果集
bool MysqlConn::getResult() {
    if (res_) {
        row_ = mysql_fetch_row(res_);
        if (row_) return true;
    if (m_row) {
        m_row = mysql_fetch_row(m_res);
        if (m_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("");
string MysqlConn::getField(int index) {
    int cols = mysql_num_fields(m_res);
    if (!m_res || index >= cols || index < 0) return string("");
    char* value = row_[index];
    unsigned long len = mysql_fetch_lengths(res_)[index];
    return std::string(value, len);
    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(mysql_, false);
    return mysql_autocommit(m_mysql, false);
}
// æäº¤äº‹åŠ¡
bool MysqlConn::commit() {
    return mysql_commit(mysql_);
    return mysql_commit(m_mysql);
}
// äº‹åŠ¡å›žæ»š
bool MysqlConn::rollback() {
    return mysql_rollback(mysql_);
    return mysql_rollback(m_mysql);
}
void MysqlConn::refreshActiveTime() {
    activeTime_ = std::chrono::steady_clock::now();
    m_activeTime = chrono::steady_clock::now();
}
long long MysqlConn::getActiveTime() {
    // çº³ç±³
    std::chrono::nanoseconds nased = std::chrono::steady_clock::now() - activeTime_;
    chrono::nanoseconds nased = chrono::steady_clock::now() - m_activeTime;
    // è½¬æ¢æˆæ¯«ç±³
    std::chrono::microseconds millsed = std::chrono::duration_cast<std::chrono::microseconds>(nased);
    chrono::microseconds millsed = chrono::duration_cast<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 string& sql) {
    regex dangerousPattern(".*(['\";\\-+=]).*");
    return!regex_search(sql, dangerousPattern);
}
void MysqlConn::freeRes() {
    if (res_) {
        mysql_free_result(res_);
        res_ = nullptr;
    if (m_res) {
        mysql_free_result(m_res);
        m_res = nullptr;
    }
}