—#!/usr/bin/perl
##---------------------------------------------------------------------------##
## File:
## $Id: mha-dbrecover,v 1.8 2003/07/20 03:24:38 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"/
;
}
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;
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::compute_follow_ups(\
@mhonarc::MListOrder
);
mhonarc::compute_threads();
## Output recovered database file
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