Linux mysql c API封装

mysql 是目前使用量最大的关系型数据库,在互联网公司应用非常广泛,在一些非高并发场景下应用MySQL能大幅降低开发运维和部署的成本。

下面是自己封装的c++ 风格的MySQL客户端,相对原生的c api 使用相对更加简便一些


/******************************************************
function: mysql c api wrapp for c++ style.
author: liuyi
date: 2016.04.13
version: 1.0
******************************************************/

#ifndef MYSQL_CONNECTOR
#define MYSQL_CONNECTOR

#include 
#include 
#include 
#include 
#include 
using namespace std;

class mysql_connector
{
	public:
		mysql_connector()
		{
		}

		~mysql_connector()
		{
			mysql_close(&m_mysql);
		}

		bool init(const string& host, const string& user, const string& pw, 
				  const string& db, int port=3306, const string& code="utf8")
		{
			m_host = host;
			m_user = user;
			m_pw = pw;
			m_db = db;
			m_port = port;
			m_code = code;
			return NULL != mysql_init(&m_mysql) && connect() && execute_sql(("set names " + m_code).c_str());
		}


		bool reconnect()
		{
			close_connect();
			return connect() && execute_sql(("set names " + m_code).c_str());
		}

		void close_connect()
		{
			mysql_close(&m_mysql);
		}

		bool execute_sql(const string& sql)
		{
			return 0 == mysql_real_query(&m_mysql, sql.c_str(), sql.size());	
		}

		bool select_data(const string& sql, vector >& result_matrix)
		{
			if(!execute_sql(sql))
				return false;
			
			MYSQL_RES *res = mysql_store_result(&m_mysql);
			if(NULL == res)
			{ 
				mysql_free_result(res);
				return false;
			}
			
			int numcols = mysql_num_fields(res);
			MYSQL_ROW row;
			while(row =  mysql_fetch_row(res))
			{
				vector row_vec;
				row_vec.reserve(numcols);
				for(int i = 0; i < numcols; i++)
				{
					row_vec.push_back(row[i]);
				}
				result_matrix.push_back(row_vec);
			}

			mysql_free_result(res);
			return true;
		}

		string get_error_msg()
		{
			char buf[2048] = {0};
			snprintf(buf, 2047, "error_code=%d, error_msg=%s", mysql_errno(&m_mysql), mysql_error(&m_mysql)); 
			return buf;
		}
		
	private:
		bool connect()
		{
			return NULL != mysql_real_connect(&m_mysql, m_host.c_str(), m_user.c_str(), m_pw.c_str(), m_db.c_str(), m_port, NULL, 0);
		}

	private:
		 MYSQL m_mysql;
		 string m_host;
		 string m_user;
		 string m_pw;
		 string m_db;
		 string m_code;
		 int m_port;
};

#endif

#include "mysql_connector.h"

int main(int argc, char* argv[])
{
	mysql_connector conn;
	cout< > v;
	cout<

g++ test_mysql.cpp -L/usr/lib64/mysql -lmysqlclient -lpthread

你可能感兴趣的:(Linux mysql c API封装)