eis/mix_cc/sql/sqlapi_warpper.h

99 lines
2.7 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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