zoukankan      html  css  js  c++  java
  • MySQL

    安装官方提供的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!
    ",error.what()));
     15     return false;
     16 }
     17 catch (const mysqlpp::BadConversion& error)
     18 {
     19     ACE_DEBUG((LM_ERROR,"MySQL Conversion error:%s!
    ",error.what()));
     20     return false;
     21 }
     22 catch (const mysqlpp::Exception& error)
     23 {
     24     ACE_DEBUG((LM_ERROR,"MySQL Exception error:%s!
    ",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!
    "));    
     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!
    "));    
     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

  • 相关阅读:
    JMeter 压测基础(四)——Java工程测试
    Docker 实战(二)——centos7镜像安装nginx,将安装nginx的centos容器生成新的镜像,并导出
    JMeter压测基础(三)——Mysql数据库
    Jmeter压测基础(二)——Badboy功能、Jmeter参数化、检查点、集合点、动态关联、图形监控
    API 自动化框架
    Python Flask Restful
    【19】Grafana添加Zabbix为数据源
    【18】使用公共邮箱发送邮件
    xls格式转化为txt格式
    【17】自动发现磁盘脚本
  • 原文地址:https://www.cnblogs.com/binchen-china/p/5813638.html
Copyright © 2011-2022 走看看