安装官方提供的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. (1)MySQL进阶篇在linux环境下安装

    1.概述 对于mysql二进制安装,优点是可以安装到任何路径下,灵活性好,一台服务器可以安装多个mysql.缺点是已经编译过,性能不如源码编译得好,不能灵活定制编译参数.如果用户即不想安装最简单却不够 ...

  2. C++ 11可变参数接口设计在模板编程中应用的一点点总结

    概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量 ...

  3. 2018.11.30 zsh: command not found: mysql 的解决办法mac环境下

    系统环境变量的问题.解决办法: 1.打开终端.输入open .zshrc 会出现一个可编辑文档, 2.找到# User configuration部分,在下一行添加source ~/.bash_pro ...

  4. 安装mysql到服务器的linux环境下

    1·安装mysql 命令:yum -y install httpd php mysql mysql-server 2·配置mysql 配置开机启动服务 /sbin/chkconfig --add my ...

  5. axios无法在ie9,10,11环境下运行的问题解决

    npm install es6-promise --save-dev import promise from 'es6-promise'; promise.polyfill();

  6. Windows环境下Mysql 5.7读写分离之使用mysql-proxy练习篇

    本文使用mysql-proxy软件,结合mysql读写分离,实现实战练习. 前期准备: 三台机器: 代理机,IP:192.168.3.33 mysql Master,IP:192.168.3.32 m ...

  7. 生产环境下lnmp的权限说明

    https://www.cnblogs.com/zrp2013/p/4183546.html 有关权限说明:-rwxrw-r‐-1 root root 1213 Feb 2 09:39 50.html ...

  8. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  9. 【Data Cluster】真机环境下MySQL数据库集群搭建

    真机环境下MySQL-Cluster搭建文档  摘要:本年伊始阶段,由于实验室对不同数据库性能测试需求,才出现MySQL集群搭建.购置主机,交换机,双绞线等一系列准备工作就绪,也就开始集群搭建.起初笔 ...

随机推荐

  1. Scala学习(二)

    二.Scala基础 1.变量:三种修饰符 -> ①val 常亮②var 变量③lazy val 惰性变量求值 2.类型 3.代码块 Block {exp1;exp2} 或 { exp1 exp2 ...

  2. JavaScript的面向对象编程(OOP)(一)——类

    在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的 ...

  3. 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 ...

  4. C语言程序设计入门学习五步曲(转发)

    笔者在从事教学的过程中,听到同学抱怨最多的一句话是:老师,上课我也能听懂,书上的例题也能看明白,可是到自己动手做编程时,却不知道如何下手.发生这种现象的原因有三个: 一.所谓的看懂听明白,只是很肤浅的 ...

  5. Leetcode 详解(Substing without repeats character)

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  6. 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 ...

  7. hdoj 5139Formula

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5139 展开后的:1!*2!*3!*..*n! 后面就好办了- -

  8. Python - twisted web 入门学习之一

    原文地址:http://zhouzhk.iteye.com/blog/765884 python的twisted框架中带了一个web server: twisted web.现在看看怎么用. 一)准备 ...

  9. mysql 自动备份导出到sql

    创建一个sh文件 vi mysql_auto.sh写入如下代码 导出单个数据库 /www/wdlinux/mysql/bin/mysqldump -uroot -p123456 database &g ...

  10. regexxx

    var test={ msg:{ "name":"name","value":"value" }}var str=JSO ...