Re: pg_service.conf ignores dbname parameter - Mailing list pgsql-bugs
| From | Bruce Momjian |
|---|---|
| Subject | Re: pg_service.conf ignores dbname parameter |
| Date | |
| Msg-id | 200312192150.hBJLoVq07836@candle.pha.pa.us Whole thread Raw |
| In response to | pg_service.conf ignores dbname parameter (Michael Fuhr <mfuhr@fuhr.org>) |
| Responses |
Re: pg_service.conf ignores dbname parameter
|
| List | pgsql-bugs |
I have applied the attached patch to remove the default
dbname=serive-name code, changed the comment at the top of the file, and
changed a few ints to booleans.
---------------------------------------------------------------------------
Michael Fuhr wrote:
> ============================================================================
> POSTGRESQL BUG REPORT TEMPLATE
> ============================================================================
>
> Your name : Michael Fuhr
> Your email address : mfuhr@fuhr.org
>
>
> System Configuration
> ---------------------
> Architecture (example: Intel Pentium) : several
>
> Operating System (example: Linux 2.0.26 ELF) : several
>
> PostgreSQL version (example: PostgreSQL-7.4): PostgreSQL-7.4
>
> Compiler used (example: gcc 2.95.2) : several
>
>
> Please enter a FULL description of your problem:
> ------------------------------------------------
>
> When a client connects to the database server using a service name,
> the dbname parameter in pg_service.conf is ignored. In the absence
> of an explicitly-named database in the connection string, the service
> name is used as the database name regardless of that service's
> dbname setting.
>
>
> Please describe a way to repeat the problem. Please try to provide a
> concise reproducible example, if at all possible:
> ----------------------------------------------------------------------
>
> 1. Create/edit pg_service.conf in whatever directory it's supposed
> to be in on your system (location varies). Add the following (change
> the database and user names as appropriate for your system):
>
> [foobar]
> dbname=template1
> user=postgres
>
> 2. Connect to the database server using the "foobar" service. The
> following example should work on most Unix-like systems (you may
> or may not be prompted for a password, depending on your configuration):
>
> % env PGSERVICE=foobar psql
> Password: ********
> psql: FATAL: database "foobar" does not exist
>
>
> If you know how this problem might be fixed, list the solution below:
> ---------------------------------------------------------------------
>
> The problem appears to be in the parseServiceInfo() function in
> src/interfaces/libpq/fe-connect.c. Here's an excerpt from that
> function:
>
> /*
> * If not already set, set the database name to the
> * name of the service
> */
> for (i = 0; options[i].keyword; i++)
> {
> if (strcmp(options[i].keyword, "dbname") == 0)
> {
> if (options[i].val == NULL)
> options[i].val = strdup(service);
> break;
> }
> }
>
> /*
> * Set the parameter --- but don't override any
> * previous explicit setting.
> */
> found_keyword = 0;
> for (i = 0; options[i].keyword; i++)
> {
> if (strcmp(options[i].keyword, key) == 0)
> {
> if (options[i].val == NULL)
> options[i].val = strdup(val);
> found_keyword = 1;
> break;
> }
> }
>
> Since the database name is already set to be either the service
> name or an explicitly named database from the connection string,
> the "Set the parameter" section of code skips the dbname parameter.
> I haven't yet examined the rest of the code closely enough to come
> up with the correct patch, but it seems that the "set the database
> name to the name of the service" code should be deferred until
> after all of the service's parameters have been read.
>
> --
> Michael Fuhr
>
> ---------------------------(end of broadcast)---------------------------
> TIP 8: explain analyze is your friend
>
--
Bruce Momjian | http://candle.pha.pa.us
pgman@candle.pha.pa.us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/interfaces/libpq/fe-connect.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-connect.c,v
retrieving revision 1.264
diff -c -c -r1.264 fe-connect.c
*** src/interfaces/libpq/fe-connect.c 29 Nov 2003 19:52:11 -0000 1.264
--- src/interfaces/libpq/fe-connect.c 19 Dec 2003 21:18:13 -0000
***************
*** 2367,2373 ****
{
char *service = conninfo_getval(options, "service");
char *serviceFile = SYSCONFDIR "/pg_service.conf";
! int group_found = 0;
int linenr = 0,
i;
--- 2367,2373 ----
{
char *service = conninfo_getval(options, "service");
char *serviceFile = SYSCONFDIR "/pg_service.conf";
! bool group_found = false;
int linenr = 0,
i;
***************
*** 2431,2439 ****
if (strncmp(line + 1, service, strlen(service)) == 0 &&
line[strlen(service) + 1] == ']')
! group_found = 1;
else
! group_found = 0;
}
else
{
--- 2431,2439 ----
if (strncmp(line + 1, service, strlen(service)) == 0 &&
line[strlen(service) + 1] == ']')
! group_found = true;
else
! group_found = false;
}
else
{
***************
*** 2445,2451 ****
*/
char *key,
*val;
! int found_keyword;
key = line;
val = strchr(line, '=');
--- 2445,2451 ----
*/
char *key,
*val;
! bool found_keyword;
key = line;
val = strchr(line, '=');
***************
*** 2461,2491 ****
*val++ = '\0';
/*
- * If not already set, set the database name to the
- * name of the service
- */
- for (i = 0; options[i].keyword; i++)
- {
- if (strcmp(options[i].keyword, "dbname") == 0)
- {
- if (options[i].val == NULL)
- options[i].val = strdup(service);
- break;
- }
- }
-
- /*
* Set the parameter --- but don't override any
* previous explicit setting.
*/
! found_keyword = 0;
for (i = 0; options[i].keyword; i++)
{
if (strcmp(options[i].keyword, key) == 0)
{
if (options[i].val == NULL)
options[i].val = strdup(val);
! found_keyword = 1;
break;
}
}
--- 2461,2477 ----
*val++ = '\0';
/*
* Set the parameter --- but don't override any
* previous explicit setting.
*/
! found_keyword = false;
for (i = 0; options[i].keyword; i++)
{
if (strcmp(options[i].keyword, key) == 0)
{
if (options[i].val == NULL)
options[i].val = strdup(val);
! found_keyword = true;
break;
}
}
Index: src/interfaces/libpq/pg_service.conf.sample
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/pg_service.conf.sample,v
retrieving revision 1.1
diff -c -c -r1.1 pg_service.conf.sample
*** src/interfaces/libpq/pg_service.conf.sample 3 Feb 2003 14:24:07 -0000 1.1
--- src/interfaces/libpq/pg_service.conf.sample 19 Dec 2003 21:18:13 -0000
***************
*** 5,16 ****
# multiple services in this file. Each starts with a service name in
# brackets. Subsequent lines have connection configuration parameters of
# the pattern "param=value". A sample configuration for template1 is
! # included in this file. If no database name is specified, it is assumed
! # to match the service name. Lines beginning with '#' are comments.
#
# Copy this to your sysconf directory (typically /usr/local/pgsql/etc) and
# rename it pg_service.conf.
#
#
#[template1]
#user=postgres
--- 5,16 ----
# multiple services in this file. Each starts with a service name in
# brackets. Subsequent lines have connection configuration parameters of
# the pattern "param=value". A sample configuration for template1 is
! # included in this file. Lines beginning with '#' are comments.
#
# Copy this to your sysconf directory (typically /usr/local/pgsql/etc) and
# rename it pg_service.conf.
#
#
#[template1]
+ #dbname=template1
#user=postgres
pgsql-bugs by date: