diff --git a/include/sqlpp11/insert.h b/include/sqlpp11/insert.h index 7ed0e7e2..3a8fdbd7 100644 --- a/include/sqlpp11/insert.h +++ b/include/sqlpp11/insert.h @@ -33,14 +33,14 @@ #include #include #include -#include +#include #include namespace sqlpp { template using blank_insert_t = statement_t; auto insert() diff --git a/include/sqlpp11/type_traits.h b/include/sqlpp11/type_traits.h index f276dea3..6df505f4 100644 --- a/include/sqlpp11/type_traits.h +++ b/include/sqlpp11/type_traits.h @@ -123,6 +123,7 @@ namespace sqlpp SQLPP_IS_VALUE_TRAIT_GENERATOR(select_column_list); SQLPP_IS_VALUE_TRAIT_GENERATOR(from); SQLPP_IS_VALUE_TRAIT_GENERATOR(single_table); + SQLPP_IS_VALUE_TRAIT_GENERATOR(into); SQLPP_IS_VALUE_TRAIT_GENERATOR(extra_tables); SQLPP_IS_VALUE_TRAIT_GENERATOR(on); SQLPP_IS_VALUE_TRAIT_GENERATOR(dynamic); diff --git a/include/sqlpp11/vendor/into.h b/include/sqlpp11/vendor/into.h new file mode 100644 index 00000000..5d474e9c --- /dev/null +++ b/include/sqlpp11/vendor/into.h @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2013-2014, Roland Bock + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, this + * list of conditions and the following disclaimer in the documentation and/or + * other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SQLPP_VENDOR_INTO_H +#define SQLPP_VENDOR_INTO_H + +#include +#include +#include +#include + +namespace sqlpp +{ + namespace vendor + { + // A SINGLE TABLE DATA + template + struct into_data_t + { + into_data_t(Table table): + _table(table) + {} + + into_data_t(const into_data_t&) = default; + into_data_t(into_data_t&&) = default; + into_data_t& operator=(const into_data_t&) = default; + into_data_t& operator=(into_data_t&&) = default; + ~into_data_t() = default; + + Table _table; + }; + + // A SINGLE TABLE + template + struct into_t + { + using _traits = make_traits; + using _recursive_traits = make_recursive_traits; + + static_assert(is_table_t
::value, "argument has to be a table"); + static_assert(required_tables_of
::size::value == 0, "table depends on another table"); + + using _data_t = into_data_t; + + struct _name_t {}; + + // Member implementation with data and methods + template + struct _impl_t + { + _data_t _data; + }; + + // Member template for adding the named member to a statement + template + struct _member_t + { + using _data_t = into_data_t; + + _impl_t into; + _impl_t& operator()() { return into; } + const _impl_t& operator()() const { return into; } + + template + static auto _get_member(T t) -> decltype(t.into) + { + return t.into; + } + }; + + // Additional methods for the statement + template + struct _methods_t + { + }; + + template + struct _result_methods_t + { + using _statement_t = typename Policies::_statement_t; + + const _statement_t& _get_statement() const + { + return static_cast(*this); + } + + static constexpr size_t _get_static_no_of_parameters() + { +#warning need to fix this + return 0; + //return _parameter_list_t::size::value; + } + + size_t _get_no_of_parameters() const + { +#warning need to fix this + return 0; + //return _parameter_list_t::size::value; + } + + void _check_consistency() const + { + // FIXME: Read up on what is allowed/prohibited in INSERT + } + + template + auto _run(Db& db) const -> decltype(db.insert(_get_statement())) + { + _check_consistency(); + + static_assert(_get_static_no_of_parameters() == 0, "cannot run insert directly with parameters, use prepare instead"); + return db.insert(*this); + } + + /* + template + auto _prepare(Db& db) const + -> prepared_insert_t + { + _check_consistency(); + + return {{}, db.prepare_insert(*this)}; + } + */ + }; + }; + + // NO INTO YET + struct no_into_t + { + using _traits = make_traits; + using _recursive_traits = make_recursive_traits<>; + + // Data + using _data_t = no_data_t; + + // Member implementation with data and methods + template + struct _impl_t + { + _data_t _data; + }; + + // Member template for adding the named member to a statement + template + struct _member_t + { + using _data_t = no_data_t; + + _impl_t no_into; + _impl_t& operator()() { return no_into; } + const _impl_t& operator()() const { return no_into; } + + template + static auto _get_member(T t) -> decltype(t.no_into) + { + return t.no_into; + } + }; + + template + struct _methods_t + { + using _database_t = typename Policies::_database_t; + template + using _new_statement_t = typename Policies::template _new_statement_t; + + template + auto into(Args... args) + -> _new_statement_t> + { + return { *static_cast(this), into_data_t{args...} }; + } + }; + }; + + // Interpreters + template + struct serializer_t> + { + using T = into_data_t; + + static Context& _(const T& t, Context& context) + { + serialize(t._table, context); + return context; + } + }; + + } +} + +#endif diff --git a/include/sqlpp11/vendor/single_table.h b/include/sqlpp11/vendor/single_table.h index 7d83c838..9826b35f 100644 --- a/include/sqlpp11/vendor/single_table.h +++ b/include/sqlpp11/vendor/single_table.h @@ -80,14 +80,14 @@ namespace sqlpp { using _data_t = single_table_data_t; - _impl_t into; - _impl_t& operator()() { return into; } - const _impl_t& operator()() const { return into; } + _impl_t from; + _impl_t& operator()() { return from; } + const _impl_t& operator()() const { return from; } template - static auto _get_member(T t) -> decltype(t.into) + static auto _get_member(T t) -> decltype(t.from) { - return t.into; + return t.from; } }; @@ -170,14 +170,14 @@ namespace sqlpp { using _data_t = no_data_t; - _impl_t no_into; - _impl_t& operator()() { return no_into; } - const _impl_t& operator()() const { return no_into; } + _impl_t no_from; + _impl_t& operator()() { return no_from; } + const _impl_t& operator()() const { return no_from; } template - static auto _get_member(T t) -> decltype(t.no_into) + static auto _get_member(T t) -> decltype(t.no_from) { - return t.no_into; + return t.no_from; } }; @@ -188,13 +188,6 @@ namespace sqlpp template using _new_statement_t = typename Policies::template _new_statement_t; - template - auto into(Args... args) - -> _new_statement_t> - { - return { *static_cast(this), single_table_data_t{args...} }; - } - #warning: remove can operate on several tables at once, so it should not use single_table anyway template auto from(Args... args) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 8ebcb6f0..a5124694 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,10 +6,10 @@ macro (build_and_run arg) add_test(${arg} ${arg}) endmacro () -build_and_run(InterpretTest) -#build_and_run(InsertTest) -#build_and_run(RemoveTest) -#build_and_run(UpdateTest) +#build_and_run(InterpretTest) +build_and_run(InsertTest) +build_and_run(RemoveTest) +build_and_run(UpdateTest) #build_and_run(SelectTest) #build_and_run(SelectTypeTest) #build_and_run(FunctionTest)