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集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...
随机推荐
- PLL输出怎么不能配置成我想要的时钟
如下图,我的clk_out7想配置成160M,十几输出变为了150M
- 查看APK中MD5签名的方法
(需下载jdk) 1. 先将apk文件重命名为zip文件 2. 解压zip,其中的META-INF/CERT.RSA文件即MD5签名文件 3. cmd下打开黑窗口,敲入如下命令: keytool -p ...
- 关于nginx反向代理后获取不到客户端的真实ip地址问题
前段时间在我的网站上用nginx做了一下反向代理,最近发现不能获取客户端ip了,都是拿到的127.0.0.1的本地ip... 通过查资料后,再去看了看我的配置文件,结果发现我没有如下配置: nginx ...
- Java8之——简洁优雅的Lambda表达式
Java8发布之后,Lambda表达式,Stream等等之类的字眼边慢慢出现在我们字眼.就像是Java7出现了之后,大家看到了“钻石语法”,看到了try-with-resource等等.面对这些新东西 ...
- Oracle 游标
游标的简介 游标的概念 游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作 ...
- 基于事件的异步模式(EAP)
什么是EAP异步编程模式 EAP基于事件的异步模式是.net 2.0提出来的,实现了基于事件的异步模式的类将具有一个或者多个以Async为后缀的方法和对应的Completed事件,并且这些类都支持异步 ...
- winform flash
1.开发工具:VS2013 2.开发环境:win 10 64位 3.添加控件: 打开VS,点击工具箱--常规--右键--“选择项”---“Com组件”--MacroMedia Flash Factor ...
- 伪静态重写模块rewrite.dll及httpd.ini文件参考下载
伪静态重写模块rewrite.dll及httpd.ini文件参考下载 http://www.ledaokj.com/download/rewrite.rar 服务器端开启伪静态,可以查看以下文章< ...
- IE9以下 placeholder兼容
//input placeholder兼容!(function ($, doc, win) { $.fn.placeholder = function () { var i = doc.createE ...
- 深入浅出MFC[摘记]
1.Windows程序的运行本质:基于消息,事件驱动(Message Based,Event Driven).2.程序调用GetMessage API循环获取消息,程序的生命靠它来推动. MSG ms ...