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语句的使用
下面部分代码:
#pragma once
#include "mysql++.h" #define MYSQL_CFG_FILE "..//..//common//MySQL//config.json" typedef struct mysql_config
{
std::string ip;
int port;
std::string user;
std::string passwd;
std::string database_name;
}mysql_cfg; typedef struct mysql_field_information
{
std::string Field;
std::string Type;
std::string Null;
std::string Key;
std::string Default;
std::string Extra;
}mysql_field_info; typedef std::vector<mysql_field_info> mysql_table_info; typedef struct mysql_field_data
{ short SHORT;
int INTEGER;
long long BIGINT;
float FLOAT;
double DOUBLE; std::string DATETIME; std::string VARCHAR;
}mysql_field; typedef std::map<std::string, std::vector<mysql_field>> mysql_table; enum mysql_database_info
{
SHOW_VERISON,
SHOW_DATABASES,
SHOW_TABLES
}; class DMMySQL
{
public:
DMMySQL();
~DMMySQL(); void show_databases_info(int flag, std::vector<std::string>& databases); bool get_table_desc(std::string table_name, mysql_table_info& table_info); bool insert_mysql(std::string sql); bool insert_mysql(std::string table_name, std::map<std::string, std::string>& insert_data); bool update_mysql(std::string sql); bool update_mysql(std::string table_name, std::string field_name, std::string field_value,
std::string filter_key, std::string filter_value); bool select_mysql(std::string table_name, mysql_table& table_data); bool select_mysql(std::string table_name, std::string field_name, std::vector<mysql_field>& field_data); bool select_mysql(std::string table_name, std::string field_name,
std::string filter_key, std::string filter_value,
std::vector<mysql_field>& field_data, std::string filter_opt = "="); private:
bool load_mysql_config(); void init(); bool conncet_mysql(); void disconnect_mysql(); void trans_data_type(std::string input_data, std::string data_type, mysql_field& field_data); private:
mysql_cfg _mysql_cfg;
mysqlpp::Connection _conn;
};
#include "json/json.h"
#include <fstream>
#include <ace/Log_Msg.h>
#include "DMMySQL.h"
#include <cxxabi.h> #define TRY_SQL \
try{ #define CATCH_SQL_ERROR \
}\
catch(const mysqlpp::BadQuery& error)\
{\
ACE_DEBUG((LM_ERROR,"MySQL Query error:%s!\n",error.what()));\
return false;\
}\
catch (const mysqlpp::BadConversion& error)\
{\
ACE_DEBUG((LM_ERROR,"MySQL Conversion error:%s!\n",error.what()));\
return false;\
}\
catch (const mysqlpp::Exception& error)\
{\
ACE_DEBUG((LM_ERROR,"MySQL Exception error:%s!\n",error.what()));\
return false;\
} DMMySQL::DMMySQL()
{
init();
} DMMySQL::~DMMySQL()
{
disconnect_mysql();
} bool DMMySQL::load_mysql_config()
{
std::ifstream cfg_file;
cfg_file.open(MYSQL_CFG_FILE, std::ios::binary); if (!cfg_file.is_open())
{
return ;
} Json::Reader Reader;
Json::Value Root; if (Reader.parse(cfg_file,Root))
{
_mysql_cfg.ip = Root["mysql_ip"].asString();
_mysql_cfg.port = Root["mysql_port"].asInt();
_mysql_cfg.user = Root["mysql_user"].asString();
_mysql_cfg.passwd = Root["mysql_passwd"].asString();
_mysql_cfg.database_name = Root["database_name"].asString();
}
else
{
ACE_DEBUG((LM_ERROR,"parse mysql config file failure!\n"));
return false;
} return true;
} void DMMySQL::init()
{
if (load_mysql_config())
{
conncet_mysql();
}
} bool DMMySQL::conncet_mysql()
{
if (!_conn.connect(_mysql_cfg.database_name.c_str(), _mysql_cfg.ip.c_str(),
_mysql_cfg.user.c_str(), _mysql_cfg.passwd.c_str(), _mysql_cfg.port))
{
ACE_DEBUG((LM_ERROR,"connect MySQL database failure!\n"));
return false;
} return true;
} void DMMySQL::show_databases_info(int flag, std::vector<std::string>& databases)
{
std::string opration; switch (flag)
{
case SHOW_VERISON:
{
std::string version_info = _conn.client_version();
databases.push_back(version_info);
return;
}
case SHOW_DATABASES:
{
opration = "show databases";
break;
}
case SHOW_TABLES:
{ opration = "show tables";
break;
}
default:
{
return;
}
} mysqlpp::Query query = _conn.query(opration);
if (mysqlpp::StoreQueryResult res = query.store())
{
mysqlpp::StoreQueryResult::iterator rit;
for (rit = res.begin(); rit != res.end(); ++rit)
{
databases.push_back((*rit)[].c_str());
}
}
} bool DMMySQL::get_table_desc(std::string table_name, mysql_table_info& tbl_info)
{
TRY_SQL
std::string opration = "describe " + table_name;
mysqlpp::Query query = _conn.query(opration);
mysqlpp::StoreQueryResult res = query.store(); int field_num = res.size();
for (int i = ; i < field_num; ++i)
{
mysql_field_info field_i; field_i.Field = res[i]["field"].c_str();
field_i.Type = res[i]["type"].c_str();
field_i.Null = res[i]["null"].c_str();
field_i.Key = res[i]["key"].c_str();
field_i.Default = res[i]["default"].c_str();
field_i.Extra = res[i]["extra"].c_str(); tbl_info.push_back(field_i);
}
CATCH_SQL_ERROR
return true;
} void DMMySQL::disconnect_mysql()
{
_conn.disconnect();
} bool DMMySQL::insert_mysql(std::string sql)
{
TRY_SQL
mysqlpp::Query query = _conn.query(sql);
query.execute();
CATCH_SQL_ERROR
return true;
}
完整代码参考:https://github.com/binchen-china/DMServer
MySQL - MySQL++在c++11环境下接口设计的更多相关文章
- (1)MySQL进阶篇在linux环境下安装
1.概述 对于mysql二进制安装,优点是可以安装到任何路径下,灵活性好,一台服务器可以安装多个mysql.缺点是已经编译过,性能不如源码编译得好,不能灵活定制编译参数.如果用户即不想安装最简单却不够 ...
- C++ 11可变参数接口设计在模板编程中应用的一点点总结
概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...
- 2018.11.30 zsh: command not found: mysql 的解决办法mac环境下
系统环境变量的问题.解决办法: 1.打开终端.输入open .zshrc 会出现一个可编辑文档, 2.找到# User configuration部分,在下一行添加source ~/.bash_pro ...
- 安装mysql到服务器的linux环境下
1·安装mysql 命令:yum -y install httpd php mysql mysql-server 2·配置mysql 配置开机启动服务 /sbin/chkconfig --add my ...
- axios无法在ie9,10,11环境下运行的问题解决
npm install es6-promise --save-dev import promise from 'es6-promise'; promise.polyfill();
- Windows环境下Mysql 5.7读写分离之使用mysql-proxy练习篇
本文使用mysql-proxy软件,结合mysql读写分离,实现实战练习. 前期准备: 三台机器: 代理机,IP:192.168.3.33 mysql Master,IP:192.168.3.32 m ...
- 生产环境下lnmp的权限说明
https://www.cnblogs.com/zrp2013/p/4183546.html 有关权限说明:-rwxrw-r‐-1 root root 1213 Feb 2 09:39 50.html ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- 【Data Cluster】真机环境下MySQL数据库集群搭建
真机环境下MySQL-Cluster搭建文档 摘要:本年伊始阶段,由于实验室对不同数据库性能测试需求,才出现MySQL集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...
随机推荐
- IT求职中,笔试、面试的算法准备
PS:此文章为转载,源地址:http://www.newsmth.net/nForum/#!article/CoderInterview/849 作者应该是在美国进行的笔试面试,感觉面试的的公 ...
- c#实现远程操作svn
/// <summary> /// 本地svn服务器地址 /// </summary> private static string localSVN = Configurati ...
- Oracle连接数据库的封装类OracleDB
import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.S ...
- QT 做软件盘
最近搞了一个组织细胞脱水机项目,当然,对于国内的项目都是仿来仿去的,我们也不例外,开启被仿机器后,第一个看到的界面就是用户登录界面,需要输入中文,作为一个程序员,我的第一反应就是我需要采用什么用的框架 ...
- 关于StatusStrip控件和StatusBar控件的小试
今天,在网上查找资料,突然看到一个例子,但例子中提及的StatusBar控件,我发现在vs控件压根不存在,我就郁闷了,于是上网查找才知道,现在这个控件已经被StatusStrip控件给吞了,Statu ...
- 通过GET方法返回定义的任意对象
package util; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputSt ...
- c++学习笔记2
T: 1.默认实参只能声明一次: 设计含有默认实参的函数时,要合理设置形参的顺序 :局部变量不能作为默认实参 2.内联机制用于优化规模较小.流程直接.频繁调用的函数 3.constexpr函数 返 ...
- 两台装有Ubuntu系统的服务器搭建VPN(一台为本地服务器,另一台为云服务器)
我们搭建VPN采用的是openvpn,搭建过程总体需要经过三大步骤: 1.openvpn的安装与配置 2.端口转发 3.系统重启iptables规则自动生效 注意:以下所有名令在ro ...
- js函数自动执行的一点理解
//声明一个匿名函数并赋值给一个变量 var a = function(){ console.log("executing..."); } //匿名函数调用 a(); 相信上面这段 ...
- 节点操作js jQuery
append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插入内容 functi ...