From 86dacdb74c20d8af6ec900b7cd163df031ab90e4 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Mon, 10 May 1999 15:27:19 +0000
Subject: [PATCH]   libpq++ uses fe_setauthsvc which is deprecated and results
 in an error on connection. This patch changes it to use PQconnectdb rather
 than {fe_setauthsvc,PQsetdb}. This still isn't the complete solution, as
 there is no provision for user,password in class PgEnv, but it does get rid
 of the error message. Tested with gcc version egcs-2.91.60 19981201
 (egcs-1.1.1 release) under NetBSD-1.3K/i386.

Cheers,

Patrick Welche
---
 doc/src/sgml/libpq.sgml                |  2 +-
 src/interfaces/libpq++/pgconnection.cc | 24 +++++++++++-------------
 src/interfaces/libpq++/pgenv.cc        | 18 +++++++++++++++++-
 src/interfaces/libpq++/pgenv.h         |  2 ++
 4 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml
index cbde3387fc3..3442185fd40 100644
--- a/doc/src/sgml/libpq.sgml
+++ b/doc/src/sgml/libpq.sgml
@@ -316,7 +316,7 @@ char *PQoptions(PGconn *conn)
          Returns the status of the connection. 
          The status can be CONNECTION_OK or CONNECTION_BAD.
 <synopsis>
-ConnStatusType *PQstatus(PGconn *conn)
+ConnStatusType PQstatus(PGconn *conn)
 </synopsis>
 </Para>
 
diff --git a/src/interfaces/libpq++/pgconnection.cc b/src/interfaces/libpq++/pgconnection.cc
index 96ef215700f..9cbdd896171 100644
--- a/src/interfaces/libpq++/pgconnection.cc
+++ b/src/interfaces/libpq++/pgconnection.cc
@@ -10,13 +10,14 @@
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgconnection.cc,v 1.2 1997/02/13 10:00:27 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgconnection.cc,v 1.3 1999/05/10 15:27:18 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
 
 #include <stdlib.h>
 #include <string.h>
+#include <strstream>
 #include "pgconnection.h"
 
 extern "C" {
@@ -88,21 +89,18 @@ ConnStatusType PgConnection::Connect(const char* dbName)
 	PQtrace(pgConn, debug);
     #endif
 
-    // Set Host Authentication service
-    char errorMessage[ERROR_MSG_LENGTH];
-    memset(errorMessage, 0, sizeof(errorMessage));
-    fe_setauthsvc(pgEnv.Auth(), errorMessage);
-    
     // Connect to the database
-    pgConn = PQsetdb(pgEnv.Host(), pgEnv.Port(), pgEnv.Option(), pgEnv.TTY(), dbName);
+    ostrstream conninfo;
+    conninfo << "dbname="<<dbName;
+    conninfo << pgEnv;
+    pgConn=PQconnectdb(conninfo.str());
+    conninfo.freeze(0);
     
-    // Return the connection status
-    if (errorMessage) {
-    	SetErrorMessage( errorMessage );
-        return CONNECTION_BAD;
+    if(ConnectionBad()) {
+    	SetErrorMessage( PQerrorMessage(pgConn) );
     }
-    else
-        return Status();
+
+    return Status();
 }
 
 // PgConnection::status -- return connection or result status
diff --git a/src/interfaces/libpq++/pgenv.cc b/src/interfaces/libpq++/pgenv.cc
index 451a4f3fde3..b7edbd12fe0 100644
--- a/src/interfaces/libpq++/pgenv.cc
+++ b/src/interfaces/libpq++/pgenv.cc
@@ -14,7 +14,7 @@
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgenv.cc,v 1.3 1997/02/13 10:00:33 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/interfaces/libpq++/Attic/pgenv.cc,v 1.4 1999/05/10 15:27:19 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -66,3 +66,19 @@ string PgEnv::getenv(const char* name)
   char* env = ::getenv(name);
   return (env ? env : "");
 }
+
+
+// Extract the PgEnv contents into a form suitable for PQconnectdb
+// which happens to be readable, hence choice of <<
+ostream& operator << (ostream &s, const PgEnv& a)
+{
+  s<<' '; // surround with whitespace, just in case
+  if(a.pgHost.length()  !=0)s<<" host="   <<a.pgHost;
+  if(a.pgPort.length()  !=0)s<<" port="   <<a.pgPort;
+  // deprecated: if(a.pgAuth.length()!=0)s<<" authtype="<<a.pgAuth;
+  if(a.pgOption.length()!=0)s<<" options="<<a.pgOption;
+  if(a.pgTty.length()   !=0)s<<" tty="    <<a.pgTty;
+  s<<' ';
+
+  return s;
+}
diff --git a/src/interfaces/libpq++/pgenv.h b/src/interfaces/libpq++/pgenv.h
index 43068aacce2..e3e8d6303b6 100644
--- a/src/interfaces/libpq++/pgenv.h
+++ b/src/interfaces/libpq++/pgenv.h
@@ -19,6 +19,7 @@
 #define PGENV_H
 
 #include <string>
+#include <iostream>
 
 #ifdef __sun__
 #ifndef __GNUC__
@@ -79,6 +80,7 @@ public:
                  
 protected:
   string getenv(const char*);
+  friend ostream& operator << (ostream &, const PgEnv&);
 };
 
 #endif	// PGENV_H
-- 
GitLab