Interpret a dbName param to PQsetdbLogin as a conninfo string if it contains an ...
authorAndrew Dunstan
Tue, 19 Dec 2006 01:53:36 +0000 (01:53 +0000)
committerAndrew Dunstan
Tue, 19 Dec 2006 01:53:36 +0000 (01:53 +0000)
doc/src/sgml/libpq.sgml
doc/src/sgml/ref/psql-ref.sgml
src/interfaces/libpq/fe-connect.c

index 40d0bcb1fbdcd67a36ef3397bf0fbc1fcf213d5a..0fc0f76fd21ccb1a4bbbc4d2404ddfb50f3aca32 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
  
   <application>libpq</application> - C Library
@@ -324,13 +324,19 @@ PGconn *PQsetdbLogin(const char *pghost,
                      const char *login,
                      const char *pwd);
 
-
+    
 
-
-   This is the predecessor of PQconnectdb with a fixed
-   set of parameters.  It has the same functionality except that the
-   missing parameters will always take on default values.  Write NULL or an
-   empty string for any one of the fixed parameters that is to be defaulted.
+    
+     This is the predecessor of PQconnectdb with a fixed
+     set of parameters.  It has the same functionality except that the
+     missing parameters will always take on default values.  Write NULL or an
+     empty string for any one of the fixed parameters that is to be defaulted.
+   
+   
+     If the dbName contains an = sign, it
+    is taken as a conninfo string in exactly the same way as
+    if it had been passed to PQconnectdb, and the remaining
+    parameters are then applied as above.
    
   
  
index c3071752c71b57b9ff7d10abc0e26a01bdc92a16..cd92a21729461b17dc76628b3b023d5a687b8870 100644 (file)
@@ -1,5 +1,5 @@
 
 
@@ -113,6 +113,10 @@ PostgreSQL documentation
       class="parameter">dbname as the first non-option
       argument on the command line.
       
+     
+     If this parameter contains an = sign, it it treated as a
+     conninfo string. See  for more information.
+     
       
     
 
@@ -555,6 +559,18 @@ PostgreSQL documentation
     passwords. See  for more information.
     
 
+   
+    An alternative way to specify connection parameters is in a
+   conninfo string, which is used instead of a 
+   database name. This mechanism give you very wide control over the 
+   connection. For example,
+
+$ psql "service=myservice sslmode=require"
+
+    See  for more information on all the
+   available connection options.
+   
+
     
     If the connection could not be made for any reason (e.g., insufficient
     privileges, server is not running on the targeted host, etc.),
index eb6ab6127df61ec20fc6fe56b314d4069dec4439..5b29b60a6e1b9b2715a8299cb41bc9ddf38f99c3 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.339 2006/11/21 16:28:00 tgl Exp $
+ *   $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.340 2006/12/19 01:53:36 adunstan Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -574,16 +574,36 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions,
    conn = makeEmptyPGconn();
    if (conn == NULL)
        return NULL;
-
-   /*
-    * Parse an empty conninfo string in order to set up the same defaults
-    * that PQconnectdb() would use.
-    */
-   if (!connectOptions1(conn, ""))
-       return conn;
-
-   /*
-    * Absorb specified options into conn structure, overriding defaults
+    /*
+     * If the dbName parameter contains '=', assume it's a conninfo
+     * string.
+     */
+    if (dbName && strchr(dbName,'='))
+    {
+        if (!connectOptions1(conn, dbName))
+            return conn;
+    }
+    else
+    {
+        /*
+         * Old-style path: first, parse an empty conninfo string in
+         * order to set up the same defaults that PQconnectdb() would use.
+         */
+        if (!connectOptions1(conn, ""))
+            return conn;
+
+        /* Insert dbName parameter value into struct */
+        if (dbName && dbName[0] != '\0')
+        {
+            if (conn->dbName)
+                free(conn->dbName);
+            conn->dbName = strdup(dbName);
+        }
+    }
+
+    /*
+     * Insert remaining parameters into struct, overriding defaults
+     * (as well as any conflicting data from dbName taken as a conninfo).
     */
    if (pghost && pghost[0] != '\0')
    {
@@ -613,13 +633,6 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions,
        conn->pgtty = strdup(pgtty);
    }
 
-   if (dbName && dbName[0] != '\0')
-   {
-       if (conn->dbName)
-           free(conn->dbName);
-       conn->dbName = strdup(dbName);
-   }
-
    if (login && login[0] != '\0')
    {
        if (conn->pguser)