安装官方提供的mysqlconnect后,可以使用mysql++库,在官方的C API上再次做一个c++面向对象封装。
这里mysql++的安装依赖于mysql-connector-c。安装参考:http://dev.mysql.com/doc/connector-c/en/connector-c-installation-source-unix.html
c++11下注意:
1.由于mysql++并没有采用c++11,所以在使用的时候报了一些警告,需要对源码进行修改。
2.在获取字段类型的API在g++编译器下不是非常理想
3.执行sql存在错误时,系统会coredump,注意try语句的使用
下面部分代码:
1 #pragma once 2 #include "mysql++.h" 3 4 #define MYSQL_CFG_FILE "..//..//common//MySQL//config.json" 5 6 7 typedef struct mysql_config 8 { 9 std::string ip; 10 int port; 11 std::string user; 12 std::string passwd; 13 std::string database_name; 14 }mysql_cfg; 15 16 typedef struct mysql_field_information 17 { 18 std::string Field; 19 std::string Type; 20 std::string Null; 21 std::string Key; 22 std::string Default; 23 std::string Extra; 24 }mysql_field_info; 25 26 typedef std::vector<mysql_field_info> mysql_table_info; 27 28 typedef struct mysql_field_data 29 { 30 31 short SHORT; 32 int INTEGER; 33 long long BIGINT; 34 float FLOAT; 35 double DOUBLE; 36 37 std::string DATETIME; 38 39 std::string VARCHAR; 40 }mysql_field; 41 42 typedef std::map<std::string, std::vector<mysql_field>> mysql_table; 43 44 enum mysql_database_info 45 { 46 SHOW_VERISON, 47 SHOW_DATABASES, 48 SHOW_TABLES 49 }; 50 51 class DMMySQL 52 { 53 public: 54 DMMySQL(); 55 ~DMMySQL(); 56 57 void show_databases_info(int flag, std::vector<std::string>& databases); 58 59 bool get_table_desc(std::string table_name, mysql_table_info& table_info); 60 61 bool insert_mysql(std::string sql); 62 63 bool insert_mysql(std::string table_name, std::map<std::string, std::string>& insert_data); 64 65 bool update_mysql(std::string sql); 66 67 bool update_mysql(std::string table_name, std::string field_name, std::string field_value, 68 std::string filter_key, std::string filter_value); 69 70 bool select_mysql(std::string table_name, mysql_table& table_data); 71 72 bool select_mysql(std::string table_name, std::string field_name, std::vector<mysql_field>& field_data); 73 74 bool select_mysql(std::string table_name, std::string field_name, 75 std::string filter_key, std::string filter_value, 76 std::vector<mysql_field>& field_data, std::string filter_opt = "="); 77 78 private: 79 bool load_mysql_config(); 80 81 void init(); 82 83 bool conncet_mysql(); 84 85 void disconnect_mysql(); 86 87 void trans_data_type(std::string input_data, std::string data_type, mysql_field& field_data); 88 89 private: 90 mysql_cfg _mysql_cfg; 91 mysqlpp::Connection _conn; 92 };
1 #include "json/json.h" 2 #include <fstream> 3 #include <ace/Log_Msg.h> 4 #include "DMMySQL.h" 5 #include <cxxabi.h> 6 7 #define TRY_SQL \ 8 try{ 9 10 #define CATCH_SQL_ERROR \ 11 }\ 12 catch(const mysqlpp::BadQuery& error)\ 13 {\ 14 ACE_DEBUG((LM_ERROR,"MySQL Query error:%s!\n",error.what()));\ 15 return false;\ 16 }\ 17 catch (const mysqlpp::BadConversion& error)\ 18 {\ 19 ACE_DEBUG((LM_ERROR,"MySQL Conversion error:%s!\n",error.what()));\ 20 return false;\ 21 }\ 22 catch (const mysqlpp::Exception& error)\ 23 {\ 24 ACE_DEBUG((LM_ERROR,"MySQL Exception error:%s!\n",error.what()));\ 25 return false;\ 26 } 27 28 DMMySQL::DMMySQL() 29 { 30 init(); 31 } 32 33 DMMySQL::~DMMySQL() 34 { 35 disconnect_mysql(); 36 } 37 38 bool DMMySQL::load_mysql_config() 39 { 40 std::ifstream cfg_file; 41 cfg_file.open(MYSQL_CFG_FILE, std::ios::binary); 42 43 if (!cfg_file.is_open()) 44 { 45 return 0; 46 } 47 48 Json::Reader Reader; 49 Json::Value Root; 50 51 if (Reader.parse(cfg_file,Root)) 52 { 53 _mysql_cfg.ip = Root["mysql_ip"].asString(); 54 _mysql_cfg.port = Root["mysql_port"].asInt(); 55 _mysql_cfg.user = Root["mysql_user"].asString(); 56 _mysql_cfg.passwd = Root["mysql_passwd"].asString(); 57 _mysql_cfg.database_name = Root["database_name"].asString(); 58 } 59 else 60 { 61 ACE_DEBUG((LM_ERROR,"parse mysql config file failure!\n")); 62 return false; 63 } 64 65 return true; 66 } 67 68 void DMMySQL::init() 69 { 70 if (load_mysql_config()) 71 { 72 conncet_mysql(); 73 } 74 } 75 76 bool DMMySQL::conncet_mysql() 77 { 78 if (!_conn.connect(_mysql_cfg.database_name.c_str(), _mysql_cfg.ip.c_str(), 79 _mysql_cfg.user.c_str(), _mysql_cfg.passwd.c_str(), _mysql_cfg.port)) 80 { 81 ACE_DEBUG((LM_ERROR,"connect MySQL database failure!\n")); 82 return false; 83 } 84 85 return true; 86 } 87 88 void DMMySQL::show_databases_info(int flag, std::vector<std::string>& databases) 89 { 90 std::string opration; 91 92 switch (flag) 93 { 94 case SHOW_VERISON: 95 { 96 std::string version_info = _conn.client_version(); 97 databases.push_back(version_info); 98 return; 99 } 100 case SHOW_DATABASES: 101 { 102 opration = "show databases"; 103 break; 104 } 105 case SHOW_TABLES: 106 { 107 108 opration = "show tables"; 109 break; 110 } 111 default: 112 { 113 return; 114 } 115 } 116 117 mysqlpp::Query query = _conn.query(opration); 118 if (mysqlpp::StoreQueryResult res = query.store()) 119 { 120 mysqlpp::StoreQueryResult::iterator rit; 121 for (rit = res.begin(); rit != res.end(); ++rit) 122 { 123 databases.push_back((*rit)[0].c_str()); 124 } 125 } 126 } 127 128 bool DMMySQL::get_table_desc(std::string table_name, mysql_table_info& tbl_info) 129 { 130 TRY_SQL 131 std::string opration = "describe " + table_name; 132 mysqlpp::Query query = _conn.query(opration); 133 mysqlpp::StoreQueryResult res = query.store(); 134 135 int field_num = res.size(); 136 for (int i = 0; i < field_num; ++i) 137 { 138 mysql_field_info field_i; 139 140 field_i.Field = res[i]["field"].c_str(); 141 field_i.Type = res[i]["type"].c_str(); 142 field_i.Null = res[i]["null"].c_str(); 143 field_i.Key = res[i]["key"].c_str(); 144 field_i.Default = res[i]["default"].c_str(); 145 field_i.Extra = res[i]["extra"].c_str(); 146 147 tbl_info.push_back(field_i); 148 } 149 CATCH_SQL_ERROR 150 return true; 151 } 152 153 void DMMySQL::disconnect_mysql() 154 { 155 _conn.disconnect(); 156 } 157 158 bool DMMySQL::insert_mysql(std::string sql) 159 { 160 TRY_SQL 161 mysqlpp::Query query = _conn.query(sql); 162 query.execute(); 163 CATCH_SQL_ERROR 164 return true; 165 }