New file |
| | |
| | | #include "ConnectMysql.h" |
| | | |
| | | // æé 彿°å®ç°ï¼åå§åæååé |
| | | ConnectMysql::ConnectMysql() |
| | | { |
| | | m_result = nullptr; |
| | | m_mysqlRow = nullptr; |
| | | |
| | | m_conn = mysql_init(nullptr); // åå§åMySQLè¿æ¥å¯¹è±¡ï¼ä¼ å
¥nullpträ¼èªå¨åé
ä¸ä¸ªMYSQL对象 |
| | | if (m_conn == nullptr) |
| | | { |
| | | cout << "åå§å失败" << endl; |
| | | return; |
| | | } |
| | | cout << "åå§åæå" << endl; |
| | | } |
| | | |
| | | // ææå½æ°å®ç°ï¼éæ¾ç»æéåæ°æ®åºè¿æ¥èµæº |
| | | ConnectMysql::~ConnectMysql() |
| | | { |
| | | freeRes();// éæ¾ç»æé |
| | | if (m_conn != nullptr) { |
| | | mysql_close(m_conn); |
| | | m_conn = nullptr; |
| | | cout << "æ°æ®åºè¿æ¥å
³é" << endl; |
| | | } |
| | | } |
| | | |
| | | // éæ¾ç»æéèµæºç彿°å®ç° |
| | | void ConnectMysql::freeRes() |
| | | { |
| | | if (m_result) { |
| | | mysql_free_result(m_result); |
| | | m_result = nullptr; |
| | | } |
| | | } |
| | | |
| | | // ä½¿ç¨ Shell èæ¬å¤ä»½æ°æ®åº |
| | | void ConnectMysql::backupCurrentDBUsingShell(const string path) |
| | | { |
| | | string user = "root"; |
| | | string passwd = "1"; |
| | | string dbName = "AI_datas"; |
| | | string command = "sh backup_script.sh " + user + " " + passwd + " " + dbName + " " + path; |
| | | int result = system(command.c_str()); |
| | | if (result != 0) { |
| | | cerr << "å¤ä»½å¤±è´¥!" << endl;//cerr: è¿æ¯ä¸ä¸ªæ åè¾åºæµï¼ç¨äºè¾åºé误信æ¯. |
| | | } |
| | | } |
| | | |
| | | // è¿æ¥æ°æ®åºç彿°å®ç° |
| | | bool ConnectMysql::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_real_connectè¿æ¥æ°æ®åº |
| | | |
| | | if (res == nullptr) |
| | | { |
| | | cout << "æ°æ®åºè¿æ¥å¤±è´¥" << endl; |
| | | return false; |
| | | } |
| | | cout << "æ°æ®åºè¿æ¥æå" << endl; |
| | | |
| | | if (mysql_set_character_set(m_conn, "GBK")) {// 设置å符é,鲿¢ä¹±ç |
| | | puts("å符é设置é误ï¼"); |
| | | } |
| | | else { |
| | | puts("å符é设置æåï¼"); |
| | | } |
| | | |
| | | return res != nullptr; |
| | | } |
| | | |
| | | // æ§è¡æ´æ°æä½ï¼å¢å æ¹ï¼ç彿°å®ç° |
| | | bool ConnectMysql::update(const string sql) const |
| | | { |
| | | // æ§è¡SQLè¯å¥ï¼æåè¿å0ï¼å¤±è´¥è¿åé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 ConnectMysql::query(const string sql) |
| | | { |
| | | freeRes();// éæ¾ç»æé |
| | | |
| | | int res = mysql_real_query(m_conn, sql.c_str(), static_cast<unsigned int>(sql.size())); // æ§è¡æ¥è¯¢SQLè¯å¥ |
| | | if (res != 0) { |
| | | cout << "æ¥è¯¢å¤±è´¥" << endl; |
| | | return false; |
| | | } |
| | | // è·åæ¥è¯¢ç»æé |
| | | m_result = mysql_store_result(m_conn); |
| | | if (m_result == nullptr) { |
| | | cout << "æ¥è¯¢å¤±è´¥" << endl; |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | // éåæ¥è¯¢ç»æéç彿°å®ç° |
| | | bool ConnectMysql::getRes() |
| | | { |
| | | if (m_result != nullptr) { |
| | | // è·åç»æéä¸çä¸ä¸è¡æ°æ® |
| | | m_mysqlRow = mysql_fetch_row(m_result); |
| | | if (m_mysqlRow != nullptr) { |
| | | return true; |
| | | } |
| | | freeRes(); |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | // è·åç»æé䏿å®å段å¼ç彿°å®ç° |
| | | string ConnectMysql::getValue(const int fieldIndex) const//fieldIndexï¼åæ®µç´¢å¼ |
| | | { |
| | | // è·åç»æéä¸çåæ®µæ°é |
| | | 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);// mysql_fetch_lengths:è·åææå段å¼çé¿åº¦ |
| | | unsigned long length = len[fieldIndex]; |
| | | // 鲿¢æ°æ®ä¸åå¨\0å¯¼è´æ°æ®ä¸¢å¤±ï¼ä½¿ç¨æå®é¿åº¦æé å符串 |
| | | return string(value, length); |
| | | } |
| | | |
| | | // è·åæ¥è¯¢ç»æéç彿°å®ç° |
| | | vector<vector<string>> ConnectMysql::getQueryResults() |
| | | { |
| | | vector<vector<string>> results; |
| | | if (m_result != nullptr) |
| | | { |
| | | int num_fields = mysql_num_fields(m_result); |
| | | while ((m_mysqlRow = mysql_fetch_row(m_result))) |
| | | { |
| | | vector<string> row;//vector<string> 代表ä¸è¡æ¥è¯¢ç»æ |
| | | for (int i = 0; i < num_fields; ++i) |
| | | { |
| | | if (m_mysqlRow[i] != nullptr) |
| | | { |
| | | row.push_back(m_mysqlRow[i]); |
| | | } |
| | | else |
| | | { |
| | | row.push_back(""); // å¤ç NULL å¼ |
| | | } |
| | | } |
| | | results.push_back(row); |
| | | } |
| | | } |
| | | return results; |
| | | } |
| | | |
| | | //// åæ¢æ°æ®åºç彿°å®ç° |
| | | //bool ConnectMysql::selectDB(const string dbName) const |
| | | //{ |
| | | // // æ§è¡åæ¢æ°æ®åºçæä½ |
| | | // int res = mysql_select_db(m_conn, dbName.c_str()); |
| | | // if (res != 0) { |
| | | // return false; |
| | | // } |
| | | // return true; |
| | | //} |
| | | |
| | | //// åå»ºæ°æ®åºç彿°å®ç° |
| | | //bool ConnectMysql::createDB(const string dbName) const |
| | | //{ |
| | | // // æ¼æ¥åå»ºæ°æ®åºçSQLè¯å¥ |
| | | // string sql = "create database " + dbName + ";"; |
| | | // // æ§è¡åå»ºæ°æ®åºçSQLè¯å¥ |
| | | // int res = mysql_real_query(m_conn, sql.c_str(), static_cast<unsigned long>(sql.size())); |
| | | // if (res != 0) { |
| | | // return false; |
| | | // } |
| | | // return true; |
| | | //} |
| | | |
| | | // å¤ä»½å½åæ°æ®åºç彿°å®ç° |
| | | void ConnectMysql::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 ConnectMysql::backupCurrentTable(const string path, const string tableName) |
| | | { |
| | | // æ¼æ¥å¤ä»½è¡¨çæä»¶å |
| | | string file = path + tableName + ".sql"; |
| | | // æå¼æä»¶ç¨äºåå
¥ |
| | | ofstream ofs(file); |
| | | if (!ofs.is_open()) { |
| | | cout << "æä»¶æå¼å¤±è´¥!" << endl; |
| | | return; |
| | | } |
| | | // åå
¥è¡¨ç»æ |
| | | string showCreate = "show create table " + tableName + ";";//show create table: æ¥çè¡¨ç»æ |
| | | bool res = query(showCreate); |
| | | if (!res) { |
| | | return; |
| | | } |
| | | if (getRes()) { |
| | | string writeSQL = getValue(1) + ";\n"; |
| | | ofs.write(writeSQL.c_str(), writeSQL.size()); |
| | | } |
| | | // åå
¥è¡¨æ°æ® |
| | | 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 |
| | | || valueType->type == MYSQL_TYPE_BOOL) {//å°æ°ï¼æ´æ°ï¼æµ®ç¹æ°ï¼æ¶é´ï¼é¿æ´æ°ï¼çæ´æ°ï¼å¸å°å¼ |
| | | writeSQL += getValue(i); |
| | | } |
| | | else { |
| | | writeSQL += "'" + getValue(i) + "'"; |
| | | } |
| | | } |
| | | writeSQL += ");\n"; |
| | | ofs.write(writeSQL.c_str(), writeSQL.size()); |
| | | } |
| | | ofs.close(); |
| | | } |
| | | |
| | | // å¼å¯äºå¡ç彿°å®ç° |
| | | bool ConnectMysql::transaction() const |
| | | { |
| | | // å°äºå¡æäº¤è®¾ç½®ä¸ºæå¨æäº¤ï¼å¼å¯äºå¡ |
| | | return mysql_autocommit(m_conn, false); |
| | | } |
| | | |
| | | // æäº¤äºå¡ç彿°å®ç° |
| | | bool ConnectMysql::commit() const |
| | | { |
| | | // æäº¤äºå¡ |
| | | return mysql_commit(m_conn); |
| | | } |
| | | |
| | | // åæ»äºå¡ç彿°å®ç° |
| | | bool ConnectMysql::rollback() const |
| | | { |
| | | // åæ»äºå¡ |
| | | return mysql_rollback(m_conn); |
| | | } |
| | | |
| | | // å·æ°è¿æ¥åæ´»èµ·å§æ¶é´ç¹ç彿°å®ç° |
| | | void ConnectMysql::refreashAliveTime() |
| | | { |
| | | // æ´æ°è¿æ¥åæ´»èµ·å§æ¶é´ç¹ |
| | | m_alivetime = std::chrono::steady_clock::now();// è·åå½åæ¶é´ç¹ |
| | | } |
| | | |
| | | // è·åè¿æ¥åæ´»æ¶é¿ç彿°å®ç° |
| | | ll ConnectMysql::getAliveTime() |
| | | { |
| | | // 计ç®è¿æ¥åæ´»æ¶é¿ï¼è½¬æ¢ä¸ºæ¯«ç§ |
| | | auto now = std::chrono::steady_clock::now(); |
| | | std::chrono::duration<long long, std::milli> res = std::chrono::duration_cast<std::chrono::milliseconds>(now - m_alivetime); |
| | | return res.count(); |
| | | } |