/* * 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_UPDATE_H #define SQLPP_UPDATE_H #include #include #include #include #include namespace sqlpp { template< typename Database = void, typename Table = noop, typename Assignments = noop, typename Where = noop > struct update_t; template< typename Database, typename Table, typename Assignments, typename Where > struct update_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"); static_assert(is_noop::value or is_where_t::value, "invalid 'Where' argument"); template using set_assignments_t = update_t; template using set_where_t = update_t; template auto set(Assignment&&... assignment) -> set_assignments_t::type...>> { static_assert(std::is_same::value, "cannot call set() twice"); return { _table, {std::tuple::type...>{std::forward(assignment)...}}, _where, }; } template auto dynamic_set(Assignment&&... assignment) -> set_assignments_t::type...>> { static_assert(std::is_same::value, "cannot call set() twice"); return { _table, {std::tuple::type...>{std::forward(assignment)...}}, _where, }; } template void add_set(Assignment&& assignment) { static_assert(is_dynamic_t::value, "cannot call add_set() in a non-dynamic set"); _assignments.add(std::forward(assignment)); } template auto where(Expr&& where) -> set_where_t::type>> { static_assert(not std::is_same::value, "cannot call where() if set() hasn't been called yet"); static_assert(std::is_same::value, "cannot call where() twice"); return { _table, _assignments, {std::forward(where)}, }; } auto dynamic_where() -> set_where_t> { static_assert(not std::is_same::value, "cannot call where() if set() hasn't been called yet"); static_assert(std::is_same::value, "cannot call where() twice"); return { _table, _assignments, {{}}, }; } template void add_where(Expr&& expr) { static_assert(is_dynamic_t::value, "cannot call add_where() in a non-dynamic where"); _where.add(std::forward(expr)); } template const update_t& serialize(std::ostream& os, Db& db) const { os << "UPDATE "; _table.serialize(os, db); _assignments.serialize(os, db); _where.serialize(os, db); return *this; } template update_t& serialize(std::ostream& os, Db& db) { static_cast(this)->serialize(os, db); return *this; } template std::size_t run(Db& db) const { std::ostringstream oss; serialize(oss, db); return db.update(oss.str()); } Table _table; Assignments _assignments; Where _where; }; template constexpr update_t::type> update(Table&& table) { return {std::forward
(table)}; } template constexpr update_t::type, typename std::decay
::type> dynamic_update(Db&& db, Table&& table) { return {std::forward
(table)}; } } #endif