diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-08-08 12:48:37 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-08-08 16:15:07 +0100 |
commit | 5378ffd0aca410c50887fee57899776e62bfb766 (patch) | |
tree | 699e11a5b6cfcf7f6d2c29083ec84c7ed3fe36c5 /lib/output/pq/writePqCopyStrm.cpp | |
parent | Create indexes and keys after copying table data (diff) | |
download | mygrate-5378ffd0aca410c50887fee57899776e62bfb766.tar.bz2 mygrate-5378ffd0aca410c50887fee57899776e62bfb766.tar.xz mygrate-5378ffd0aca410c50887fee57899776e62bfb766.zip |
Extract WritePqCopyStrm into its own file
Diffstat (limited to 'lib/output/pq/writePqCopyStrm.cpp')
-rw-r--r-- | lib/output/pq/writePqCopyStrm.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lib/output/pq/writePqCopyStrm.cpp b/lib/output/pq/writePqCopyStrm.cpp new file mode 100644 index 0000000..dd402e7 --- /dev/null +++ b/lib/output/pq/writePqCopyStrm.cpp @@ -0,0 +1,82 @@ +#include "writePqCopyStrm.h" +#include <cstdint> + +namespace MyGrate::Output::Pq { + + WritePqCopyStream::WritePqCopyStream(FILE * o) : out {o} { } + + void + WritePqCopyStream::nextRecord() + { + fputc('\n', out); + } + + void + WritePqCopyStream::nextField() + { + fputc('\t', out); + } + + void WritePqCopyStream::operator()(std::nullptr_t) const + { + fputs("\\N", out); + } + + void WritePqCopyStream::operator()(timespec) const + { + throw std::logic_error("timespec not implemented"); + } + + void + WritePqCopyStream::operator()(Date v) const + { + fprintf(out, "%d-%d-%d", v.year, v.month, v.day); + } + + void + WritePqCopyStream::operator()(Time v) const + { + fprintf(out, "%d:%d:%d", v.hour, v.minute, v.second); + } + + void + WritePqCopyStream::operator()(DateTime v) const + { + operator()(static_cast<Date &>(v)); + fputc('T', out); + operator()(static_cast<Time &>(v)); + } + + void + WritePqCopyStream::operator()(std::string_view v) const + { + auto pos {v.begin()}; + while (pos != v.end()) { + auto esc = std::find_if(pos, v.end(), [](unsigned char c) { + return std::iscntrl(c); + }); + if (esc != pos) { + fwrite(pos, esc - pos, 1, out); + pos = esc; + } + while (pos != v.end()) { + fprintf(out, "\\%03o", *pos); + pos++; + } + } + } + + void WritePqCopyStream::operator()(BitSet) const + { + throw std::logic_error("bitset not implemented"); + } + + void + WritePqCopyStream::operator()(Blob v) const + { + fputs("\\\\x", out); + std::for_each(v.begin(), v.end(), [this](auto b) { + fprintf(out, "%02hhx", (uint8_t)b); + }); + } +} |