From afd243cc87827c94f0cea73748ffc5c1fdf1880a Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 12 Jun 2021 20:54:28 +0100 Subject: Avoid direct use of runtime_error in PostgreSQL stuff Adds proper exception which extends it and gets the PostgreSQL error message. --- lib/output/pq/pqConn.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'lib/output/pq/pqConn.cpp') diff --git a/lib/output/pq/pqConn.cpp b/lib/output/pq/pqConn.cpp index b3a6ca6..c1a7362 100644 --- a/lib/output/pq/pqConn.cpp +++ b/lib/output/pq/pqConn.cpp @@ -10,9 +10,14 @@ #include namespace MyGrate::Output::Pq { + PqErr::PqErr(const std::string & when, PGconn * c) : std::runtime_error(when + ": " + PQerrorMessage((c))) { } + PqErr::PqErr(const std::string & when, PGresult * r) : std::runtime_error(when + ": " + PQresultErrorMessage((r))) + { + } + PqConn::PqConn(const char * const str) : conn {PQconnectdb(str), PQfinish} { - verify(PQstatus(conn.get()) == CONNECTION_OK, "Connection failure"); + verify(PQstatus(conn.get()) == CONNECTION_OK, "Connection failure", conn.get()); PQsetNoticeProcessor(conn.get(), notice_processor, this); } @@ -20,7 +25,7 @@ namespace MyGrate::Output::Pq { PqConn::query(const char * const q) { ResPtr res {PQexec(conn.get(), q), &PQclear}; - verify(PQresultStatus(res.get()) == PGRES_COMMAND_OK, q); + verify(PQresultStatus(res.get()) == PGRES_COMMAND_OK, q, res.get()); } void @@ -29,7 +34,7 @@ namespace MyGrate::Output::Pq { Bindings b {vs}; ResPtr res {PQexecParams(conn.get(), q, (int)vs.size(), nullptr, b.values.data(), b.lengths.data(), nullptr, 0), &PQclear}; - verify(PQresultStatus(res.get()) == PGRES_COMMAND_OK, q); + verify(PQresultStatus(res.get()) == PGRES_COMMAND_OK, q, res.get()); } DbPrepStmtPtr -- cgit v1.2.3