eis/mix_cc/sql/sqlapi_warpper.h

99 lines
2.7 KiB
C
Raw Normal View History

/**
* @file mix_cc/sql/sqlapi_warpper.h
* @brief SQL API++SQL语句的核心
* @author Cat (null.null.null@qq.com)
* @version 0.1
* @date 2021-09-17
*
* Copyright: Baosight Co. Ltd.
* DO NOT COPY/USE WITHOUT PERMISSION
*
*/
#pragma once
#include <SQLAPI.h>
#include <db2_linux/sql.h>
#include <db2_linux/sqlsystm.h>
#include <boost/type_traits.hpp>
#include <boost/type_index.hpp>
#include <boost/algorithm/string.hpp>
#include "mix_cc/exception.h"
#include "mix_cc/type/mix_time.h"
#include <memory>
#include <string>
namespace mix_cc {
namespace sql {
struct sqlapi_warpper {
public:
struct cmd_t {
protected:
std::unique_ptr<SACommand> cmd_ptr;
public:
cmd_t() { cmd_ptr = std::make_unique<SACommand>(); }
bool connect(SAConnection* conn_ptr) {
cmd_ptr->setConnection(conn_ptr);
return true;
}
~cmd_t() {}
bool execute(std::string command) {
try {
cmd_ptr->setCommandText(_TSA(command.c_str()));
cmd_ptr->Execute();
} catch (const SAException& e) {
throw Exception(-1, e.ErrText().GetMultiByteChars(),
BOOST_CURRENT_LOCATION, {"sql", command});
}
return true;
}
auto is_result_set() { return cmd_ptr->isResultSet(); }
auto rows_affacted() { return cmd_ptr->RowsAffected(); }
auto cancel() { return cmd_ptr->Cancel(); }
auto close() { return cmd_ptr->Close(); }
auto destroy() { return cmd_ptr->Destroy(); }
auto fetch_next() { return cmd_ptr->FetchNext(); }
auto command_text() { return cmd_ptr->CommandText().GetMultiByteChars(); }
template <typename Col>
constexpr auto field(Col) {
auto field_name =
boost::to_upper_copy(std::string(Col::name_type::c_str()));
if constexpr (boost::is_integral<typename Col::value_type>::value) {
return cmd_ptr->Field(field_name.c_str()).asLong();
} else if constexpr (boost::is_float<typename Col::value_type>::value) {
return cmd_ptr->Field(field_name.c_str()).asDouble();
} else if constexpr (std::is_same_v<typename Col::value_type,
std::string>) {
return cmd_ptr->Field(field_name.c_str()).asString();
} else if constexpr (std::is_same_v<typename Col::value_type,
mix_cc::mix_time_t>) {
std::string tmp_time_str =
cmd_ptr->Field(field_name.c_str()).asString().GetMultiByteChars();
if (!tmp_time_str.empty()) {
tmp_time_str.replace(tmp_time_str.find("T"), 1, " ");
}
return mix_cc::mix_time_t{tmp_time_str};
}
}
};
public:
sqlapi_warpper() : cmd_() {}
~sqlapi_warpper() {}
public:
cmd_t cmd_;
};
} // namespace sql
} // namespace mix_cc