diff --git a/include/pq/connection.hpp b/include/pq/connection.hpp index ecdd9a3..f39df09 100644 --- a/include/pq/connection.hpp +++ b/include/pq/connection.hpp @@ -19,12 +19,11 @@ #define id68BF7AAC5BD54AF2BBD6EC1318B6687E #include "pq/resultset.hpp" +#include "pq/implem/pq_type_helpers.hpp" #include #include #include #include -#include -#include struct pg_param; typedef pg_param PGparam; @@ -62,50 +61,6 @@ namespace pq { std::unique_ptr m_localData; }; - namespace implem { - template - const char* type_to_pqtypes_name ( void ); - - template - struct get_pqlib_c_type_struct { - using type = T; - static type conv ( T parParam ) { return parParam; } - }; - template <> - struct get_pqlib_c_type_struct { - using type = const char*; - static type conv ( const std::string& parParam ) { return parParam.c_str(); } - }; - template <> - struct get_pqlib_c_type_struct { - using type = const char*; - static type conv ( const boost::string_ref& parParam ) { return parParam.data(); } - }; - template <> - struct get_pqlib_c_type_struct { - using type = int; - static type conv ( bool parParam ) { return (parParam ? 1 : 0); } - }; - template <> - struct get_pqlib_c_type_struct { - struct StorageStruct { uint64_t epoch; int a[14]; char tzabbr[16]; }; - static constexpr std::size_t DATA_SIZE = sizeof(StorageStruct); - using storage = std::aligned_storage::type; - storage m_storage; - - public: - using type = const storage*; - - type conv ( const std::chrono::system_clock::time_point& parParam ); - ~get_pqlib_c_type_struct ( void ) noexcept; - }; - - template - inline typename get_pqlib_c_type_struct::type get_pqlib_c_type (const T& parParam) { - return get_pqlib_c_type_struct::conv(parParam); - } - } //namespace implem - template ResultSet Connection::query (const std::string& parQuery, Args&&... parArgs) { using std::remove_cv; diff --git a/include/pq/implem/pq_type_helpers.hpp b/include/pq/implem/pq_type_helpers.hpp new file mode 100644 index 0000000..375156b --- /dev/null +++ b/include/pq/implem/pq_type_helpers.hpp @@ -0,0 +1,84 @@ +/* Copyright 2015, Michele Santullo + * This file is part of "dindexer". + * + * "dindexer" is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * "dindexer" is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with "dindexer". If not, see . + */ + +#ifndef idEC73C3E4D64D44ABA0DB7D41FA8A7EB7 +#define idEC73C3E4D64D44ABA0DB7D41FA8A7EB7 + +#include +#include +#include + +namespace pq { + namespace implem { + template + const char* type_to_pqtypes_name ( void ); + + template + struct get_pqlib_c_type_struct { + using type = T; + static type conv ( T parParam ) { return parParam; } + }; + template <> + struct get_pqlib_c_type_struct { + using type = const char*; + static type conv ( const std::string& parParam ) { return parParam.c_str(); } + }; + template <> + struct get_pqlib_c_type_struct { + using type = const char*; + static type conv ( const boost::string_ref& parParam ) { return parParam.data(); } + }; + template <> + struct get_pqlib_c_type_struct { + using type = int; + static type conv ( bool parParam ) { return (parParam ? 1 : 0); } + }; + template <> + struct get_pqlib_c_type_struct { + struct StorageStruct { uint64_t epoch; int a[14]; char tzabbr[16]; }; + static constexpr std::size_t DATA_SIZE = sizeof(StorageStruct); + using storage = std::aligned_storage::type; + storage m_storage; + + public: + using type = const storage*; + + type conv ( const std::chrono::system_clock::time_point& parParam ); + ~get_pqlib_c_type_struct ( void ) noexcept; + }; + + template + inline typename get_pqlib_c_type_struct::type get_pqlib_c_type (const T& parParam) { + return get_pqlib_c_type_struct::conv(parParam); + } + + template <> inline const char* type_to_pqtypes_name() { return "%text"; } + template <> inline const char* type_to_pqtypes_name() { return "%text"; } + template <> inline const char* type_to_pqtypes_name() { return "%bool"; } + template <> inline const char* type_to_pqtypes_name() { return "%float4"; } + template <> inline const char* type_to_pqtypes_name() { return "%float8"; } + template <> inline const char* type_to_pqtypes_name() { return "%int2"; } + template <> inline const char* type_to_pqtypes_name() { return "%int4"; } + template <> inline const char* type_to_pqtypes_name() { return "%int8"; } + template <> inline const char* type_to_pqtypes_name() { return "%int2"; } + template <> inline const char* type_to_pqtypes_name() { return "%int4"; } + template <> inline const char* type_to_pqtypes_name() { return "%int8"; } + template <> inline const char* type_to_pqtypes_name() { return "%timestamptz"; } + } //namespace implem +} //namespace pq + +#endif diff --git a/src/pq/connection.cpp b/src/pq/connection.cpp index 8488168..672efa0 100644 --- a/src/pq/connection.cpp +++ b/src/pq/connection.cpp @@ -30,35 +30,8 @@ #include #include -using sc = std::chrono::system_clock; - namespace pq { namespace implem { - template <> const char* type_to_pqtypes_name() { return "%text"; } - template <> const char* type_to_pqtypes_name() { return "%text"; } - template <> const char* type_to_pqtypes_name() { return "%bool"; } - template <> const char* type_to_pqtypes_name() { return "%float4"; } - template <> const char* type_to_pqtypes_name() { return "%float8"; } - template <> const char* type_to_pqtypes_name() { return "%int2"; } - template <> const char* type_to_pqtypes_name() { return "%int4"; } - template <> const char* type_to_pqtypes_name() { return "%int8"; } - template <> const char* type_to_pqtypes_name() { return "%int2"; } - template <> const char* type_to_pqtypes_name() { return "%int4"; } - template <> const char* type_to_pqtypes_name() { return "%int8"; } - template <> const char* type_to_pqtypes_name() { return "%timestamptz"; } - - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - template const char* type_to_pqtypes_name ( void ); - auto get_pqlib_c_type_struct::conv (const std::chrono::system_clock::time_point& parParam) -> type { static_assert(sizeof(storage) == sizeof(PGtimestamp), "Wrong size for timestamp, please update DATA_SIZE"); static_assert(alignof(storage) == alignof(PGtimestamp), "Wrong alignment for timestamp, please update type");