diff --git a/include/sqlpp11/data_types/floating_point/column_operators.h b/include/sqlpp11/data_types/floating_point/column_operators.h index dd3cda2b..6daf5131 100644 --- a/include/sqlpp11/data_types/floating_point/column_operators.h +++ b/include/sqlpp11/data_types/floating_point/column_operators.h @@ -28,6 +28,7 @@ #define SQLPP_FLOATING_POINT_COLUMN_OPERATORS_H #include +#include #include #include diff --git a/include/sqlpp11/data_types/integral/column_operators.h b/include/sqlpp11/data_types/integral/column_operators.h index 72f30fd2..cd447123 100644 --- a/include/sqlpp11/data_types/integral/column_operators.h +++ b/include/sqlpp11/data_types/integral/column_operators.h @@ -28,6 +28,8 @@ #define SQLPP_INTEGRAL_COLUMN_OPERATORS_H #include +#include +#include #include #include diff --git a/include/sqlpp11/data_types/integral/data_type.h b/include/sqlpp11/data_types/integral/data_type.h index f029d5a9..4ffce0c4 100644 --- a/include/sqlpp11/data_types/integral/data_type.h +++ b/include/sqlpp11/data_types/integral/data_type.h @@ -27,13 +27,7 @@ #ifndef SQLPP_INTEGRAL_DATA_TYPE_H #define SQLPP_INTEGRAL_DATA_TYPE_H -#include -#include #include -#include -#include -#include -#include namespace sqlpp { diff --git a/include/sqlpp11/data_types/integral/expression_operators.h b/include/sqlpp11/data_types/integral/expression_operators.h index da18e0a8..5dc1d0af 100644 --- a/include/sqlpp11/data_types/integral/expression_operators.h +++ b/include/sqlpp11/data_types/integral/expression_operators.h @@ -28,6 +28,7 @@ #define SQLPP_INTEGRAL_EXPRESSION_OPERATORS_H #include +#include #include #include #include diff --git a/include/sqlpp11/data_types/text.h b/include/sqlpp11/data_types/text.h index cb6619d5..dcd08b38 100644 --- a/include/sqlpp11/data_types/text.h +++ b/include/sqlpp11/data_types/text.h @@ -27,256 +27,17 @@ #ifndef SQLPP_TEXT_H #define SQLPP_TEXT_H -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include -namespace sqlpp -{ - template - struct concat_t; +// text specific functions +#include +#include - // text value type - struct text - { - using _traits = make_traits; - using _tag = tag::is_text; - using _cpp_value_type = std::string; - - template - using _is_valid_operand = is_text_t; - }; - - // text parameter type - template <> - struct parameter_value_t - { - using _value_type = text; - using _cpp_value_type = typename _value_type::_cpp_value_type; - - parameter_value_t() : _value(""), _is_null(true) - { - } - - parameter_value_t(const _cpp_value_type& val) : _value(val), _is_null(false) - { - } - - parameter_value_t& operator=(const _cpp_value_type& val) - { - _value = val; - _is_null = false; - return *this; - } - - parameter_value_t& operator=(const tvin_t>& t) - { - if (t._is_trivial()) - { - _value = ""; - _is_null = true; - } - else - { - _value = t._value._t; - _is_null = false; - } - return *this; - } - - parameter_value_t& operator=(const std::nullptr_t&) - { - _value = ""; - _is_null = true; - return *this; - } - - bool is_null() const - { - return _is_null; - } - - _cpp_value_type value() const - { - return _value; - } - - operator _cpp_value_type() const - { - return value(); - } - - template - void _bind(Target& target, size_t index) const - { - target._bind_text_parameter(index, &_value, _is_null); - } - - private: - _cpp_value_type _value; - bool _is_null; - }; - - // text expression operators - template - struct expression_operators : public basic_expression_operators - { - template - using _is_valid_operand = is_valid_operand; - - template - concat_t> operator+(T t) const - { - using rhs = wrap_operand_t; - static_assert(_is_valid_operand::value, "invalid rhs operand"); - - return {*static_cast(this), {t}}; - } - - template - like_t> like(T t) const - { - using rhs = wrap_operand_t; - static_assert(_is_valid_operand::value, "invalid argument for like()"); - - return {*static_cast(this), {t}}; - } - }; - - // text column operators - template - struct column_operators - { - template - using _is_valid_operand = is_valid_operand; - - template - auto operator+=(T t) const -> assignment_t>> - { - using rhs = wrap_operand_t; - static_assert(_is_valid_operand::value, "invalid rhs assignment operand"); - - return {*static_cast(this), - concat_t>{*static_cast(this), rhs{t}}}; - } - }; - - // text result field - template - struct result_field_t : public result_field_methods_t> - { - static_assert(std::is_same, text>::value, "field type mismatch"); - using _cpp_value_type = typename text::_cpp_value_type; - - result_field_t() : _is_valid(false), _value_ptr(nullptr), _len(0) - { - } - - void _validate() - { - _is_valid = true; - } - - void _invalidate() - { - _is_valid = false; - _value_ptr = nullptr; - _len = 0; - } - - bool operator==(const _cpp_value_type& rhs) const - { - return value() == rhs; - } - bool operator!=(const _cpp_value_type& rhs) const - { - return not operator==(rhs); - } - - bool is_null() const - { - if (not _is_valid) - throw exception("accessing is_null in non-existing row"); - return _value_ptr == nullptr; - } - - bool _is_trivial() const - { - if (not _is_valid) - throw exception("accessing is_null in non-existing row"); - - return value() == ""; - } - - _cpp_value_type value() const - { - if (not _is_valid) - throw exception("accessing value in non-existing row"); - - if (not _value_ptr) - { - if (enforce_null_result_treatment_t::value and not null_is_trivial_value_t::value) - { - throw exception("accessing value of NULL field"); - } - else - { - return ""; - } - } - return std::string(_value_ptr, _value_ptr + _len); - } - - template - void _bind(Target& target, size_t i) - { - target._bind_text_result(i, &_value_ptr, &_len); - } - - private: - bool _is_valid; - const char* _value_ptr; - size_t _len; - }; - - template - struct serializer_t> - { - using _serialize_check = consistent_t; - using T = result_field_t; - - static Context& _(const T& t, Context& context) - { - if (t.is_null() and not null_is_trivial_value_t::value) - { - context << "NULL"; - } - else - { - context << '\'' << context.escape(t.value()) << '\''; - } - return context; - } - }; - - template - inline std::ostream& operator<<(std::ostream& os, const result_field_t& e) - { - if (e.is_null() and not null_is_trivial_value_t::value) - { - return os << "NULL"; - } - else - { - return os << e.value(); - } - } - - using blob = text; - using varchar = text; - using char_ = text; -} #endif diff --git a/include/sqlpp11/data_types/text/column_operators.h b/include/sqlpp11/data_types/text/column_operators.h new file mode 100644 index 00000000..fd2d8695 --- /dev/null +++ b/include/sqlpp11/data_types/text/column_operators.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2013-2015, 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_TEXT_COLUMN_OPERATORS_H +#define SQLPP_TEXT_COLUMN_OPERATORS_H + +#include +#include +#include +#include + +namespace sqlpp +{ + template + struct concat_t; + + template + struct column_operators + { + template + using _is_valid_operand = is_valid_operand; + + template + auto operator+=(T t) const -> assignment_t>> + { + using rhs = wrap_operand_t; + static_assert(_is_valid_operand::value, "invalid rhs assignment operand"); + + return {*static_cast(this), + concat_t>{*static_cast(this), rhs{t}}}; + } + }; +} +#endif diff --git a/include/sqlpp11/concat.h b/include/sqlpp11/data_types/text/concat.h similarity index 100% rename from include/sqlpp11/concat.h rename to include/sqlpp11/data_types/text/concat.h diff --git a/include/sqlpp11/data_types/text/data_type.h b/include/sqlpp11/data_types/text/data_type.h new file mode 100644 index 00000000..e9644357 --- /dev/null +++ b/include/sqlpp11/data_types/text/data_type.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2013-2015, 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_TEXT_DATA_TYPE_H +#define SQLPP_TEXT_DATA_TYPE_H + +#include + +namespace sqlpp +{ + struct text + { + using _traits = make_traits; + using _tag = tag::is_text; + using _cpp_value_type = std::string; + + template + using _is_valid_operand = is_text_t; + }; + + using blob = text; + using varchar = text; + using char_ = text; +} +#endif diff --git a/include/sqlpp11/data_types/text/expression_operators.h b/include/sqlpp11/data_types/text/expression_operators.h new file mode 100644 index 00000000..01d9ccb7 --- /dev/null +++ b/include/sqlpp11/data_types/text/expression_operators.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2013-2015, 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_TEXT_EXPRESSION_OPERATORS_H +#define SQLPP_TEXT_EXPRESSION_OPERATORS_H + +#include +#include +#include +#include + +namespace sqlpp +{ + template + struct concat_t; + + template + struct like_t; + + template + struct expression_operators : public basic_expression_operators + { + template + using _is_valid_operand = is_valid_operand; + + template + concat_t> operator+(T t) const + { + using rhs = wrap_operand_t; + static_assert(_is_valid_operand::value, "invalid rhs operand"); + + return {*static_cast(this), {t}}; + } + + template + like_t> like(T t) const + { + using rhs = wrap_operand_t; + static_assert(_is_valid_operand::value, "invalid argument for like()"); + + return {*static_cast(this), {t}}; + } + }; +} +#endif diff --git a/include/sqlpp11/like.h b/include/sqlpp11/data_types/text/like.h similarity index 100% rename from include/sqlpp11/like.h rename to include/sqlpp11/data_types/text/like.h diff --git a/include/sqlpp11/data_types/text/operand.h b/include/sqlpp11/data_types/text/operand.h new file mode 100644 index 00000000..a73341e2 --- /dev/null +++ b/include/sqlpp11/data_types/text/operand.h @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2013-2015, 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_TEXT_OPERAND_H +#define SQLPP_TEXT_OPERAND_H + +#include +#include + +namespace sqlpp +{ + struct text; + + struct text_operand : public alias_operators + { + using _traits = make_traits; + using _nodes = detail::type_vector<>; + using _is_aggregate_expression = std::true_type; + + using _value_t = std::string; + + text_operand() : _t{} + { + } + + text_operand(_value_t t) : _t(t) + { + } + + text_operand(const text_operand&) = default; + text_operand(text_operand&&) = default; + text_operand& operator=(const text_operand&) = default; + text_operand& operator=(text_operand&&) = default; + ~text_operand() = default; + + bool _is_trivial() const + { + return _t.empty(); + } + + _value_t _t; + }; +} +#endif diff --git a/include/sqlpp11/data_types/text/parameter_type.h b/include/sqlpp11/data_types/text/parameter_type.h new file mode 100644 index 00000000..796b7e29 --- /dev/null +++ b/include/sqlpp11/data_types/text/parameter_type.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2013-2015, 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_TEXT_PARAMETER_TYPE_H +#define SQLPP_TEXT_PARAMETER_TYPE_H + +#include +#include +#include +#include +#include + +namespace sqlpp +{ + template <> + struct parameter_value_t + { + using _value_type = text; + using _cpp_value_type = typename _value_type::_cpp_value_type; + + parameter_value_t() : _value(""), _is_null(true) + { + } + + parameter_value_t(const _cpp_value_type& val) : _value(val), _is_null(false) + { + } + + parameter_value_t& operator=(const _cpp_value_type& val) + { + _value = val; + _is_null = false; + return *this; + } + + parameter_value_t& operator=(const tvin_t>& t) + { + if (t._is_trivial()) + { + _value = ""; + _is_null = true; + } + else + { + _value = t._value._t; + _is_null = false; + } + return *this; + } + + parameter_value_t& operator=(const std::nullptr_t&) + { + _value = ""; + _is_null = true; + return *this; + } + + bool is_null() const + { + return _is_null; + } + + _cpp_value_type value() const + { + return _value; + } + + operator _cpp_value_type() const + { + return value(); + } + + template + void _bind(Target& target, size_t index) const + { + target._bind_text_parameter(index, &_value, _is_null); + } + + private: + _cpp_value_type _value; + bool _is_null; + }; +} +#endif diff --git a/include/sqlpp11/data_types/text/result_field.h b/include/sqlpp11/data_types/text/result_field.h new file mode 100644 index 00000000..b166c0e8 --- /dev/null +++ b/include/sqlpp11/data_types/text/result_field.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2013-2015, 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_TEXT_RESULT_FIELD_H +#define SQLPP_TEXT_RESULT_FIELD_H + +#include +#include +#include +#include +#include +#include + +namespace sqlpp +{ + template + struct result_field_t : public result_field_methods_t> + { + static_assert(std::is_same, text>::value, "field type mismatch"); + using _cpp_value_type = typename text::_cpp_value_type; + + result_field_t() : _is_valid(false), _value_ptr(nullptr), _len(0) + { + } + + void _validate() + { + _is_valid = true; + } + + void _invalidate() + { + _is_valid = false; + _value_ptr = nullptr; + _len = 0; + } + + bool operator==(const _cpp_value_type& rhs) const + { + return value() == rhs; + } + bool operator!=(const _cpp_value_type& rhs) const + { + return not operator==(rhs); + } + + bool is_null() const + { + if (not _is_valid) + throw exception("accessing is_null in non-existing row"); + return _value_ptr == nullptr; + } + + bool _is_trivial() const + { + if (not _is_valid) + throw exception("accessing is_null in non-existing row"); + + return value() == ""; + } + + _cpp_value_type value() const + { + if (not _is_valid) + throw exception("accessing value in non-existing row"); + + if (not _value_ptr) + { + if (enforce_null_result_treatment_t::value and not null_is_trivial_value_t::value) + { + throw exception("accessing value of NULL field"); + } + else + { + return ""; + } + } + return std::string(_value_ptr, _value_ptr + _len); + } + + template + void _bind(Target& target, size_t i) + { + target._bind_text_result(i, &_value_ptr, &_len); + } + + private: + bool _is_valid; + const char* _value_ptr; + size_t _len; + }; +} +#endif diff --git a/include/sqlpp11/data_types/text/serialize.h b/include/sqlpp11/data_types/text/serialize.h new file mode 100644 index 00000000..41d3d442 --- /dev/null +++ b/include/sqlpp11/data_types/text/serialize.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2013-2015, 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_TEXT_SERIALIZE_H +#define SQLPP_TEXT_SERIALIZE_H + +#include +#include +#include + +namespace sqlpp +{ + template + struct serializer_t + { + using _serialize_check = consistent_t; + using Operand = text_operand; + + static Context& _(const Operand& t, Context& context) + { + context << '\'' << context.escape(t._t) << '\''; + return context; + } + }; + + template + inline std::ostream& operator<<(std::ostream& os, const result_field_t& e) + { + if (e.is_null() and not null_is_trivial_value_t::value) + { + return os << "NULL"; + } + else + { + return os << e.value(); + } + } +} +#endif diff --git a/include/sqlpp11/data_types/text/wrap_operand.h b/include/sqlpp11/data_types/text/wrap_operand.h new file mode 100644 index 00000000..f80e26d8 --- /dev/null +++ b/include/sqlpp11/data_types/text/wrap_operand.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2013-2015, 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_TEXT_WRAP_OPERAND_H +#define SQLPP_TEXT_WRAP_OPERAND_H + +#include +#include +#include + +namespace sqlpp +{ + struct text_operand; + + template + struct wrap_operand< + T, + typename std::enable_if::value and not is_result_field_t::value>::type> + { + using type = text_operand; + }; +} +#endif diff --git a/include/sqlpp11/functions.h b/include/sqlpp11/functions.h index fd9512eb..916b0a66 100644 --- a/include/sqlpp11/functions.h +++ b/include/sqlpp11/functions.h @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include diff --git a/include/sqlpp11/result_field.h b/include/sqlpp11/result_field.h index 96d98422..821880a8 100644 --- a/include/sqlpp11/result_field.h +++ b/include/sqlpp11/result_field.h @@ -28,7 +28,8 @@ #define SQLPP_RESULT_FIELD_H #include -#include +#include +#include namespace sqlpp { @@ -52,7 +53,7 @@ namespace sqlpp } else { - context << t.value(); + serialize(wrap_operand_t{t}, context); } return context; } diff --git a/include/sqlpp11/type_traits.h b/include/sqlpp11/type_traits.h index 98bc1b35..797bec57 100644 --- a/include/sqlpp11/type_traits.h +++ b/include/sqlpp11/type_traits.h @@ -229,6 +229,15 @@ namespace sqlpp SQLPP_RECURSIVE_TRAIT_GENERATOR(can_be_null) SQLPP_RECURSIVE_TRAIT_GENERATOR(contains_aggregate_function) + template + struct is_valid_operand + { + static constexpr bool value = + is_expression_t::value // expressions are OK + and ValueType::template _is_valid_operand::value // the correct value type is required, of course + ; + }; + namespace detail { template diff --git a/include/sqlpp11/value_type_fwd.h b/include/sqlpp11/value_type_fwd.h index 8406ea39..5b105b18 100644 --- a/include/sqlpp11/value_type_fwd.h +++ b/include/sqlpp11/value_type_fwd.h @@ -38,15 +38,6 @@ namespace sqlpp static_assert(wrong_t::value, "Missing expression operators for ValueType"); }; - template - struct is_valid_operand - { - static constexpr bool value = - is_expression_t::value // expressions are OK - and ValueType::template _is_valid_operand::value // the correct value type is required, of course - ; - }; - template struct is_valid_assignment_operand { diff --git a/include/sqlpp11/wrap_operand.h b/include/sqlpp11/wrap_operand.h index ac93c00f..02edabad 100644 --- a/include/sqlpp11/wrap_operand.h +++ b/include/sqlpp11/wrap_operand.h @@ -50,7 +50,6 @@ namespace sqlpp namespace sqlpp { struct integral; - struct text; struct day_point_operand : public alias_operators { @@ -143,49 +142,6 @@ namespace sqlpp } }; - struct text_operand : public alias_operators - { - using _traits = make_traits; - using _nodes = detail::type_vector<>; - using _is_aggregate_expression = std::true_type; - - using _value_t = std::string; - - text_operand() : _t{} - { - } - - text_operand(_value_t t) : _t(t) - { - } - - text_operand(const text_operand&) = default; - text_operand(text_operand&&) = default; - text_operand& operator=(const text_operand&) = default; - text_operand& operator=(text_operand&&) = default; - ~text_operand() = default; - - bool _is_trivial() const - { - return _t.empty(); - } - - _value_t _t; - }; - - template - struct serializer_t - { - using _serialize_check = consistent_t; - using Operand = text_operand; - - static Context& _(const Operand& t, Context& context) - { - context << '\'' << context.escape(t._t) << '\''; - return context; - } - }; - template struct wrap_operand, void> { @@ -197,14 +153,6 @@ namespace sqlpp { using type = day_point_operand; }; - - template - struct wrap_operand< - T, - typename std::enable_if::value and not is_result_field_t::value>::type> - { - using type = text_operand; - }; } #endif