diff --git a/include/sqlpp11/eval.h b/include/sqlpp11/eval.h new file mode 100644 index 00000000..116b19f0 --- /dev/null +++ b/include/sqlpp11/eval.h @@ -0,0 +1,62 @@ +/* + * 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_EVAL_H +#define SQLPP_EVAL_H + +#include +#include +#include +#include + +namespace sqlpp +{ + template + struct eval_t + { + static_assert(is_database::value, "Db parameter of eval has to be a database connection"); + static_assert(is_expression_t::value, "Expression parameter of eval has to be an sqlpp expression or a string"); + static_assert(required_tables_of::size::value == 0, "Expression cannot be used in eval because it requires tables"); + using _name_type = alias::a_t::_name_t; + using _value_type = value_type_of; + using _field_spec = field_spec_t<_name_type, _value_type, true, false>; + using type = result_field_t<_value_type, Db, _field_spec>; + }; + + template::value, int>::type = 0> + auto eval(Db& db, Expr expr) -> typename eval_t::type + { + return db(select(expr.as(alias::a))).front().a; + } + + template + auto eval(Db& db, std::string sql_code) -> decltype(eval(db, verbatim(sql_code))) + { + return eval(db, verbatim(sql_code)); + } +} + +#endif diff --git a/include/sqlpp11/functions.h b/include/sqlpp11/functions.h index 65fabab0..ca32b9b4 100644 --- a/include/sqlpp11/functions.h +++ b/include/sqlpp11/functions.h @@ -41,8 +41,10 @@ #include #include #include -#include // Csaba Csoma suggests: unsafe_sql instead of verbatim +#include // Csaba Csoma suggests: unsafe_sql instead of verbatim +#include #include +#include namespace sqlpp { @@ -53,44 +55,6 @@ namespace sqlpp return { t }; } - template // Csaba Csoma suggests: unsafe_sql instead of verbatim - struct verbatim_t: public ValueType::template expression_operators>, - public alias_operators> - { - using _traits = make_traits; - struct _recursive_traits : public make_recursive_traits<> - { - 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 - }; - - verbatim_t(std::string verbatim): _verbatim(verbatim) {} - verbatim_t(const verbatim_t&) = default; - verbatim_t(verbatim_t&&) = default; - verbatim_t& operator=(const verbatim_t&) = default; - verbatim_t& operator=(verbatim_t&&) = default; - ~verbatim_t() = default; - - std::string _verbatim; - }; - - template - struct serializer_t> - { - using T = verbatim_t; - - static Context& _(const T& t, Context& context) - { - context << t._verbatim; - return context; - } - }; - - template - auto verbatim(StringType s) -> verbatim_t - { - return { s }; - } - template auto flatten(const Expression& exp, Db& db) -> verbatim_t> { diff --git a/include/sqlpp11/result_field.h b/include/sqlpp11/result_field.h index e78b3938..476ca3ea 100644 --- a/include/sqlpp11/result_field.h +++ b/include/sqlpp11/result_field.h @@ -32,7 +32,7 @@ namespace sqlpp { - template + template struct result_field_t { static_assert(wrong_t::value, "Missing specialization for result_field_t"); diff --git a/include/sqlpp11/verbatim.h b/include/sqlpp11/verbatim.h new file mode 100644 index 00000000..a148519b --- /dev/null +++ b/include/sqlpp11/verbatim.h @@ -0,0 +1,75 @@ +/* + * 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_VERBATIM_H +#define SQLPP_VERBATIM_H + +#include +#include + +namespace sqlpp +{ + template // Csaba Csoma suggests: unsafe_sql instead of verbatim + struct verbatim_t: public ValueType::template expression_operators>, + public alias_operators> + { + using _traits = make_traits; + struct _recursive_traits : public make_recursive_traits<> + { + 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 + }; + + verbatim_t(std::string verbatim): _verbatim(verbatim) {} + verbatim_t(const verbatim_t&) = default; + verbatim_t(verbatim_t&&) = default; + verbatim_t& operator=(const verbatim_t&) = default; + verbatim_t& operator=(verbatim_t&&) = default; + ~verbatim_t() = default; + + std::string _verbatim; + }; + + template + struct serializer_t> + { + using T = verbatim_t; + + static Context& _(const T& t, Context& context) + { + context << t._verbatim; + return context; + } + }; + + template + auto verbatim(StringType s) -> verbatim_t + { + return { s }; + } + +} + +#endif