#include "MysqlClient.h" #include "common/Utils.h" //#include "Spdlogger.h" #include "Logger.h" MysqlClient::MysqlClient(MysqlOption option) : option_(option) { conn(); } MysqlClient::~MysqlClient() { this->close(); } int MysqlClient::conn() { if (mysql_) { return 0; } mysql_ = mysql_init(nullptr); MYSQL* ret = mysql_real_connect(mysql_, option_.host.c_str(), option_.user.c_str(), option_.password.c_str(), option_.dbname.c_str(), option_.port, NULL, 0); if (ret == NULL) { std::string err = mysql_error(mysql_); //Spdlogger::info("[mysql] connect failed: {}", mysql_error(mysql_)); mysql_ = nullptr; } else { mysql_query(mysql_, "set names 'utf8';"); } return 0; } bool MysqlClient::isConnected() { return (mysql_ != nullptr); } void MysqlClient::close() { if (mysql_) { mysql_close(mysql_); mysql_ = nullptr; } } bool MysqlClient::exec(std::string sql) { if (!mysql_) { XLOGE() << "Mysql exec error, database is not connected."; return false; } if (sql.empty()) { XLOGE() << "Mysql exec error, sql is empty."; return false; } int ret = mysql_query(mysql_, sql.c_str()); if (0 != ret) { XLOGE() << "Mysql exec error: " << mysql_error(mysql_) << ", sql=" << sql; return false; } return true; } bool MysqlClient::exec(std::string sql, vector& result) { result.clear(); bool ret = MysqlClient::exec(sql); if (!ret) { return false; } MYSQL_RES* res = mysql_store_result(mysql_); if (!res) { return false; } vector fieldNames; while (true) { MYSQL_FIELD* field = mysql_fetch_field(res); if (!field) { break; } fieldNames.push_back(field->name); } while (true) { MYSQL_ROW row = mysql_fetch_row(res); if (!row) { break; } Fields rowData; for (size_t i = 0; i < fieldNames.size(); ++i) { string field_text = (row[i] == NULL) ? "" : row[i]; rowData.set(fieldNames[i], field_text); } result.push_back(rowData); } // 释放结果集 mysql_free_result(res); return true; }