Thread: initdb.c::main() too large

initdb.c::main() too large

From
Bruce Momjian
Date:
In looking to add an fsync-only option to initdb, I found its main()
function to be 743 lines long, and very hard to understand.

The attached patch moves much of that code into separate functions,
which will make initdb.c easier to understand, and easier to add an
fsync-only option.  The original initdb.c author, Andrew Dunstan, has
accepted the restructuring, in principle.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +

Attachment

Re: initdb.c::main() too large

From
Tom Lane
Date:
Bruce Momjian <bruce@momjian.us> writes:
> In looking to add an fsync-only option to initdb, I found its main()
> function to be 743 lines long, and very hard to understand.

> The attached patch moves much of that code into separate functions,
> which will make initdb.c easier to understand, and easier to add an
> fsync-only option.  The original initdb.c author, Andrew Dunstan, has
> accepted the restructuring, in principle.

No objection to breaking it into multiple functions --- but I do say
it's a lousy idea to put the long_options[] constant at the front of
the file, thousands of lines away from the switch construct that it
has to be in sync with.  We don't do that in any other program AFAIR.
Keep that in the main() function, please.
        regards, tom lane



Re: initdb.c::main() too large

From
Bruce Momjian
Date:
On Thu, Nov 29, 2012 at 11:23:59PM -0500, Tom Lane wrote:
> Bruce Momjian <bruce@momjian.us> writes:
> > In looking to add an fsync-only option to initdb, I found its main()
> > function to be 743 lines long, and very hard to understand.
> 
> > The attached patch moves much of that code into separate functions,
> > which will make initdb.c easier to understand, and easier to add an
> > fsync-only option.  The original initdb.c author, Andrew Dunstan, has
> > accepted the restructuring, in principle.
> 
> No objection to breaking it into multiple functions --- but I do say
> it's a lousy idea to put the long_options[] constant at the front of
> the file, thousands of lines away from the switch construct that it
> has to be in sync with.  We don't do that in any other program AFAIR.
> Keep that in the main() function, please.

Good point.  I had not noticed that.  I fixed my initdb patch, and
adjusted a few other C files to be consistent.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + It's impossible for everything to be true. +



Re: initdb.c::main() too large

From
Bruce Momjian
Date:
On Thu, Nov 29, 2012 at 11:12:23PM -0500, Bruce Momjian wrote:
> In looking to add an fsync-only option to initdb, I found its main()
> function to be 743 lines long, and very hard to understand.
> 
> The attached patch moves much of that code into separate functions,
> which will make initdb.c easier to understand, and easier to add an
> fsync-only option.  The original initdb.c author, Andrew Dunstan, has
> accepted the restructuring, in principle.

Applied.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + It's impossible for everything to be true. +



Re: initdb.c::main() too large

From
Andrew Dunstan
Date:
On 11/30/2012 04:45 PM, Bruce Momjian wrote:
> On Thu, Nov 29, 2012 at 11:12:23PM -0500, Bruce Momjian wrote:
>> In looking to add an fsync-only option to initdb, I found its main()
>> function to be 743 lines long, and very hard to understand.
>>
>> The attached patch moves much of that code into separate functions,
>> which will make initdb.c easier to understand, and easier to add an
>> fsync-only option.  The original initdb.c author, Andrew Dunstan, has
>> accepted the restructuring, in principle.
> Applied.
>

Sorry I didn't have time to review this before it was applied.

A few minor nitpicks:
 * process() is a fairly uninformative function name, not sure what I'd   call it, but something more descriptive. *
thesetup_signals_and_umask() call and possibly the final message   section of process() would be better placed back in
main()IMNSHO. * the large statements for setting up the datadir and the xlogdir   should be factored out of process()
intotheir own functions, I   think. That would make it much more readable.
 

cheers

andrew




Re: initdb.c::main() too large

From
Bruce Momjian
Date:
On Fri, Nov 30, 2012 at 06:06:39PM -0500, Andrew Dunstan wrote:
> 
> On 11/30/2012 04:45 PM, Bruce Momjian wrote:
> >On Thu, Nov 29, 2012 at 11:12:23PM -0500, Bruce Momjian wrote:
> >>In looking to add an fsync-only option to initdb, I found its main()
> >>function to be 743 lines long, and very hard to understand.
> >>
> >>The attached patch moves much of that code into separate functions,
> >>which will make initdb.c easier to understand, and easier to add an
> >>fsync-only option.  The original initdb.c author, Andrew Dunstan, has
> >>accepted the restructuring, in principle.
> >Applied.
> >
> 
> Sorry I didn't have time to review this before it was applied.
> 
> A few minor nitpicks:
> 
>  * process() is a fairly uninformative function name, not sure what I'd
>    call it, but something more descriptive.
>  * the setup_signals_and_umask() call and possibly the final message
>    section of process() would be better placed back in main() IMNSHO.
>  * the large statements for setting up the datadir and the xlogdir
>    should be factored out of process() into their own functions, I
>    think. That would make it much more readable.

OK, I will make those changes.  Thanks.

--  Bruce Momjian  <bruce@momjian.us>        http://momjian.us EnterpriseDB
http://enterprisedb.com
 + It's impossible for everything to be true. +



Re: initdb.c::main() too large

From
Bruce Momjian
Date:
On Fri, Nov 30, 2012 at 06:06:39PM -0500, Andrew Dunstan wrote:
>
> On 11/30/2012 04:45 PM, Bruce Momjian wrote:
> >On Thu, Nov 29, 2012 at 11:12:23PM -0500, Bruce Momjian wrote:
> >>In looking to add an fsync-only option to initdb, I found its main()
> >>function to be 743 lines long, and very hard to understand.
> >>
> >>The attached patch moves much of that code into separate functions,
> >>which will make initdb.c easier to understand, and easier to add an
> >>fsync-only option.  The original initdb.c author, Andrew Dunstan, has
> >>accepted the restructuring, in principle.
> >Applied.
> >
>
> Sorry I didn't have time to review this before it was applied.
>
> A few minor nitpicks:
>
>  * process() is a fairly uninformative function name, not sure what I'd
>    call it, but something more descriptive.
>  * the setup_signals_and_umask() call and possibly the final message
>    section of process() would be better placed back in main() IMNSHO.
>  * the large statements for setting up the datadir and the xlogdir
>    should be factored out of process() into their own functions, I
>    think. That would make it much more readable.

Done with the attached patch.  I kept the signals in their own function,
but moved the umask() call out --- I was not happy mixing those either.

--
  Bruce Momjian  <bruce@momjian.us>        http://momjian.us
  EnterpriseDB                             http://enterprisedb.com

  + It's impossible for everything to be true. +

Attachment