summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <daniel.goodliffe@pressassociation.com>2016-04-21 10:59:36 +0100
committerDan Goodliffe <daniel.goodliffe@pressassociation.com>2016-04-21 10:59:36 +0100
commitafcde49538230d4f8648e227f8a861b5a1b9a83c (patch)
tree4f6ea35c9c5025a2db6647fa49272e5a3b4e57b4
parentActually, don't prepare statement upfront during construction as it might not... (diff)
downloadlibdbpp-postgresql-afcde49538230d4f8648e227f8a861b5a1b9a83c.tar.bz2
libdbpp-postgresql-afcde49538230d4f8648e227f8a861b5a1b9a83c.tar.xz
libdbpp-postgresql-afcde49538230d4f8648e227f8a861b5a1b9a83c.zip
Don't attempt to close cursors when in failed transaction (it's failed and result in sigabrt)
-rw-r--r--libpqpp/pq-selectcommand.cpp2
-rw-r--r--libpqpp/unittests/testpq.cpp32
2 files changed, 33 insertions, 1 deletions
diff --git a/libpqpp/pq-selectcommand.cpp b/libpqpp/pq-selectcommand.cpp
index f8f44fd..b049eea 100644
--- a/libpqpp/pq-selectcommand.cpp
+++ b/libpqpp/pq-selectcommand.cpp
@@ -24,7 +24,7 @@ PQ::SelectCommand::~SelectCommand()
if (execRes) {
PQclear(execRes);
}
- if (executed) {
+ if (executed && PQtransactionStatus(c->conn) != PQTRANS_INERROR) {
c->checkResultFree((PQexec(c->conn, s_close.c_str())), PGRES_COMMAND_OK);
}
if (txOpened) {
diff --git a/libpqpp/unittests/testpq.cpp b/libpqpp/unittests/testpq.cpp
index 1905192..64d60d9 100644
--- a/libpqpp/unittests/testpq.cpp
+++ b/libpqpp/unittests/testpq.cpp
@@ -11,6 +11,7 @@
#include <boost/date_time/posix_time/posix_time.hpp>
#include <pq-error.h>
#include <pq-connection.h>
+#include <selectcommandUtil.impl.h>
class StandardMockDatabase : public PQ::Mock {
public:
@@ -286,6 +287,37 @@ BOOST_AUTO_TEST_CASE( statementReuse )
delete ro;
}
+BOOST_AUTO_TEST_CASE( closeOnError )
+{
+ auto ro = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock"));
+ BOOST_REQUIRE_THROW({
+ ro->select("SELECT * FROM test")->forEachRow<>([&ro](){
+ ro->execute("nonsense");
+ });
+ }, DB::Error);
+ BOOST_REQUIRE_THROW({
+ ro->select("SELECT * FROM test")->forEachRow<>([&ro](){
+ ro->select("SELECT * FROM test")->forEachRow<>([&ro](){
+ ro->execute("nonsense");
+ });
+ });
+ }, DB::Error);
+ ro->beginTx();
+ BOOST_REQUIRE_THROW({
+ ro->select("SELECT * FROM test")->forEachRow<>([&ro](){
+ ro->execute("nonsense");
+ });
+ }, DB::Error);
+ BOOST_REQUIRE_THROW({
+ ro->select("SELECT * FROM test")->forEachRow<>([&ro](){
+ ro->select("SELECT * FROM test")->forEachRow<>([&ro](){
+ ro->execute("nonsense");
+ });
+ });
+ }, DB::Error);
+ ro->commitTx();
+}
+
BOOST_AUTO_TEST_SUITE_END();
BOOST_AUTO_TEST_CASE( connfail )