Re: Use of 'cp -r' in CREATE DATABASE - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: Use of 'cp -r' in CREATE DATABASE
Date
Msg-id 200312120105.hBC15sr29145@candle.pha.pa.us
Whole thread Raw
In response to Re: Use of 'cp -r' in CREATE DATABASE  ("Nigel J. Andrews" <nandrews@investsystems.co.uk>)
List pgsql-hackers
Nigel J. Andrews wrote:
> On Thu, 11 Dec 2003, Alvaro Herrera wrote:
> 
> > On Thu, Dec 11, 2003 at 06:36:05PM -0500, Bruce Momjian wrote:
> > > Our dbcommands.c has for create database:
> > > 
> > >     snprintf(buf, sizeof(buf), "cp -r '%s' '%s'", src_loc, target_dir);
> > > 
> > [...]
> > > 
> > > I think we should switch to -R in our code.
> > 
> > But you will have to write special code for Win32, won't you?
> > Maybe it would be better to avoid using system commands
> > altogether and copy the whole thing using syscalls ...
> 
> That was my immediate thought. Unfortunately that means reinventing the
> wheel; or grabbing it from BSD or somewhere and distributing it with
> postgresql.

We already have in dbcommands.c:#ifndef WIN32    snprintf(buf, sizeof(buf), "cp -r '%s' '%s'", src_loc, target_dir);
if(system(buf) != 0)    {        if (remove_dbdirs(nominal_loc, alt_loc))            ereport(ERROR,
(errmsg("couldnot initialize database directory"),                     errdetail("Failing system command was: %s",
buf),                    errhint("Look in the postmaster's stderr log for more information.")));        else
ereport(ERROR,                   (errmsg("could not initialize database directory; delete failed as well"),
       errdetail("Failing system command was: %s", buf),                     errhint("Look in the postmaster's stderr
logfor more information.")));    }#else   /* WIN32 */    if (copydir(src_loc, target_dir) != 0)    {        /* copydir
shouldalready have given details of its troubles */        if (remove_dbdirs(nominal_loc, alt_loc))
ereport(ERROR,                   (errmsg("could not initialize database directory")));        else
ereport(ERROR,                   (errmsg("could not initialize database directory; delete failed as well")));
}#endif /* WIN32 */
 

so Win32 is already handled by copydir.  One reason we didn't implement
this in C is because there might be some OS-specific handling for copy. 
copydir() is in port/copydir.c and is for Win32 alone.

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


pgsql-hackers by date:

Previous
From: "Nigel J. Andrews"
Date:
Subject: Re: Use of 'cp -r' in CREATE DATABASE
Next
From: "Andrew Dunstan"
Date:
Subject: Re: Use of 'cp -r' in CREATE DATABASE