1 #include "json/json.h"
2 #include
3 #include
4 #include "DMMySQL.h"
5 #include
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!\n",error.what()));\15 return false;\16 }\17 catch (const mysqlpp::BadConversion&error)\18 {\19 ACE_DEBUG((LM_ERROR,"MySQL Conversion error:%s!\n",error.what()));\20 return false;\21 }\22 catch (const mysqlpp::Exception&error)\23 {\24 ACE_DEBUG((LM_ERROR,"MySQL Exception error:%s!\n",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 boolDMMySQL::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!\n"));62 return false;63 }64
65 return true;66 }67
68 voidDMMySQL::init()69 {70 if(load_mysql_config())71 {72 conncet_mysql();73 }74 }75
76 boolDMMySQL::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!\n"));82 return false;83 }84
85 return true;86 }87
88 void DMMySQL::show_databases_info(int flag, std::vector<:string>&databases)89 {90 std::stringopration;91
92 switch(flag)93 {94 caseSHOW_VERISON:95 {96 std::string version_info =_conn.client_version();97 databases.push_back(version_info);98 return;99 }100 caseSHOW_DATABASES:101 {102 opration = "show databases";103 break;104 }105 caseSHOW_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_SQL131 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_ERROR150 return true;151 }152
153 voidDMMySQL::disconnect_mysql()154 {155 _conn.disconnect();156 }157
158 bool DMMySQL::insert_mysql(std::stringsql)159 {160 TRY_SQL161 mysqlpp::Query query =_conn.query(sql);162 query.execute();163 CATCH_SQL_ERROR164 return true;165 }