Re: [pgsql-hackers-win32] initdb in C

From: Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us>
To: Andrew Dunstan <andrew(at)dunslane(dot)net>
Cc: PostgreSQL Win32 port list <pgsql-hackers-win32(at)postgresql(dot)org>, "Patches (PostgreSQL)" <pgsql-patches(at)postgresql(dot)org>
Subject: Re: [pgsql-hackers-win32] initdb in C
Date: 2003-11-08 17:38:37
Message-ID: 200311081738.hA8Hcbj21209@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-hackers-win32 pgsql-patches

Andrew Dunstan wrote:
> >Good. I can do rmdir() in C in port/dirmod.c if we need it. Right now
> >we are doing system(rm/rmdir) in dbcommands.c so we should consistent.
> >Let's stay with system(rm/rmdir) and if it doesn't work as we expect, we
> >can add your rmdir() code and put it in port/dirmod.c.
> >
> >
>
> In view of Peter's email of a few minutes ago I think we need to do that.

Again, recreate is only Win32. I just figured out how to do this on
Win32. We have to use 'del' rather than 'rmdir' to keep the directory:

New code is:

/*
* delete a directory tree recursively
* assumes path points to a valid directory
* deletes everything under path
* if rmtopdir is true deletes the directory too
*
*/
static bool
rmtree(char *path, bool rmtopdir)
{
char buf[MAXPGPATH + 64];

#ifndef WIN32
/* doesn't handle .* files */
snprintf(buf, sizeof(buf), "rm -rf '%s%s'", path,
rmtopdir ? "" : "/*");
#else
snprintf(buf, sizeof(buf), "%s /s /q \"%s\"",
rmtopdir ? "rmdir" : "del", path);
#endif

return !system(buf);
}

> > printf("\n"
> > "Success. You can now start the database server using:\n\n"
> > " %s/postmaster -D %s%s%s\n"
> > "or\n"
> > " %s/pg_ctl -D %s%s%s -l logfile start\n\n",
> > pgpath, QUOTE_PATH, pg_data, QUOTE_PATH,
> > pgpath, QUOTE_PATH, pg_data, QUOTE_PATH);
> >
> >(I also merged multiple \n into a single line.) My logic was that
> >spaces in directory names are much more common on WIN32, so we should
> >display the quotes only on WIN32. Perhaps you read "\"" as "\\"?
> >
> >
>
> Yes, I did. Sorry about that. But we also need to quote the path (the
> most obvious place to put it after all is "C:\Program
> Files\PostgreSQL"). In fact, that's more important than the data
> location. Unfortunately, the Windows command processor barfs on multiple
> quotes strings ;-(

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

--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073

Attachment Content-Type Size
unknown_filename text/plain 49.2 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Bruce Momjian 2003-11-08 17:39:41 Re: initdb in C
Previous Message Tom Lane 2003-11-08 17:27:57 Re: initdb in C

Browse pgsql-hackers-win32 by date

  From Date Subject
Next Message Bruce Momjian 2003-11-08 17:39:41 Re: initdb in C
Previous Message Tom Lane 2003-11-08 17:27:57 Re: initdb in C

Browse pgsql-patches by date

  From Date Subject
Next Message Bruce Momjian 2003-11-08 17:39:41 Re: initdb in C
Previous Message Tom Lane 2003-11-08 17:27:57 Re: initdb in C