92 lines
2.9 KiB
C++
92 lines
2.9 KiB
C++
/**
|
|
* @file mix_cc/sql/set.h
|
|
* @brief 设值 语句
|
|
* @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 "mix_cc/sql/public.h"
|
|
#include "mix_cc/sql/statement.h"
|
|
#include "mix_cc/sql/where.h"
|
|
#include <algorithm>
|
|
#include <string>
|
|
|
|
namespace mix_cc {
|
|
namespace sql {
|
|
namespace detail {
|
|
|
|
template <typename PrevStatement, typename Enable, typename... Values>
|
|
struct set_t_impl;
|
|
|
|
template <typename PrevStatement, typename... Values>
|
|
struct set_t_impl<
|
|
PrevStatement,
|
|
std::enable_if_t<PrevStatement::s_text == op::cmd_t::insert_into>,
|
|
Values...> : public prev_statement_t<PrevStatement>,
|
|
public statement_t {
|
|
static constexpr auto s_text = op::cmd_t::set;
|
|
constexpr explicit set_t_impl(PrevStatement prev_st, Values... values)
|
|
: prev_statement_t<PrevStatement>(prev_st),
|
|
values_(hana::make_tuple(values...)) {}
|
|
|
|
constexpr auto get_command() {
|
|
std::string op1_str = "VALUES";
|
|
auto col_names =
|
|
hana::transform(values_, [](auto val) { return val.get_col_name(); });
|
|
auto r_str_c = hana::fold_left(
|
|
col_names, [](auto col1, auto col2) { return col1 + "," + col2; });
|
|
auto vals =
|
|
hana::transform(values_, [](auto val) { return val.get_value(); });
|
|
auto r_str_c2 = hana::fold_left(
|
|
vals, [](auto val1, auto val2) { return val1 + "," + val2; });
|
|
return std::string("(") + r_str_c + ")" + op1_str + "(" + r_str_c2 + ")";
|
|
}
|
|
|
|
public:
|
|
hana::tuple<Values...> values_;
|
|
};
|
|
|
|
template <typename PrevStatement, typename... Values>
|
|
struct set_t_impl<PrevStatement,
|
|
std::enable_if_t<PrevStatement::s_text == op::cmd_t::update>,
|
|
Values...> : public prev_statement_t<PrevStatement>,
|
|
public statement_t {
|
|
static constexpr auto s_text = op::cmd_t::set;
|
|
constexpr explicit set_t_impl(PrevStatement prev_st, Values... values)
|
|
: prev_statement_t<PrevStatement>(prev_st),
|
|
values_(hana::make_tuple(values...)) {}
|
|
|
|
constexpr auto get_command() {
|
|
auto vals_str =
|
|
hana::transform(values_, [](auto val) { return val.get_str(); });
|
|
auto r_str_c = hana::fold_left(
|
|
vals_str, [](auto val1, auto val2) { return val1 + "," + val2; });
|
|
return std::string(" ") + s_text.c_str() + " " + r_str_c;
|
|
}
|
|
|
|
template <typename... Conditions>
|
|
auto where(Conditions... conditions) {
|
|
return where_t(*this, conditions...);
|
|
}
|
|
|
|
public:
|
|
hana::tuple<Values...> values_;
|
|
};
|
|
} // namespace detail
|
|
|
|
template <typename PrevStatement, typename... Values>
|
|
struct set_t : public detail::set_t_impl<PrevStatement, void, Values...> {
|
|
constexpr explicit set_t(PrevStatement prev_st, Values... values)
|
|
: detail::set_t_impl<PrevStatement, void, Values...>(prev_st, values...) {
|
|
}
|
|
};
|
|
|
|
} // namespace sql
|
|
|
|
} // namespace mix_cc
|