98 lines
2.3 KiB
C++
98 lines
2.3 KiB
C++
|
|
/**
|
||
|
|
* @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
|