summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 )