]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
From: "Dr. Michael Meskes" <meskes@online-club.de>
authorMarc G. Fournier <scrappy@hub.org>
Tue, 7 Jul 1998 18:00:09 +0000 (18:00 +0000)
committerMarc G. Fournier <scrappy@hub.org>
Tue, 7 Jul 1998 18:00:09 +0000 (18:00 +0000)
My first try at libpq. This one enables the two styles we agreed upon for
database descriptors.

src/interfaces/libpq/fe-connect.c

index 61adfceace6afa5c760e2bfc35fe62f579bd9d01..672948a287a4bd5d1702eec9b6a0c5dedf26a62e 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.71 1998/07/03 04:29:04 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.72 1998/07/07 18:00:09 scrappy Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -393,6 +393,101 @@ PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, cons
 }
 
 
+/*
+ * update_db_info -
+ * get all additional infos out of dbName
+ *
+ */
+static int
+update_db_info(PGconn *conn)
+{
+       char *tmp, *old = conn->dbName;
+       
+       if (strchr(conn->dbName, '@') != NULL)
+       {
+               /* old style: dbname[@server][:port] */
+               tmp = strrchr(conn->dbName, ':');
+               if (tmp != NULL) /* port number given */
+               {
+                       conn->pgport = strdup(tmp + 1);
+                       *tmp = '\0';
+               }
+               
+               tmp = strrchr(conn->dbName, '@');
+               if (tmp != NULL) /* host name given */
+               {
+                       conn->pghost = strdup(tmp + 1);
+                       *tmp = '\0';
+               }
+       
+               conn->dbName = strdup(old);
+               free(old);
+       }
+       else
+       {
+               int offset;
+               
+               /*
+              * only allow protocols tcp and unix
+              */
+               if (strncmp(conn->dbName, "tcp:", 4) == 0)
+                       offset = 4;
+               else if (strncmp(conn->dbName, "unix:", 5) == 0)
+                       offset = 5;
+               else return 0;
+                       
+               if (strncmp(conn->dbName + offset, "postgresql://", strlen("postgresql://")) == 0)
+               {
+                       /* new style: <tcp|unix>:postgresql://server[:port][/dbname][?options] */
+                       offset += strlen("postgresql://");
+                       
+                       tmp = strrchr(conn->dbName + offset, '?');
+                       if (tmp != NULL) /* options given */
+                       {
+                               conn->pgoptions = strdup(tmp + 1);
+                               *tmp = '\0';
+                       }
+               
+                       tmp = strrchr(conn->dbName + offset, '/');
+                       if (tmp != NULL) /* database name given */
+                       {
+                               conn->dbName = strdup(tmp + 1);
+                               *tmp = '\0';
+                       }
+                       else
+                       {
+                               if ((tmp = getenv("PGDATABASE")) != NULL)
+                                       conn->dbName = strdup(tmp);
+                               else if (conn->pguser)
+                                       conn->dbName = strdup(conn->pguser);
+                       }
+               
+                       tmp = strrchr(old + offset, ':');
+                       if (tmp != NULL) /* port number given */
+                       {
+                               conn->pgport = strdup(tmp + 1);
+                               *tmp = '\0';
+                       }
+               
+                       if (strncmp(old, "unix:", 5) == 0)
+                       {
+                               conn->pghost = NULL;
+                               if (strcmp(old + offset, "localhost") != 0)
+                               {
+                                       (void) sprintf(conn->errorMessage,
+                                          "connectDB() -- non-tcp access only possible on localhost\n");
+                                        return 1;
+                               }
+                       }
+                       else conn->pghost = strdup(old + offset);
+       
+                       free(old);
+               }
+       }
+       
+       return 0;
+}
+
 /*
  * connectDB -
  * make a connection to the backend so it is ready to receive queries.
@@ -414,6 +509,12 @@ connectDB(PGconn *conn)
        char            beresp;
        int                     on = 1;
 
+       /* 
+       * parse dbName to get all additional info in it, if any
+       */
+       if (update_db_info(conn) != 0)
+               goto connect_errReturn;
+               
        /*
         * Initialize the startup packet.
         */