Skip site navigation (1) Skip section navigation (2)

Re: initdb in C

From: Andrew Dunstan <andrew(at)dunslane(dot)net>
To:
Cc: PostgreSQL Win32 port list <pgsql-hackers-win32(at)postgresql(dot)org>,"Patches (PostgreSQL)" <pgsql-patches(at)postgresql(dot)org>
Subject: Re: initdb in C
Date: 2003-11-08 19:00:29
Message-ID: 3FAD3D4D.7030000@dunslane.net (view raw or flat)
Thread:
Lists: pgsql-hackerspgsql-hackers-win32pgsql-patches

Bruce Momjian wrote:

>
>
>I ran some tests using XP "CMD" and found:
>
>	"C:\test"
>and
>	"\test"
>
>works but:
>
>	"test"
>
>does not work.  Since I see that the output always has a leading path,
>

On Windows, pgpath is guaranteed to be a full path (see call to 
expanded_path() ) exactly so it works inside quotes using the Windows 
command processor.

> I
>have modified the code to do:
>
>    printf("\nSuccess. You can now start the database server using:\n\n"
>           "    %s%s%s/postmaster -D %s%s%s\n"
>           "or\n"
>           "    %s%s%s/pg_ctl -D %s%s%s -l logfile start\n\n",
>            QUOTE_PATH, pgpath, QUOTE_PATH, QUOTE_PATH, pg_data, QUOTE_PATH,
>            QUOTE_PATH, pgpath, QUOTE_PATH, QUOTE_PATH, pg_data, QUOTE_PATH);
>
>I am attaching the updated initdb.c file.
>
>  
>

The problem with this is that you now have 2 quoted strings. This is 
exactly the problem that I solved inside initdb by passing pg_data via 
the environment rather than on the command line. "help cmd" on XP gives 
you this info:

If /C or /K is specified, then the remainder of the command line after
the switch is processed as a command line, where the following logic is
used to process quote (") characters:

    1.  If all of the following conditions are met, then quote characters
        on the command line are preserved:

        - no /S switch
        - exactly two quote characters
        - no special characters between the two quote characters,
          where special is one of: &<>()@^|
        - there are one or more whitespace characters between the
          the two quote characters
        - the string between the two quote characters is the name
          of an executable file.

    2.  Otherwise, old behavior is to see if the first character is
        a quote character and if so, strip the leading character and
        remove the last quote character on the command line, preserving
        any text after the last quote character.

It is amazingly brain dead and cost me hours and hours of grief trying 
to work out WTF was going on.

Offhand I can't think of a simple guaranteed to work command line for 
the Windows message.

In the last resort we might need to look at having initdb create a .bat 
file or two for us.

:-(((

cheers

andrew


In response to

Responses

pgsql-hackers by date

Next:From: Andrew DunstanDate: 2003-11-08 19:20:07
Subject: Re: initdb in C
Previous:From: Tom LaneDate: 2003-11-08 18:44:42
Subject: Re: Making PostgreSQL 7.4 (CVS) work properly on OS X 10.3 (7B85)

pgsql-patches by date

Next:From: Andrew DunstanDate: 2003-11-08 19:20:07
Subject: Re: initdb in C
Previous:From: Andrew DunstanDate: 2003-11-08 18:00:56
Subject: Re: [PATCHES] initdb in C

pgsql-hackers-win32 by date

Next:From: Andrew DunstanDate: 2003-11-08 19:20:07
Subject: Re: initdb in C
Previous:From: Andrew DunstanDate: 2003-11-08 18:00:56
Subject: Re: [PATCHES] initdb in C

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group