From afcde49538230d4f8648e227f8a861b5a1b9a83c Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 21 Apr 2016 10:59:36 +0100 Subject: Don't attempt to close cursors when in failed transaction (it's failed and result in sigabrt) --- libpqpp/pq-selectcommand.cpp | 2 +- libpqpp/unittests/testpq.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) (limited to 'libpqpp') 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 #include #include +#include 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 ) -- cgit v1.2.3