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集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...
随机推荐
- Scala学习(二)
二.Scala基础 1.变量:三种修饰符 -> ①val 常亮②var 变量③lazy val 惰性变量求值 2.类型 3.代码块 Block {exp1;exp2} 或 { exp1 exp2 ...
- JavaScript的面向对象编程(OOP)(一)——类
在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的 ...
- CentOS下升级python2.7.10过程记录
1.准备好一份Python2.7.10源码包,下载地址: http://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz 2.安装Python2.7 ...
- C语言程序设计入门学习五步曲(转发)
笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...
- Leetcode 详解(Substing without repeats character)
Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...
- Fake chat script for website download
Are you searching for free fake webchat script then you are at the right place go get download your ...
- hdoj 5139Formula
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5139 展开后的:1!*2!*3!*..*n! 后面就好办了- -
- Python - twisted web 入门学习之一
原文地址:http://zhouzhk.iteye.com/blog/765884 python的twisted框架中带了一个web server: twisted web.现在看看怎么用. 一)准备 ...
- mysql 自动备份导出到sql
创建一个sh文件 vi mysql_auto.sh写入如下代码 导出单个数据库 /www/wdlinux/mysql/bin/mysqldump -uroot -p123456 database &g ...
- regexxx
var test={ msg:{ "name":"name","value":"value" }}var str=JSO ...