X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=run.pl;h=cd940c9a67878979ed424f24f100edd0d8e4b9f4;hb=HEAD;hp=8c04c91f360af3daea256d7d1349e8dff1d6bf9d;hpb=3572c5a9c77b341e8a0e101df1e3a1065d6a4a36;p=webpac2 diff --git a/run.pl b/run.pl index 8c04c91..cd940c9 100755 --- a/run.pl +++ b/run.pl @@ -11,7 +11,7 @@ use WebPAC::Parser 0.08; use WebPAC::Input 0.16; use WebPAC::Store 0.15; use WebPAC::Normalize 0.22; -use WebPAC::Output::TT; +#use WebPAC::Output::TT; use WebPAC::Validate 0.11; use WebPAC::Output::MARC; use WebPAC::Config; @@ -22,8 +22,8 @@ use File::Slurp; use Data::Dump qw/dump/; use Storable qw/dclone/; use Pod::Usage qw/pod2usage/; +use LWP::Simple qw//; -use Proc::Queue size => 1; use POSIX ":sys_wait_h"; # imports WNOHANG =head1 NAME @@ -86,6 +86,10 @@ You can use this option as C<--no-marc-generate> to disable MARC generation. By default turned on if normalisation file has C directives. You can disable lint messages with C<--no-marc-lint>. +=item --marc-xml + +Creeate MARCXML file (this can be quite large) + =item --marc-dump Force dump or input and marc record for debugging. @@ -103,6 +107,10 @@ Create just links Create merged index of databases which have links +=item --mirror http://www.example.com + +Tries to download input path files from mirror URI + =back =cut @@ -118,11 +126,13 @@ my $stats = 0; my $validate_path; my $validate_delimiters_path; my $marc_generate = 1; -my $marc_lint = 1; +my $marc_lint = 0; my $marc_dump = 0; +my $marc_xml = 0; my $parallel = 0; my $only_links = 0; my $merge = 0; +my $mirror; my $help; my $log = _new WebPAC::Common()->_get_logger(); @@ -141,9 +151,11 @@ GetOptions( "marc-generate!" => \$marc_generate, "marc-lint!" => \$marc_lint, "marc-dump!" => \$marc_dump, + "marcxml!" => \$marc_xml, "parallel=i" => \$parallel, "only-links!" => \$only_links, "merge" => \$merge, + "mirror=s" => \$mirror, "help" => \$help, ); @@ -153,6 +165,8 @@ pod2usage(-verbose => 2) if ($help); my $config = new WebPAC::Config( path => $config_path ); +WebPAC::Normalize::_debug( $debug - 1 ) if $debug > 1; + #print "config = ",dump($config) if ($debug); die "no databases in config file!\n" unless ($config->databases); @@ -205,6 +219,8 @@ my $start_t = time(); my @links; if ($parallel) { + eval 'use Proc::Queue size => 1;'; + die $@ if $@; $log->info("Using $parallel processes for speedup"); Proc::Queue::size($parallel); } @@ -326,12 +342,15 @@ foreach my $database ( sort keys %{ $config->databases } ) { # add database to arugemnts for output filter $output->{database} = $database; + $output->{clean} = $clean; $log->debug("calling $module->new(",dump( $output ),")"); my $out = new $module->new( $output ); - $out->init; - - push @output_modules, $out; + if ( $out->init ) { + push @output_modules, $out; + } else { + $log->warn("SKIPPED $module"); + } } @@ -344,11 +363,33 @@ foreach my $database ( sort keys %{ $config->databases } ) { $log->info("database $database doesn't have inputs defined"); } ); + if ( -e 'out/debug' ) { # FIXME flag? + my $out; + foreach my $i ( @inputs ) { + warn dump( $i ); + next unless defined $i->{normalize}; + warn dump( $i->{normalize} ); + foreach my $normalize ( @{ $i->{normalize} } ) { + my $path = $normalize->{path}; + $out .= qq/\n##\n## $path\n##\n\n/; + $out .= read_file( $path ); + } + } + my $all = "out/debug/all-normalize.pl"; + write_file( $all, $out ); + warn "### all normalize for this input saved to: $all"; + }; + foreach my $input (@inputs) { my $input_name = $input->{name} || $log->logdie("input without a name isn't valid: ",dump($input)); - next if ($only_input && ($input_name !~ m#$only_input#i && $input->{type} !~ m#$only_input#i)); + if ( $input->{skip} ) { + $log->info("skip $input_name"); + next; + } + + next if defined $only_input && $input_name !~ m#$only_input#i; my $type = lc($input->{type}); @@ -365,7 +406,7 @@ foreach my $database ( sort keys %{ $config->databases } ) { my @lookups = $parser->have_lookup_create($database, $input); - $log->info("working on input '$input_name' in $input->{path} [type: $input->{type}] using $input_module", + $log->info("working on $database/$input_name with $input_module on $input->{path}", @lookups ? " creating lookups: ".join(", ", @lookups) : "" ); @@ -375,11 +416,26 @@ foreach my $database ( sort keys %{ $config->databases } ) { delete($input->{modify_file}); } + if ( $mirror ) { + my $path = $input->{path} || die "no input path in ",dump( $input ); + + my $base = $path; + $base =~ s{/[^/]+$}{}; + mkpath $base unless -e $base; + + my $rc = LWP::Simple::mirror( "$mirror/$path", $path ); + if (LWP::Simple::is_error( $rc )) { + die "can't mirror $mirror/$path -> $path [$rc]"; + } else { + $log->info( "mirror ", $path, " [$rc] ", -s $path, " bytes" ); + } + + } + my $input_db = new WebPAC::Input( module => $input_module, - encoding => $config->webpac('webpac_encoding'), limit => $limit || $input->{limit}, - offset => $offset, + offset => $offset || $input->{offset}, recode => $input->{recode}, stats => $stats, modify_records => $input->{modify_records}, @@ -422,7 +478,7 @@ foreach my $database ( sort keys %{ $config->databases } ) { my $maxmfn = $input_db->open( path => $input->{path}, - code_page => $input->{encoding}, # database encoding + input_encoding => $input->{encoding}, # database encoding lookup_coderef => $lookup_coderef, lookup => $lookup_jar, %{ $input }, @@ -463,7 +519,9 @@ foreach my $database ( sort keys %{ $config->databases } ) { my $report_fh; if ($stats || $validate) { - my $path = "out/report/${database}-${input_name}.txt"; + my $out_report = 'out/report'; # FIXME move to config + mkpath $out_report unless -e $out_report; + my $path = "$out_report/${database}-${input_name}.txt"; open($report_fh, '>', $path) || $log->logdie("can't open $path: $!"); print $report_fh "Report for database '$database' input '$input_name' records ", @@ -478,14 +536,24 @@ foreach my $database ( sort keys %{ $config->databases } ) { my $marc; if ($marc_generate && $parser->have_rules( 'marc', $database, $input_name )) { + + my $out_marc = 'out/marc'; # FIXME move to config + mkpath $out_marc unless -e $out_marc; + $marc = new WebPAC::Output::MARC( - path => "out/marc/${database}-${input_name}.marc", + path => "$out_marc/${database}-${input_name}", lint => $marc_lint, dump => $marc_dump, + marcxml => $marc_xml, ); } - my $rules = $parser->normalize_rules($database,$input_name) || $log->logdie("no normalize rules found for $database/$input_name"); + my $rules = $parser->normalize_rules($database,$input_name); + if ( ! $rules ) { + $log->logwarn("no normalize rules for $database/$input_name", $input_db->input_module->can('normalize') ? " using normalize from input module" : ''); + next; + } + $log->debug("parsed normalize rules:\n$rules"); # reset position in database @@ -545,6 +613,9 @@ foreach my $database ( sort keys %{ $config->databases } ) { push @{ $row->{'000'} }, $pos; } + foreach my $out ( @output_modules ) { + $out->add_row( $mfn, $row ) if $out->can('add_row'); + } if ($validate) { if ( my $errors = $validate->validate_rec( $row, $input_db->dump_ascii ) ) { @@ -555,26 +626,33 @@ foreach my $database ( sort keys %{ $config->databases } ) { next; # validation doesn't create any output } - my $ds = WebPAC::Normalize::data_structure( - row => $row, - rules => $rules, - lookup => $lookup_hash, - config => create_ds_config( $db_config, $database, $input, $mfn ), - marc_encoding => 'utf-8', - load_row_coderef => sub { - my ($database,$input,$mfn) = @_; + my $ds; + + if ($rules) { + + $ds = WebPAC::Normalize::data_structure( + row => $row, + rules => $rules, + lookup => $lookup_hash, + config => create_ds_config( $db_config, $database, $input, $mfn ), + marc_encoding => 'utf-8', + load_row_coderef => sub { + my ($database,$input,$mfn) = @_; #warn "### load_row($database,$input,$mfn) from data_structure\n"; - return $store->load_row( - database => $database, - input => $input, - id => $mfn, - ); - }, - ); + return $store->load_row( + database => $database, + input => $input, + id => $mfn, + ); + }, + ); - $log->debug("ds = ", sub { dump($ds) }); + } elsif ( $input_db->input_module->can('normalize') ) { + $ds = $input_db->input_module->normalize( $mfn ); + } if ( $ds ) { + $log->debug("ds = ", sub { dump($ds) }); $store->save_ds( database => $database, @@ -596,7 +674,6 @@ foreach my $database ( sort keys %{ $config->databases } ) { } else { $log->warn("record $pos didn't produce any output after normalization rules!") unless $marc; } - if ($marc) { my $i = 0; @@ -641,7 +718,7 @@ foreach my $database ( sort keys %{ $config->databases } ) { close($report_fh) if ($report_fh); } - eval { $indexer->finish } if ($indexer && $indexer->can('finish')); + $indexer->finish if $indexer && $indexer->can('finish'); foreach my $out ( @output_modules ) { $out->finish if $out->can('finish');