From 5378ffd0aca410c50887fee57899776e62bfb766 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 8 Aug 2021 12:48:37 +0100 Subject: Extract WritePqCopyStrm into its own file --- lib/dbTypes.h | 32 +++++++++++++ lib/output/pq/updateDatabase.cpp | 97 ++------------------------------------- lib/output/pq/writePqCopyStrm.cpp | 82 +++++++++++++++++++++++++++++++++ lib/output/pq/writePqCopyStrm.h | 38 +++++++++++++++ 4 files changed, 155 insertions(+), 94 deletions(-) create mode 100644 lib/output/pq/writePqCopyStrm.cpp create mode 100644 lib/output/pq/writePqCopyStrm.h diff --git a/lib/dbTypes.h b/lib/dbTypes.h index 0b7185c..42b242b 100644 --- a/lib/dbTypes.h +++ b/lib/dbTypes.h @@ -11,6 +11,38 @@ struct timespec; namespace MyGrate { + template struct printer; + template<> struct printer { + constexpr static const char * const fmt {"%f"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%f"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%hhd"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%hhu"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%hd"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%hu"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%d"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%u"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%ld"}; + }; + template<> struct printer { + constexpr static const char * const fmt {"%lu"}; + }; + struct Date { inline Date() { } inline Date(uint16_t y, uint8_t m, uint8_t d) : year {y}, month {m}, day {d} { } diff --git a/lib/output/pq/updateDatabase.cpp b/lib/output/pq/updateDatabase.cpp index 46641fc..485c914 100644 --- a/lib/output/pq/updateDatabase.cpp +++ b/lib/output/pq/updateDatabase.cpp @@ -1,6 +1,7 @@ #include "updateDatabase.h" #include "pqConn.h" #include "typeMapper.h" +#include "writePqCopyStrm.h" #include #include #include @@ -129,99 +130,6 @@ namespace MyGrate::Output::Pq { }); } - struct WritePqCopyStream { - explicit WritePqCopyStream(FILE * o) : out {o} { } - WritePqCopyStream(const WritePqCopyStream &) = delete; - WritePqCopyStream(WritePqCopyStream &&) = delete; - WritePqCopyStream & operator=(const WritePqCopyStream &) = delete; - WritePqCopyStream & operator=(WritePqCopyStream &&) = delete; - - ~WritePqCopyStream() - { - fputc('\n', out); - } - - void - nextField() - { - fputc('\t', out); - } - - void operator()(std::nullptr_t) const - { - fputs("\\N", out); - } -#define BASIC_PRINT(T, fmt) \ - void operator()(T v) const \ - { \ - fprintf(out, fmt, v); \ - } - BASIC_PRINT(double, "%f") - BASIC_PRINT(float, "%f") - BASIC_PRINT(int8_t, "%hhd") - BASIC_PRINT(uint8_t, "%hhu") - BASIC_PRINT(int16_t, "%hd") - BASIC_PRINT(uint16_t, "%hu") - BASIC_PRINT(int32_t, "%d") - BASIC_PRINT(uint32_t, "%u") - BASIC_PRINT(int64_t, "%ld") - BASIC_PRINT(uint64_t, "%lu") -#undef BASIC_PRINT - void operator()(timespec) const - { - throw std::logic_error("timespec not implemented"); - } - void - operator()(Date v) const - { - fprintf(out, "%d-%d-%d", v.year, v.month, v.day); - } - void - operator()(Time v) const - { - fprintf(out, "%d:%d:%d", v.hour, v.minute, v.second); - } - void - operator()(DateTime v) const - { - operator()(static_cast(v)); - fputc('T', out); - operator()(static_cast