~singpolyma/biboumi

c3313d0d418cb2aaaf2226eb0a7729ef567b6afb — louiz’ 6 years ago 24dc05d
Always free the PGresult pointer returned by PQexec

Fix a somewhat big memory leak
2 files changed, 10 insertions(+), 1 deletions(-)

M src/database/postgresql_engine.cpp
M src/database/postgresql_statement.hpp
M src/database/postgresql_engine.cpp => src/database/postgresql_engine.cpp +6 -0
@@ 1,6 1,8 @@
#include <biboumi.h>
#ifdef PQ_FOUND

#include <utils/scopeguard.hpp>

#include <database/postgresql_engine.hpp>

#include <database/postgresql_statement.hpp>


@@ 53,6 55,10 @@ std::tuple<bool, std::string> PostgresqlEngine::raw_exec(const std::string& quer
{
  log_debug("raw_exec:", query);
  PGresult* res = PQexec(this->conn, query.data());
  auto sg = utils::make_scope_guard([res](){
      PQclear(res);
  });

  auto res_status = PQresultStatus(res);
  if (res_status != PGRES_COMMAND_OK)
    return std::make_tuple(false, PQresultErrorMessage(res));

M src/database/postgresql_statement.hpp => src/database/postgresql_statement.hpp +4 -1
@@ 14,7 14,10 @@ class PostgresqlStatement: public Statement
      conn(conn)
  {}
  ~PostgresqlStatement()
  {}
  {
    PQclear(this->result);
    this->result = nullptr;
  }
  PostgresqlStatement(const PostgresqlStatement&) = delete;
  PostgresqlStatement& operator=(const PostgresqlStatement&) = delete;
  PostgresqlStatement(PostgresqlStatement&& other) = delete;