From e21b38901b6b7f42604880ce9775841349ff7efe Mon Sep 17 00:00:00 2001 From: rbock Date: Fri, 15 Aug 2014 17:54:33 +0200 Subject: [PATCH] Added static_assert for required_columns in insert This constraint had been dropped by accident when restructuring for statement_t. --- include/sqlpp11/insert_value_list.h | 27 +++++++++++++++++++++++++++ tests/InsertTest.cpp | 18 +++++++++--------- tests/ResultTest.cpp | 2 +- 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/include/sqlpp11/insert_value_list.h b/include/sqlpp11/insert_value_list.h index 05bd92c8..7c5be7ce 100644 --- a/include/sqlpp11/insert_value_list.h +++ b/include/sqlpp11/insert_value_list.h @@ -38,6 +38,24 @@ namespace sqlpp { + namespace detail + { + template + struct first_arg_impl + { + static_assert(wrong_t::value, "At least one argument required"); + }; + + template + struct first_arg_impl + { + using type = T; + }; + + template + using first_arg_t = typename first_arg_impl::type; + } + struct insert_default_values_data_t {}; @@ -337,6 +355,11 @@ namespace sqlpp auto columns(Args... args) -> _new_statement_t> { + static_assert(sizeof...(Args), "at least one column expression required in columns()"); + using _table = typename detail::first_arg_t::_table; + using required_columns = typename _table::_required_insert_columns; + using columns = detail::make_type_set_t; + static_assert(detail::is_subset_of::value, "At least one required column is missing in columns()"); return { *static_cast(this), column_list_data_t{args...} }; } @@ -345,6 +368,10 @@ namespace sqlpp -> _new_statement_t> { static_assert(sizeof...(Assignments), "at least one assignment expression required in set()"); + using _table = typename detail::first_arg_t::_lhs_t::_table; + using required_columns = typename _table::_required_insert_columns; + using columns = detail::make_type_set_t; + static_assert(detail::is_subset_of::value, "At least one required column is missing in set()"); return _set_impl(assignments...); } diff --git a/tests/InsertTest.cpp b/tests/InsertTest.cpp index aae6103f..a8dfe96c 100644 --- a/tests/InsertTest.cpp +++ b/tests/InsertTest.cpp @@ -54,16 +54,16 @@ int main() } db(insert_into(t).default_values()); - db(insert_into(t).set(t.beta = "kirschauflauf")); + db(insert_into(t).set(t.gamma = true, t.beta = "kirschauflauf")); serialize(insert_into(t).default_values(), printer).str(); serialize(insert_into(t), printer).str(); - serialize(insert_into(t).set(t.beta = "kirschauflauf"), printer).str(); - serialize(insert_into(t).columns(t.beta), printer).str(); - auto multi_insert = insert_into(t).columns(t.beta, t.delta); - multi_insert.values.add(t.beta = "cheesecake", t.delta = 1); - multi_insert.values.add(t.beta = sqlpp::default_value, t.delta = sqlpp::default_value); + serialize(insert_into(t).set(t.gamma = true, t.beta = "kirschauflauf"), printer).str(); + serialize(insert_into(t).columns(t.gamma, t.beta), printer).str(); + auto multi_insert = insert_into(t).columns(t.gamma, t.beta, t.delta); + multi_insert.values.add(t.gamma = true, t.beta = "cheesecake", t.delta = 1); + multi_insert.values.add(t.gamma = sqlpp::default_value, t.beta = sqlpp::default_value, t.delta = sqlpp::default_value); auto i = dynamic_insert_into(db, t).dynamic_set(); i.insert_list.add(t.beta = "kirschauflauf"); printer.reset(); @@ -72,9 +72,9 @@ int main() db(multi_insert); - db(insert_into(t).set(t.delta = sqlpp::verbatim("17+4"))); - db(insert_into(t).set(t.delta = sqlpp::null)); - db(insert_into(t).set(t.delta = sqlpp::default_value)); + db(insert_into(t).set(t.gamma = true, t.delta = sqlpp::verbatim("17+4"))); + db(insert_into(t).set(t.gamma = true, t.delta = sqlpp::null)); + db(insert_into(t).set(t.gamma = true, t.delta = sqlpp::default_value)); return 0; } diff --git a/tests/ResultTest.cpp b/tests/ResultTest.cpp index edae0437..7add38fa 100644 --- a/tests/ResultTest.cpp +++ b/tests/ResultTest.cpp @@ -61,7 +61,7 @@ int main() { std::cerr << sub.alpha << std::endl; } - db(insert_into(t).set(t.beta = row.beta)); + db(insert_into(t).set(t.beta = row.beta, t.gamma = false)); } sqlpp::select((t.alpha + 1).as(t.alpha)).flags(sqlpp::all).from(t);