From 13e1ac3a7845e80995607039a4e6efc0a6a066c1 Mon Sep 17 00:00:00 2001 From: JUAN DENT Date: Mon, 18 Dec 2017 12:38:41 -0600 Subject: [PATCH 1/3] Added trim.h with Roland's suggestions --- include/sqlpp11/functions.h | 1 + include/sqlpp11/trim.h | 109 ++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 include/sqlpp11/trim.h diff --git a/include/sqlpp11/functions.h b/include/sqlpp11/functions.h index 3c348eef..58aeff9a 100644 --- a/include/sqlpp11/functions.h +++ b/include/sqlpp11/functions.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include diff --git a/include/sqlpp11/trim.h b/include/sqlpp11/trim.h new file mode 100644 index 00000000..ff2be333 --- /dev/null +++ b/include/sqlpp11/trim.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2013-2015, Roland Bock + * Copyright (c) 2017, Juan Dent + * 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_TRIM_H +#define SQLPP11_TRIM_H + +#include +#include +#include + +namespace sqlpp +{ + struct trim_alias_t + { + struct _alias_t + { + static constexpr const char _literal[] = "trim_"; + using _name_t = sqlpp::make_char_sequence; + template + struct _member_t + { + T trim; + T& operator()() + { + return trim; + } + const T& operator()() const + { + return trim; + } + }; + }; + }; + + template + struct trim_t : public expression_operators, text>, + public alias_operators> + { + using _traits = make_traits; + + using _nodes = detail::type_vector; + using _can_be_null = std::true_type; + using _is_aggregate_expression = std::true_type; + + using _auto_alias_t = trim_alias_t; + + trim_t(const Expr expr) : _expr(expr) + { + } + + trim_t(const trim_t&) = default; + trim_t(trim_t&&) = default; + trim_t& operator=(const trim_t&) = default; + trim_t& operator=(trim_t&&) = default; + ~trim_t() = default; + + Expr _expr; + }; + + template + struct serializer_t> + { + using _serialize_check = serialize_check_of; + using T = trim_t; + + static Context& _(const T& t, Context& context) + { + context << "TRIM("; + serialize(t._expr, context); + context << ")"; + return context; + } + + }; + + template + auto trim(T t) -> trim_t> + { + static_assert(is_expression_t>::value, "trim() requires an expression as argument"); + return {t}; + } + +} // namespace sqlpp + +#endif From 5cb081a7210d3fbe6c54385edfee8d89d693453a Mon Sep 17 00:00:00 2001 From: JUAN DENT Date: Mon, 18 Dec 2017 16:44:16 -0600 Subject: [PATCH 2/3] Corrected _is_aggregate_expression --- include/sqlpp11/trim.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/sqlpp11/trim.h b/include/sqlpp11/trim.h index ff2be333..cbf9dd8f 100644 --- a/include/sqlpp11/trim.h +++ b/include/sqlpp11/trim.h @@ -64,7 +64,7 @@ namespace sqlpp using _nodes = detail::type_vector; using _can_be_null = std::true_type; - using _is_aggregate_expression = std::true_type; + using _is_aggregate_expression = std::false_type; using _auto_alias_t = trim_alias_t; From 91e0712e6cc950f894940ffe7a82e30db3cc431e Mon Sep 17 00:00:00 2001 From: JUAN DENT Date: Mon, 18 Dec 2017 16:51:47 -0600 Subject: [PATCH 3/3] _can_be_null depends on the expression --- include/sqlpp11/trim.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/sqlpp11/trim.h b/include/sqlpp11/trim.h index cbf9dd8f..32c7a1e5 100644 --- a/include/sqlpp11/trim.h +++ b/include/sqlpp11/trim.h @@ -63,7 +63,7 @@ namespace sqlpp using _traits = make_traits; using _nodes = detail::type_vector; - using _can_be_null = std::true_type; + using _can_be_null = can_be_null_t; using _is_aggregate_expression = std::false_type; using _auto_alias_t = trim_alias_t;