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
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.