MySQL - MySQL++在c++11环境下接口设计

安装官方提供的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 }

完整代码参考:https://github.com/binchen-china/DMServer

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏文渊之博

使用SQL Server 扩展事件来创建死锁的时间跟踪

我们通过SQL Server 2012图形界面来部署一个扩展事件跟踪会话。然后可以生成SQL脚本,在2008或2008 R2版本下运行类似的跟踪。 步骤1: 通...

1649
来自专栏杨建荣的学习笔记

Oracle中的PUBLIC(r10笔记第14天)

Oracle中的PUBLIC是一种特殊的存在,总是感觉概念比较模糊,我们就简单通过几个测试来理解吧。 首先我们创建一个public的synonym,我们看看这...

2844
来自专栏乐沙弥的世界

Linux script 命令记录(数据库)操作步骤

    对DBA而言,经常碰到升级数据库或是apply patch,以及有些时候需要运行大量的脚本。对于这些操作我们希望现在在屏幕同时又输出的文件以备后续查询过...

1024
来自专栏Janti

mysql数据库的常用知识

944
来自专栏喵了个咪的博客空间

[喵咪大数据]Hive2搭建和基本操作

[喵咪大数据]Hive2搭建 ? 说到Hadoop生态有一个不得不提的组件那就是<Hive>,Hive是基于Hadoop结构化存储引擎,能够存储海量的数据,Hi...

36010
来自专栏csxiaoyao

mysql 命令完全总结

4127
来自专栏乐沙弥的世界

记一次奇怪的ORA-04028: cannot generate diana for object

      开发人员说新建了一个package,在编译的过程中出现了一些错误。提示为PL/SQL:ORA-00942: table or view does n...

371
来自专栏杨建荣的学习笔记

使用shell脚本快速得到主备关系(r9笔记第93天)

对于备库的使用,尤其是一主多备的环境,一直以来有一点感觉不大给力,那就是主备库的关系,总是感觉会少一点什么。 尤其是在做月度404审计的时候,总是要反复确认备库...

3426
来自专栏白驹过隙

MySQL - MySQL++在c++11环境下接口设计

33810
来自专栏杨建荣的学习笔记

一个看似诡异的Oracle连接问题

我们知道Oracle在启动的时,fork进程会根据ORACLE_SID来创建相关后台进程,而在Unix和Linux系统中,ORACLE SID和ORACL...

3225

扫码关注云+社区