From 964f7ec93c2b01aa2c3d171f01210df742dd0724 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Tue, 13 Jul 2021 20:18:09 +0100 Subject: Wider type support for PQ bindings timespec not supported... honestly not sure what it should bind! --- lib/output/pq/pqBindings.h | 28 +++++++++++++++++++++++----- lib/output/pq/pqStmt.cpp | 3 ++- test/test-postgresql.cpp | 2 +- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/output/pq/pqBindings.h b/lib/output/pq/pqBindings.h index 5df1a34..13d0f69 100644 --- a/lib/output/pq/pqBindings.h +++ b/lib/output/pq/pqBindings.h @@ -1,9 +1,11 @@ #ifndef MYGRATE_OUTPUT_PQ_PQBINDINGS #define MYGRATE_OUTPUT_PQ_PQBINDINGS +#include #include #include #include +#include #include #include @@ -15,6 +17,7 @@ namespace MyGrate::Output::Pq { bufs.reserve(vs.size()); values.reserve(vs.size()); lengths.reserve(vs.size()); + formats.reserve(vs.size()); for (const auto & v : vs) { v.visit(*this); } @@ -23,10 +26,7 @@ namespace MyGrate::Output::Pq { void operator()(const T & v) { - bufs.emplace_back(std::to_string(v)); - const auto & vw {bufs.back()}; - values.emplace_back(vw.data()); - lengths.emplace_back(vw.length()); + addBuf(std::to_string(v)); } template void @@ -34,10 +34,16 @@ namespace MyGrate::Output::Pq { { values.emplace_back(v.data()); lengths.emplace_back(v.size()); + formats.push_back(1); } template void - operator()(const T &) + operator()(const T & v) + { + addBuf(scprintf<"%?">(v)); + } + void + operator()(const timespec &) { throw std::logic_error("Not implemented"); } @@ -46,11 +52,23 @@ namespace MyGrate::Output::Pq { { values.emplace_back(nullptr); lengths.emplace_back(0); + formats.push_back(0); } std::vector bufs; std::vector values; std::vector lengths; + std::vector formats; + + private: + void + addBuf(std::string str) + { + const auto & vw = bufs.emplace_back(std::move(str)); + values.emplace_back(vw.data()); + lengths.emplace_back(vw.length()); + formats.push_back(0); + } }; } diff --git a/lib/output/pq/pqStmt.cpp b/lib/output/pq/pqStmt.cpp index 2265f64..7e085b5 100644 --- a/lib/output/pq/pqStmt.cpp +++ b/lib/output/pq/pqStmt.cpp @@ -22,7 +22,8 @@ namespace MyGrate::Output::Pq { PqPrepStmt::execute(const std::initializer_list & vs) { Bindings b {vs}; - res = {PQexecPrepared(conn, name.c_str(), (int)vs.size(), b.values.data(), b.lengths.data(), nullptr, 0), + res = {PQexecPrepared( + conn, name.c_str(), (int)vs.size(), b.values.data(), b.lengths.data(), b.formats.data(), 0), &PQclear}; verify(PQresultStatus(res.get()) == PGRES_COMMAND_OK || PQresultStatus(res.get()) == PGRES_TUPLES_OK, name, conn); diff --git a/test/test-postgresql.cpp b/test/test-postgresql.cpp index 8adb920..15ba789 100644 --- a/test/test-postgresql.cpp +++ b/test/test-postgresql.cpp @@ -79,7 +79,7 @@ BOOST_AUTO_TEST_CASE(mock) BOOST_CHECK_NO_THROW(mdb.query("INSERT INTO test VALUES($1)", {"string_view"})); BOOST_CHECK_NO_THROW(mdb.query("INSERT INTO test VALUES($1)", {nullptr})); BOOST_CHECK_NO_THROW(mdb.query("INSERT INTO test VALUES($1)", {1.2})); - BOOST_CHECK_THROW(mdb.query("INSERT INTO test VALUES($1)", {MyGrate::Time {}}), std::logic_error); + BOOST_CHECK_THROW(mdb.query("INSERT INTO test VALUES($1)", {timespec {}}), std::logic_error); auto rscount = MyGrate::DbStmt<"SELECT COUNT(*) FROM test">::execute(&mdb); BOOST_CHECK_EQUAL(rscount->at(0, 0).operator unsigned int(), 4); } -- cgit v1.2.3