eis/mix_cc/sql/database/db2_t.cc

98 lines
2.3 KiB
C++
Raw Normal View History

/**
* @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 <SQLAPI.h>
#include <db2_linux/sql.h>
#include <db2_linux/sqlsystm.h>
#include <boost/algorithm/string.hpp>
#include <algorithm>
#include <cctype>
#include <cstdint>
#include <string>
#include <sstream>
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<std::string>().c_str()),
_TSA(config_info.at("username").get<std::string>().c_str()),
_TSA(config_info.at("password").get<std::string>().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