From: | "Oliver Fischer" <nexus(at)fileseeker(dot)net> |
---|---|
To: | <pgsql-interfaces(at)postgresql(dot)org> |
Subject: | PQclear() causes coredump |
Date: | 2000-10-15 18:19:17 |
Message-ID: | 005501c036d4$6e37c810$0fed54d4@leveld.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-interfaces |
Hi Folks,
I write a program in c++ using PostgreSQL 7.0 at the moment.
During this, I have
written some small classes for accessing the database. One of
this classes is QtResultSet. I use them to manage my statments.
To avoid memory leaks, I use the dtor to free the resultset with
PQclear(). Unfortunaly every call to PQclear causes a coredump.
What is my mistake?
=== QtResultSet.h ===
#include <string>
#include <map>
#include <vector>
#include <libpq-fe.h>
#include "../errors/QtExceptions.h"
#ifndef __QTRESULTSET__
#define __QTRESULTSET__
namespace qt {
namespace database {
using namespace std;
using namespace qt::errors;
class QtResultSet {
public:
virtual ~QtResultSet();
vector<string> fieldnames() throw(QtDbConnectionBadErr,
QtDbFatalErr,
QtDbNonfatalErr, QtDbBadResponseErr);
vector<string> fetch(int) throw(QtDbConnectionBadErr,
QtDbFatalErr,
QtDbNonfatalErr, QtDbBadResponseErr);
vector<string> fetch(void) throw(QtDbConnectionBadErr,
QtDbFatalErr,
QtDbNonfatalErr, QtDbBadResponseErr);
string get_error();
int rows();
int fields();
void execute() throw(QtDbConnectionBadErr, QtDbFatalErr,
QtDbNonfatalErr, QtDbBadResponseErr);
friend class QtConnection;
protected:
QtResultSet(PGconn *, const string &);
private:
void fetch_row(int, vector<string>*);
bool binarydata_m;
int rows_m;
int fields_m;
int currentrow_m;
string query_m;
string error_m;
PGresult *pgresult_mp;
PGconn *pgconn_mp;
};
} }
#endif
=== QtResultSet.cpp ===
#include <string>
#include <libpq-fe.h>
#include "QtResultSet.h"
#include "../errors/QtExceptions.h"
namespace qt {
namespace database {
using namespace std;
using namespace qt::errors;
QtResultSet::~QtResultSet() {
PQclear(this->pgresult_mp);
}
QtResultSet::QtResultSet(PGconn *pgconn, const string &query)
{
pgconn_mp = pgconn;
query_m = query;
fields_m = 0;
rows_m = 0;
currentrow_m = 0;
}
void QtResultSet::execute() throw(QtDbConnectionBadErr,
QtDbFatalErr,
QtDbNonfatalErr, QtDbBadResponseErr)
try {
pgresult_mp = PQexec(pgconn_mp, query_m.c_str());
ExecStatusType res = PQresultStatus(pgresult_mp);
if (res == (PGRES_COMMAND_OK || PGRES_TUPLES_OK)) {
rows_m = PQntuples(pgresult_mp);
fields_m = PQnfields(pgresult_mp);
binarydata_m = PQbinaryTuples(pgresult_mp);
currentrow_m = -1;
}
else {
error_m = PQresultErrorMessage(pgresult_mp);
switch (res) {
case PGRES_EMPTY_QUERY:
break;
case PGRES_BAD_RESPONSE:
throw QtDbBadResponseErr();
break;
case PGRES_NONFATAL_ERROR:
throw QtDbNonfatalErr();
break;
case PGRES_FATAL_ERROR:
throw QtDbFatalErr();
break;
}
}
}
catch (...) {
#ifdef QTDEBUG
cerr << "Exception catched and PQclear() called." << endl;
#endif QTDEBUG
PQclear(pgresult_mp);
#ifdef QTDEBUG
cerr << "Exception rethrown." << endl;
#endif QTDEBUG
throw;
} }
int QtResultSet::fields() {
return fields_m;
}
int QtResultSet::rows() {
return rows_m;
}
vector<string> QtResultSet::fieldnames()
throw(QtDbConnectionBadErr, QtDbFatalErr,
QtDbNonfatalErr, QtDbBadResponseErr) {
vector<string> row;
for (int i = 0; i < rows_m; i++) {
row.push_back(PQfname(pgresult_mp, i));
}
return row;
}
vector<string> QtResultSet::fetch(void)
throw(QtDbConnectionBadErr, QtDbFatalErr,
QtDbNonfatalErr, QtDbBadResponseErr) {
vector<string> row;
if (currentrow_m < (rows_m - 1)) {
this->fetch_row(++currentrow_m, &row);
}
else {
}
return row;
}
vector<string> QtResultSet::fetch(int id)
throw(QtDbConnectionBadErr, QtDbFatalErr,
QtDbNonfatalErr, QtDbBadResponseErr) {
vector<string> row;
if ((id > 0) && (id < rows_m)) {
this->fetch_row(id, &row);
}
else {
}
return row;
}
void QtResultSet::fetch_row(int rowid, vector<string>
*rowdata) {
for (int i = 0; i < fields_m; i++) {
rowdata->push_back(string("Aber Hallo"));
}
}
string QtResultSet::get_error() {
return this->error_m;
} // QtResultSet::get_error
} // namespace database
} // namespace qt
BYe,
Oliver
--
Oliver Fischer
Level of Detail, Brunnenstr. 196, D-10119 Berlin
Tel. +49/30/280 491 43
--
Oliver Fischer
Level of Detail, Brunnenstr. 196, D-10119 Berlin
Tel. +49/30/280 491 43
From | Date | Subject | |
---|---|---|---|
Next Message | Alfred Perlstein | 2000-10-15 20:25:09 | Re: PQclear() causes coredump |
Previous Message | Horst Herb | 2000-10-15 03:51:16 | trigger problem |