/** * @file db2_t.cc * @brief * @author Cat (null.null.null@qq.com) * @version 0.1 * @date 2021-07-12 * * Company: Baosight Co. Ltd. * DO NOT COPY/USE WITHOUT PERMISSION * */ #include "mix_cc/sql/database/db2_t.h" #include "mix_cc/utility/read_config.h" #include "nlohmann/json_fwd.hpp" #include #include #include #include #include #include #include #include #include namespace mix_cc { namespace sql { namespace db2 { thread_local SAConnection conn_{}; thread_local size_t conn_count_ = 0; } // namespace db2 db2_t::db2_t() : connect_binded_(false) {} db2_t::~db2_t() { disconnect(); } bool db2_t::connect() { if (!connect_binded_ && db2::conn_.isConnected()) { connect_binded_ = true; db2::conn_count_++; } if (!db2::conn_.isConnected()) { connect_binded_ = true; connect_impl(); } this->cmd_.connect(&db2::conn_); return true; } bool db2_t::connect_impl() { try { auto config_info_maybe = read_config_maybe("utility", "db2"); if(config_info_maybe.is_nothing()) { return false; } auto config_info = config_info_maybe.unsafe_get_just(); db2::conn_.Connect( _TSA(config_info.at("database").get().c_str()), _TSA(config_info.at("username").get().c_str()), _TSA(config_info.at("password").get().c_str()), SAClient_t::SA_DB2_Client); if (!db2::conn_.isConnected()) { throw mix_cc::Exception(-1, "connect failure", BOOST_CURRENT_LOCATION); } return cmd_.connect(&db2::conn_); } catch (const SAException& e) { throw mix_cc::Exception(-1, std::string(e.ErrText().GetMultiByteChars()), BOOST_CURRENT_LOCATION); } return 0; } bool db2_t::disconnect() { connect_binded_ = false; db2::conn_count_--; if (db2::conn_count_ == 0) { db2::conn_.Disconnect(); db2::conn_.Destroy(); } return true; } bool db2_t::is_connected() { return db2::conn_.isConnected(); } bool db2_t::reconnect() { auto tmp_count = db2::conn_count_; db2::conn_count_ = 1; disconnect(); connect(); db2::conn_count_ = tmp_count; return true; } SAConnection* db2_t::get_conn_ptr() { return &db2::conn_; } } // namespace sql } // namespace mix_cc