/* * Copyright (c) 2013, 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_INSERT_H #define SQLPP_INSERT_H #include #include #include #include #include #include namespace sqlpp { // Hint: Columns/Values could be supported by .columns().values().values()... // values could take values or assignments. The latter would be stripped // The insert would store a vector of tuples of values. // Hint: Select could be supported by perfect forwarding to the methods of _select member (always changing the whole type of the // insert. template< typename Table = noop, typename Assignments = noop > struct insert_t; template< typename Table, typename Assignments > struct insert_t { static_assert(is_noop::value or is_table_t
::value, "invalid 'Table' argument"); static_assert(is_noop::value or is_assignment_list_t::value, "invalid 'Assignments' arguments"); template using add_assignments_t = insert_t::type...>>; template add_assignments_t set(Assignment&&... assignment) { static_assert(std::is_same::value, "cannot call set() twice"); return { _table, {std::forward(assignment)...}, }; } template const insert_t& serialize(std::ostream& os, Db& db) const { os << "INSERT INTO "; _table.serialize(os, db); if (is_noop::value) os << "() VALUES()"; else _assignments.serialize(os, db); return *this; } template insert_t& serialize(std::ostream& os, Db& db) { static_cast(this)->serialize(os, db); return *this; } template std::size_t run(Db& db) const { constexpr bool calledSet = not is_noop::value; constexpr bool requireSet = Table::_required_insert_columns::size::value > 0; static_assert(calledSet or not requireSet, "calling set() required for given table"); std::ostringstream oss; serialize(oss, db); return db.insert(oss.str()); } Table _table; Assignments _assignments; }; template constexpr insert_t::type> insert_into(Table&& table) { return {std::forward
(table)}; } } #endif