diff --git a/include/sqlpp11/functions.h b/include/sqlpp11/functions.h index ff11ac3d..ee359f2d 100644 --- a/include/sqlpp11/functions.h +++ b/include/sqlpp11/functions.h @@ -43,6 +43,7 @@ #include #include #include // Csaba Csoma suggests: unsafe_sql instead of verbatim +#include #include #include #include diff --git a/include/sqlpp11/parameterized_verbatim.h b/include/sqlpp11/parameterized_verbatim.h new file mode 100644 index 00000000..438a89ef --- /dev/null +++ b/include/sqlpp11/parameterized_verbatim.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2013-2020, Roland Bock, MacDue + * 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 SQLPP11_PARAMETERIZED_VERBATIM_COUNT_H +#define SQLPP11_PARAMETERIZED_VERBATIM_COUNT_H + +#include +#include +#include + +#include + +namespace sqlpp +{ + template + struct parameterized_verbatim_t : public expression_operators, ValueType>, + public alias_operators> + { + using _traits = make_traits; + using _nodes = detail::type_vector; + using _can_be_null = + std::true_type; // since we do not know what's going on inside the verbatim, we assume it can be null + + parameterized_verbatim_t( + const Expr expr, std::string verbatim_lhs, std::string verbatim_rhs) + : _expr(expr), _verbatim_lhs(std::move(verbatim_lhs)), _verbatim_rhs(std::move(verbatim_rhs)) { } + + parameterized_verbatim_t(const parameterized_verbatim_t&) = default; + parameterized_verbatim_t(parameterized_verbatim_t&&) = default; + parameterized_verbatim_t& operator=(const parameterized_verbatim_t&) = default; + parameterized_verbatim_t& operator=(parameterized_verbatim_t&&) = default; + ~parameterized_verbatim_t() = default; + + Expr _expr; + std::string _verbatim_lhs, _verbatim_rhs; + }; + + template + struct serializer_t> + { + using _serialize_check = consistent_t; + using T = parameterized_verbatim_t; + + static Context& _(const T& t, Context& context) + { + context << t._verbatim_lhs; + serialize(t._expr, context); + context << t._verbatim_rhs; + return context; + } + }; + + template + auto parameterized_verbatim(std::string lhs, Expr expr, std::string rhs) + -> parameterized_verbatim_t> + { + static_assert(is_expression_t>::value, "parameterized_verbatim() requires an expression as argument"); + return {expr, lhs, rhs}; + } + +} // namespace sqlpp + +#endif diff --git a/test_serializer/CMakeLists.txt b/test_serializer/CMakeLists.txt index b17c83ef..d7d9d145 100644 --- a/test_serializer/CMakeLists.txt +++ b/test_serializer/CMakeLists.txt @@ -27,13 +27,14 @@ set(test_serializer_names Blob CustomQuery DynamicWhere - ForUpdate - From - In - Insert + ForUpdate + From + In + Insert Over - TableAlias - Where + TableAlias + Where + ParameterizedVerbatim ) create_test_sourcelist(test_serializer_sources test_serializer_main.cpp ${test_serializer_names}) diff --git a/test_serializer/ParameterizedVerbatim.cpp b/test_serializer/ParameterizedVerbatim.cpp new file mode 100644 index 00000000..1f639c45 --- /dev/null +++ b/test_serializer/ParameterizedVerbatim.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2013-2020, Roland Bock, MacDue + * 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. + */ + +#include "compare.h" +#include + +#include + +SQLPP_ALIAS_PROVIDER(quester_player_level); + +int ParameterizedVerbatim(int, char* []) +{ + // An example thing that needs parameterized verbatim (as it's database specific) + auto checking_value_in_range = sqlpp::parameterized_verbatim( + "(quests.spawn_level_range @> CAST(", parameter(sqlpp::integer(), quester_player_level), " AS integer))"); + + compare(__LINE__, checking_value_in_range, "(quests.spawn_level_range @> CAST(? AS integer))"); + + return 0; +}