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 [EMAIL PROTECTED] > -- Bruce Momjian | http://candle.pha.pa.us [EMAIL PROTECTED] | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073 ---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])