Re: libpq on windows

From: jtv(at)xs4all(dot)nl
To: "Gustavo Lopes" <contratempo(at)gmail(dot)com>
Cc: pgsql-interfaces(at)postgresql(dot)org
Subject: Re: libpq on windows
Date: 2005-05-20 06:32:21
Message-ID: 20704.202.47.227.25.1116570741.squirrel@202.47.227.25
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-interfaces

Gustavo Lopes <contratempo(at)gmail(dot)com> wrote:

> The problem seems to occurr only when the server sends a hint or the
> dll generates one. This can happen when the connection to the server
> cannot be established because the server is not running, a nonexistant
> postgres function exist is called, when one attempts to drop an index
> upon which a constraint depends, etc. (the program doesn't go beyond
> PQconnectdb, PQexec or PQexecparam). Since my debugging skills are
> very poor I cannot give any accurate description on what is causing
> the exception.
> The problem can be very easily reproduced by creating a C program
> which calls PQconnectdb with a host parameter that points to a machine
> that is not running postgres.
> Running the same program under linux (although I used older versions
> of the interface and the server) does not cause any problems.

It could be the notice processor that crashes. A "notice processor" is a
callback that you can register with libpq that handles error messages.
The default is to print them to the console, but I'm not sure you can
always do that in a Windows program. Or since you're apparently using
different compilers for libpq and the application, maybe the default
notice processor gets linked to a different standard library than it
expects and fails because of that.

Notice processors are documented here:

http://www.postgresql.org/docs/8.0/interactive/libpq-notice-processing.html

To find out if this is what's wrong, try creating an empty function (with
C-style calling convention, not a regular C++ function) and setting that
as the notice processor:

extern "C" { /* (this line only needed in C++) */
void emptynoticeprocessor(void *, const char *)
{
}
} /* (this line only needed in C++) */

Now in your code, just after you opened your connection (call it "c"):

PQsetNoticeProcessor(c,emptynoticeprocessor,NULL);

Of course that will mean that error messages are not displayed, so if this
solves your crashing problem then your next step is to implement something
here that displays the given message!

Jeroen

In response to

Responses

Browse pgsql-interfaces by date

  From Date Subject
Next Message Zlatko Matic 2005-05-20 08:25:12 Re: MS-Access and Stored procedures
Previous Message Brett Schwarz 2005-05-20 05:14:52 Re: libpgtcl.dll + SSL