The following bug has been logged online:
Bug reference: 4060
Logged by: Bruce Nairn
Email address: bruce.nairn@kingcounty.gov
PostgreSQL version: 8.3.1
Operating system: Windows XP Pro
Description: libpq - large stack causes TCP/IP error
Details:
I'm using the libpq interface on Win XP (x86) to connect to a postgreSQL
database. Compiling with microsoft Visual Studio 2005 (express edition).
When the program stack size increases past a certain size, PQsetdbLogin
returns a TCP/IP buffer error: could not connect to server: No buffer space
available (0x00002747/10055).
A sample code that reproduces the error is attached below.
Any suggestions or fixes would be appreciated.
Thanks,
Bruce
------------------------
#include <cstdio>
#include <string>
#include <iostream>
#include "libpq-fe.h"
/* ---------------------
* This is a test program to demonstrate problem connecting to a
PostgreSQL
* database when the stack is set to exceed approx 0x32cd0000
* (decimal: 852295680) seems to depend slightly on shell environment
*
* Compile on Windows XP with MS Visual Studio 2005:
* > cl /EHsc /MD /F0x33000000 testconn4.cpp
/Ic:\postgresql\postgresql-8.3.1\src\interfaces\libpq
* /Ic:\postgresql\postgresql-8.3.1\src\include
/Ic:\postgresql\postgresql-8.3.1\src
* /link
c:\postgresql\postgresql-8.3.1\src\interfaces\libpq\release\libpqdll.lib
*
* gives:
*
* >testconn4 guest 103
* start
* inputs first
* PQsetdbLogin
* Connection to database failed Error returned: could not connect to server:
No buffer space available (0x00002747/10055)
* Is the server running on host "store.cincomsmalltalk.com" and
accepting
* TCP/IP connections on port 5432?
*
* compile with /F0x32000000 (or smaller, or omit), gives expected
output:
*
* >testconn4 guest 103
* start
* inputs first
* PQsetdbLogin
* success!
*
* Is there a solution to allow this to work with a program that requires
* a stack this large?
*/
using namespace std;
extern "C" void LoadWaterBody(const char* user, const char* setnum){
std::string newuser = user;
std::string newsetnum = setnum;
PGconn* conn;
PGresult* pgrs;
char* pghost;
char* pgport;
char* pgoptions;
char* pgtty;
char* dbName;
char* login;
char* pwd;
/* ----------------
* Google found this database available for public connection, so I use it
for
* demonstration purposes... Thanks!
* http://www.cincomsmalltalk.com/CincomSmalltalkWiki/PostgreSQL+Access+Page#
guestAccess
*/
pghost="store.cincomsmalltalk.com";
pgport="5432";
pgoptions=NULL;
pgtty=NULL;
dbName="store_public";
login="guest";
pwd="guest";
cout << "inputs first\n";
conn = PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbName, login,
pwd);
cout << "PQsetdbLogin\n";
if (PQstatus(conn) == CONNECTION_BAD) { // did the database
connection fail?
cerr << "Connection to database failed "
<< "Error returned: " << PQerrorMessage(conn) << endl;
exit(1);
}
// normally db query would go here...
cout << "success!";
}
int main(int argc, const char* argv[] ) {
cout << "start\n";
LoadWaterBody (argv[1], argv[2]);
}