Re: Cannot initdb in cvs tip - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: Cannot initdb in cvs tip
Date
Msg-id 200407201836.i6KIaER11446@candle.pha.pa.us
Whole thread Raw
In response to Re: Cannot initdb in cvs tip  ("Andrew Dunstan" <andrew@dunslane.net>)
List pgsql-hackers
Seems it might be time to address this and get it fixed.  Win32 doesn't
clean up the directory structure under /data and leave /data unchanged,
and there is no way to do this with a system() command on Win32.

I resisted adding a C version of rmtree during Win32 development because
I was concerned about disturbing the Unix behavior, but at this point I
think we should just move ahead and add a /port function for this and
remove the system() backend and initdb calls to 'rm' for directories.

---------------------------------------------------------------------------

Andrew Dunstan wrote:
> John Hansen said:
> > On Sun, 2004-06-20 at 08:04, Dave Page wrote:
> >> > > although it says it's clearing the contents of the directory, in
> >> > > actual fact it leaves the directory structure in place, thus a
> >> > > subsequent initdb will not run without a manual clearup.
> >> >
> >> > Hm.  The rmtree() function in initdb.c is responsible for
> >> > this, and I see it has WIN32-specific behavior, which is
> >> > evidently wrong.
> >> > Can you recommend a fix?
> >>
> >> The current solution does an "rmdir /q /s $PGDATA" if the datadir was
> >> created, and "del /q /s $PGDATA" if the directory already existed. The
> >> second case  will not work, as del will not remove directories.
> >> AFAICS, there is no easy way to do this using system() as rmdir won't
> >> accept wildcards, so we can't do "del $PGDATA/* && rmdir $PGDATA/*".
> >>
> >> It seems to me that the simple answer is to put Andrew's recursive
> >> unlink code back in (as he suggested), which Bruce removed as rm etc.
> >> were being used in commands/dbcommands.c (which should work fine under
> >> Windows). Patch below....
> >>
> >
> > you could of course rmdir /s /q $PGDATA && mkdir $PGDATA if the purpose
> > is to leave the directory intact if it already existed prior to
> > install.
> >
>
> No we can't. This was discussed months ago, IIRC. The user might very well
> not have the privileges necessary to delete the directory, and might not
> have the privileges to recreate it if they do.
>
> The direct recursive delete is not a lot of code, and I must confess I
> *hate* having C programs calling system() for such tasks. One of my goals
> in rewriting initdb in C was to avoid any calls at all to any external
> program other than postgres itself.
>
> cheers
>
> andrew
>
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
>

--
  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

pgsql-hackers by date:

Previous
From: Simon Riggs
Date:
Subject: Re: Why we really need timelines *now* in PITR
Next
From: Gaetano Mendola
Date:
Subject: check point segments leakage ?