I shall try to write english well enough :)
I'm writing a GUI client to access my PostrgeSQL DB, with FLTK libraries. Sometimes, the client crashes.
I have written un source code, as little as possible, without FLTK libraries, to test the behavior of PQfinish(), and I noticed :
If no connexion has ever been made, [ PQstatus() retuns 'CONNECTION_BAD'
] , a call to PQfinish(...) does not do something wrong.
But il I connect with PQsetdblogin(..), [ PQstatus returns 'CONNECTION_OK
], a first call to PQfinish(...) disconnects the client, [ PQstatus returns
'CONNECTION_BAD' ], and A SECOND call to PQfinish(..) make the client
to crash with a system message 'segmentation fault'.
The source code I made to test interactively connections, disconnections and status is attached to this mail.
I could be told that one does not call PQfinish() when PQstatus is 'CONNECTION_BAD, but it is done in the PostgreSQL documentation example (Programmer's guide, chapter 1.11)
I hope this will be useful for you.
Here is my computer configuration :
CPU : Pentium
II 350 MHz
OS :
Linux SuSE 7.2 upgraded with kernel 2.4.8
Compiler : GNU gcc version2.95.3
Linker : GNU ld version 2.10.91 (with
BFD 2.10.91.0.4)
PostgreSQL : Version 7.1.3 (downloaded on ftp.fr.postgresql.org )
-- Jean-Michel Chabanne 77450 MONTRY (FRANCE) 48" 54' N - 2" 49' E Powered by Linux
#include <stdio.h> #include "/usr/local/pgsql/include/libpq-fe.h"
PGconn *conn;
PGresult *res;
main(void)
{
int key;
char *pghost=NULL;
char *pgport=NULL;
char *pgoptions=NULL;
char *pgtty=NULL;
char *dbName="test";
char *user="jmc";
char *pwd;
printf("Type one of the following actions, and press RETURN.\n");
while(1)
{
(void)printf("Quit = Q Connect+status = C"
" Disconnect+status = D Status_only = * : ");
key = getchar();
if(key == 10)
continue;
switch(key)
{
case 'c' :
case 'C' :
conn = PQsetdbLogin(pghost, pgport, pgoptions, \
pgtty, dbName, user, pwd);
break;
case 'd' :
case 'D' :
PQfinish(conn);
break;
case 'q' :
case 'Q' :
return 0;
default :
break;
}
switch(PQstatus(conn))
{
case CONNECTION_OK :
(void)printf("\t---> OK\n");
break;
case CONNECTION_BAD :
(void)printf("\t---> BAD\n");
break;
case CONNECTION_STARTED :
(void)printf("\t---> STARTED\n");
break;
case CONNECTION_MADE :
(void)printf("\t---> MADE\n");
break;
case CONNECTION_AWAITING_RESPONSE :
(void)printf("\t---> AWAITING_RESPONSE\n");
break;
case CONNECTION_AUTH_OK :
(void)printf("\t---> AUTH_OK\n");
break;
case CONNECTION_SETENV :
(void)printf("\t---> SETENV\n");
break;
default :
printf("\t---> Default\n");
}
key = getchar();
if(key != 10)
ungetc(key, stdin);
}
return 0;
}
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])
