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: