/** * @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 #include namespace mix_cc { namespace sql { namespace detail { template struct set_t_impl; template struct set_t_impl< PrevStatement, std::enable_if_t, Values...> : public prev_statement_t, 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(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_; }; template struct set_t_impl, Values...> : public prev_statement_t, 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(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 auto where(Conditions... conditions) { return where_t(*this, conditions...); } public: hana::tuple values_; }; } // namespace detail template struct set_t : public detail::set_t_impl { constexpr explicit set_t(PrevStatement prev_st, Values... values) : detail::set_t_impl(prev_st, values...) { } }; } // namespace sql } // namespace mix_cc