Search code examples
c++mysqlmysql-connector

How to init MYSQL correctly


I wrote a server using cpp to connect mysql with libmysqlclient.a, codes are like this:

#ifndef __IVC_MYSQLAPI_H__
#define __IVC_MYSQLAPI_H__

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <mysql.h>
#include <string.h>
#include <vector>

using namespace std;

class ConnMysql {
public:
    ConnMysql();
    ~ConnMysql();
    int connInit(const char* host,int port,const char* user,const char* password,const char* database);
    int executeSql(const char* sql, std::vector<std::string> &v);
    void close();

private:
    MYSQL *sock;
    MYSQL  *my_sql;
};

ConnMysql::ConnMysql(){

}

ConnMysql::~ConnMysql(){

}

int ConnMysql::connInit(const char* host,int port,const char* user,const char* password,const char* database){
    my_sql = mysql_init(NULL);
    if (my_sql == NULL) {
        fprintf(stderr, "Init failed\n");
        return -1;
    }

    sock = mysql_real_connect(my_sql, host,
                user, password, database, port, NULL, CLIENT_MULTI_STATEMENTS);
    
    if (sock < 0) {
        return -1;
    }
}

int ConnMysql::executeSql(const char* sql, std::vector<std::string> &v) {
    mysql_query(sock, sql);
    MYSQL_RES *res_ptr;
    res_ptr = mysql_store_result(sock);
    if(res_ptr == nullptr) {   
        printf("Get data from mysql failed\n");            
        return -1;
    }  
    MYSQL_ROW sqlrow;
    int j = mysql_num_fields(res_ptr);          
    while((sqlrow = mysql_fetch_row(res_ptr))) {
        v.push_back(std::string(sqlrow[0]));
    }

    return 0;
}

void ConnMysql::close() {
    mysql_close(sock);
    sock=NULL;
    my_sql = NULL;
}

#endif //__IVC_MYSQLAPI_H__

The method called like this:

ConnMysql connsql = ConnMysql{};
fprintf(stderr, "begin to init\n");
if (connsql.connInit(ip, port, username, pwd, database) < 0) {
    fprintf(stderr, "mysql init return failed\n");
    return -1;
}

std::string sql = "select env_code from env_codes where env_type = 1";
connsql.executeSql(sql.c_str(), v);
for (int len=0; len < v.size(); len++) {
    fprintf(stderr, "get: %s\n", v[len].c_str());
}
connsql.close();

I will get error suchInit failed occasionally, not always. My questions are

  1. Is there any wrong with my codes? Forget to release something?
  2. How can get the reason why mysql init failed?

Solution

  • I changed mysql_real_connect like this

    if(mysql_real_connect(my_sql, host,
                    user, password, database, port, NULL, CLIENT_MULTI_STATEMENTS) == NULL) 
    {
        return -1;
    }
    

    and delete MYSQL *sock parameter, and changed sock to my_sql, such as mysql_query(sock, sql) to mysql_query(my_sql, sql). It seems workable.