#!/usr/bin/perl
##---------------------------------------------------------------------------##
##  File:
##	$Id: mha-dbrecover,v 1.9 2009/05/03 20:11:27 ehood Exp $
##  Author:
##      Earl Hood       mhonarc@mhonarc.org
##  Description:
##      Program to rebuild the MHonArc database file from message files.
##---------------------------------------------------------------------------##
##    MHonArc -- Internet mail-to-HTML converter
##    Copyright (C) 1998,2001	Earl Hood, mhonarc@mhonarc.org
##
##    This program is free software; you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation; either version 2 of the License, or
##    (at your option) any later version.
##
##    This program is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with this program; if not, write to the Free Software
##    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
##    02111-1307, USA
##---------------------------------------------------------------------------##

package mha_dbrecover;

use Getopt::Long;

##---------------------------------------------------------------------------##
##				Main routine				     ##
##---------------------------------------------------------------------------##

MAIN: {
    unshift(@INC, 'lib');    # Should I leave this line in?

    ## Grab options from @ARGV unique to this program
    my %opts = ();
    Getopt::Long::Configure('pass_through');
    GetOptions(\%opts, 'dbr-startnum=i', 'dbr-endnum=i');
    my $startnum = $opts{'dbr-startnum'} || 0;
    my $endnum   = $opts{'dbr-endnum'}   || -1;

    ## Reset pass-through of options
    Getopt::Long::Configure('no_pass_through');

    ## Initialize MHonArc
    require 'mhamain.pl' || die qq/ERROR: Unable to require "mhamain.pl"\n/;
    mhonarc::initialize();

    ## Load library for reading message files
    require 'mhmsgfile.pl'
        || die qq/ERROR: Unable to require "mhmsgfile.pl"\n/;

    ## Open archive: We use special -noarg option to tell mhonarc
    ## to not do any processing, just open archive and lock it.
    unshift(@ARGV, '-noarg', '-lock');
    if (!mhonarc::open_archive()) {
        # unable to open, so abort processing
        die "ERROR: Unable to open archive\n";
    }

    ## do it
    eval {
        local (*DIR);
        if (!opendir(DIR, $mhonarc::OUTDIR)) {
            # unable to open archive directory
            die qq/ERROR: Unable to open "$mhonarc::OUTDIR": $!\n"/;
        }

        print STDOUT "Rebuilding database in $mhonarc::OUTDIR ...\n"
            unless $mhonarc::QUIET;

        ## Define regular expressing for matching message files:
        ## we use message prefix and extension settings as defined
        ## by mhonarc.  Make sure to capture message number from
        ## filename.
        my $msgrex = '^'
            . "\Q$mhonarc::MsgPrefix"
            . '(\d+)\.'
            . "\Q$mhonarc::HtmlExt" . '$';
        local ($_);
        my (@file);

        foreach (readdir(DIR)) {
            # skip if not a message file
            next unless /$msgrex/o;
            # skip if number less than start
            next if $1 < $startnum;
            # skip if number greater than end
            next if ($endnum >= 0) && ($1 > $endnum);

            # add file to list to process
            push @file, $_;
        }
        closedir(DIR);
        if (!@file) {
            # nothing found to process
            die qq/ERROR: No message files found\n/;
        }

        ## Read files.  Use function in mhmsgfile.pl to extract data.
        my ($file, $num);
        foreach (@file) {
            # get number for loading into mhonarc data structures
            ($num) = $_ =~ /$msgrex/o;
            print STDOUT "." unless $mhonarc::QUIET;
            $file = join($mhonarc::DIRSEP, $mhonarc::OUTDIR, $_);
            # load date from message file into mhonarc
            mhonarc::load_data_from_msg_file($file, $num);
        }

        ## Define other data structures that need to be recovered.
        $mhonarc::NumOfMsgs  = scalar(@file);
        @mhonarc::MListOrder = mhonarc::sort_messages();
        $mhonarc::LastMsgNum = mhonarc::get_last_msg_num();
        mhonarc::compute_follow_ups(\@mhonarc::MListOrder);
        mhonarc::compute_threads();

        ## Output recovered database file
        print STDOUT "\nWriting database ...\n"
            unless $mhonarc::QUIET;
        mhonarc::output_db($mhonarc::DBPathName);
    };
    my $ec = 0;
    if ($@) { warn $@; $ec = 1; }

    mhonarc::close_archive();
    exit($ec);
}

##---------------------------------------------------------------------------##
1;

__END__

=head1 NAME

mha-dbrecover - rebuild a MHonArc archive database

=head1 SYNOPSIS

S<B<mha-dbrecover> [I<options>]>

=head1 DESCRIPTION

B<mha-dbrecover> is a utility program that is part of the B<MHonArc>
software package.  The program allows can be used to rebuild a
B<MHonArc> archive database from the HTML message files.  This allows
database recovery if the database gets corrupted or accidentally
deleted.

The documentation for B<MHonArc> is distributed in HTML format.
Due to its size and organization, it is not suited for manpage
format.  Consult your system administrator for where the documentation
has been installed, or see L<"AVAILABILITY"> on where you can
access the documentation on the web.

=head1 OPTIONS

B<mha-dbrecover> takes all the options available to B<mhonarc> along
with the following additional options:

=over

=item C<-dbr-startnum> I<#>

The starting message number to recover data from.  This option is
useful if you have many message files in a directory, but you only
want to recover a subset of the files.

If this option is not specified, the starting number is 0.

=item C<-dbr-endnum> I<#>

The ending message number to recover data from.  This option is
useful if you have many message files in a directory, but you only
want to recover a subset of the files.

If this option is not specified, all messages starting from
C<-dbr-startnum> will be recovered.

=back

B<NOTE:> Only a subset of the options available to B<mhonarc>
are actually supported since many options are not applicable for
recovering operations.

=head1 AVAILABILITY

E<lt>I<http://www.mhonarc.org/>E<gt>

=head1 AUTHOR

Earl Hood, mhonarc@mhonarc.org

MHonArc comes with ABSOLUTELY NO WARRANTY and MHonArc may be copied only
under the terms of the GNU General Public License, which may be found in
the MHonArc distribution.

=cut

