diff --git a/src/sqlgen/postgres/Connection.cpp b/src/sqlgen/postgres/Connection.cpp index 6b33ad2..8dd2bcc 100644 --- a/src/sqlgen/postgres/Connection.cpp +++ b/src/sqlgen/postgres/Connection.cpp @@ -33,8 +33,11 @@ Result Connection::end_write() { } const auto res = PQgetResult(conn_.get()); if (PQresultStatus(res) != PGRES_COMMAND_OK) { - return error(PQerrorMessage(conn_.get())); + const auto err = error(PQerrorMessage(conn_.get())); + PQclear(res); + return err; } + PQclear(res); return Nothing{}; } @@ -68,6 +71,7 @@ Result Connection::insert_impl( const auto& d = _data[i]; if (d.size() != current_row.size()) { + execute("ROLLBACK;"); execute("DEALLOCATE " + name + ";"); return error("Error in entry " + std::to_string(i) + ": Expected " + std::to_string(current_row.size()) + " entries, got " + @@ -88,13 +92,15 @@ Result Connection::insert_impl( ); const auto status = PQresultStatus(res); - if (status != PGRES_COMMAND_OK) { + PQclear(res); const auto err = error(std::string("Executing INSERT failed: ") + PQresultErrorMessage(res)); + execute("ROLLBACK;"); execute("DEALLOCATE " + name + ";"); return err; } + PQclear(res); } return execute("DEALLOCATE " + name + ";"); @@ -170,6 +176,9 @@ Result Connection::write_impl( static_cast(buffer.size())); if (success != 1) { PQputCopyEnd(conn_.get(), NULL); + while (auto res = PQgetResult(conn_.get())) + PQclear(res); + return error("Error occurred while writing data to postgres."); } } diff --git a/src/sqlgen/postgres/exec.cpp b/src/sqlgen/postgres/exec.cpp index 19220f6..ce71d92 100644 --- a/src/sqlgen/postgres/exec.cpp +++ b/src/sqlgen/postgres/exec.cpp @@ -9,7 +9,7 @@ namespace sqlgen::postgres { Result> exec(const Ref& _conn, const std::string& _sql) noexcept { - const auto res = PQexec(_conn.get(), _sql.c_str()); + auto res = PQexec(_conn.get(), _sql.c_str()); const auto status = PQresultStatus(res); @@ -18,6 +18,9 @@ Result> exec(const Ref& _conn, const auto err = error("Executing '" + _sql + "' failed: " + PQresultErrorMessage(res)); PQclear(res); + while ((res = PQgetResult(_conn.get())) != nullptr) + PQclear(res); + return err; }