diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-05-31 13:18:17 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2021-05-31 13:18:17 +0100 |
commit | 63b2ca0dbdae190941d60a55c9cff99d4a75a0e1 (patch) | |
tree | d3766bcbc98fb5fb0fb2d8dddf2f194bedcb0325 /lib/output/pq/pqConn.cpp | |
parent | Map std::size_t to a sensible header (diff) | |
download | mygrate-63b2ca0dbdae190941d60a55c9cff99d4a75a0e1.tar.bz2 mygrate-63b2ca0dbdae190941d60a55c9cff99d4a75a0e1.tar.xz mygrate-63b2ca0dbdae190941d60a55c9cff99d4a75a0e1.zip |
Initial commit of prepstmt, selects, record sets
This is full of holes, but all the basics are covered.
Diffstat (limited to 'lib/output/pq/pqConn.cpp')
-rw-r--r-- | lib/output/pq/pqConn.cpp | 73 |
1 files changed, 14 insertions, 59 deletions
diff --git a/lib/output/pq/pqConn.cpp b/lib/output/pq/pqConn.cpp index 4f55ba8..81d9610 100644 --- a/lib/output/pq/pqConn.cpp +++ b/lib/output/pq/pqConn.cpp @@ -1,89 +1,44 @@ #include "pqConn.h" +#include "pqBindings.h" +#include "pqStmt.h" +#include <dbConn.h> #include <dbTypes.h> #include <helpers.h> #include <libpq-fe.h> #include <memory> -#include <sstream> #include <stdexcept> #include <string> -#include <variant> #include <vector> namespace MyGrate::Output::Pq { - using ResPtr = std::unique_ptr<PGresult, decltype(&PQclear)>; - - PqConn::PqConn(const char * const str) : conn {PQconnectdb(str)} + PqConn::PqConn(const char * const str) : conn {PQconnectdb(str), PQfinish} { - verify<std::runtime_error>(PQstatus(conn) == CONNECTION_OK, "Connection failure"); - PQsetNoticeProcessor(conn, notice_processor, this); - } - - PqConn::~PqConn() - { - PQfinish(conn); + verify<std::runtime_error>(PQstatus(conn.get()) == CONNECTION_OK, "Connection failure"); + PQsetNoticeProcessor(conn.get(), notice_processor, this); } void PqConn::query(const char * const q) { - ResPtr res {PQexec(conn, q), &PQclear}; + ResPtr res {PQexec(conn.get(), q), &PQclear}; verify<std::runtime_error>(PQresultStatus(res.get()) == PGRES_COMMAND_OK, q); } - struct Bindings { - // NOLINTNEXTLINE(hicpp-explicit-conversions) - explicit Bindings(const std::initializer_list<DbValue> & vs) - { - bufs.reserve(vs.size()); - values.reserve(vs.size()); - lengths.reserve(vs.size()); - for (const auto & v : vs) { - std::visit(*this, v); - } - } - template<Stringable T> - 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()); - } - template<Viewable T> - void - operator()(const T & v) - { - values.emplace_back(v.data()); - lengths.emplace_back(v.size()); - } - template<typename T> - void - operator()(const T &) - { - throw std::runtime_error("Not implemented"); - } - void - operator()(const std::nullptr_t &) - { - values.emplace_back(nullptr); - lengths.emplace_back(0); - } - - std::vector<std::string> bufs; - std::vector<const char *> values; - std::vector<int> lengths; - }; - void PqConn::query(const char * const q, const std::initializer_list<DbValue> & vs) { Bindings b {vs}; - ResPtr res {PQexecParams(conn, q, (int)vs.size(), nullptr, b.values.data(), b.lengths.data(), nullptr, 0), + ResPtr res {PQexecParams(conn.get(), q, (int)vs.size(), nullptr, b.values.data(), b.lengths.data(), nullptr, 0), &PQclear}; verify<std::runtime_error>(PQresultStatus(res.get()) == PGRES_COMMAND_OK, q); } + DbPrepStmtPtr + PqConn::prepare(const char * const q, std::size_t n) + { + return std::make_unique<PqPrepStmt>(q, n, this); + } + void PqConn::notice_processor(void * p, const char * n) { |