--- trunk/run.pl 2007/11/28 11:14:44 1075 +++ trunk/run.pl 2009/05/18 18:47:22 1183 @@ -11,7 +11,7 @@ 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 Data::Dump qw/dump/; use Storable qw/dclone/; use Pod::Usage qw/pod2usage/; +use LWP::Simple; -use Proc::Queue size => 1; use POSIX ":sys_wait_h"; # imports WNOHANG =head1 NAME @@ -103,6 +103,10 @@ 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 @@ -123,6 +127,7 @@ my $parallel = 0; my $only_links = 0; my $merge = 0; +my $mirror; my $help; my $log = _new WebPAC::Common()->_get_logger(); @@ -144,6 +149,7 @@ "parallel=i" => \$parallel, "only-links!" => \$only_links, "merge" => \$merge, + "mirror=s" => \$mirror, "help" => \$help, ); @@ -207,6 +213,8 @@ my @links; if ($parallel) { + eval 'use Proc::Queue size => 1;'; + die $@ if $@; $log->info("Using $parallel processes for speedup"); Proc::Queue::size($parallel); } @@ -328,6 +336,7 @@ # 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 ); @@ -348,10 +357,32 @@ $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)); + if ( $input->{skip} ) { + $log->info("skip $input_name"); + next; + } + next if ($only_input && ($input_name !~ m#$only_input#i && $input->{type} !~ m#$only_input#i)); my $type = lc($input->{type}); @@ -379,9 +410,24 @@ 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 = mirror( "$mirror/$path", $path ); + if (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, recode => $input->{recode}, @@ -426,7 +472,7 @@ 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 }, @@ -489,7 +535,9 @@ ); } - 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); + $log->logwarn("no normalize rules for $database/$input_name") unless $rules; + $log->debug("parsed normalize rules:\n$rules"); # reset position in database @@ -559,46 +607,49 @@ 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) = @_; + if ($rules) { + + 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) = @_; #warn "### load_row($database,$input,$mfn) from data_structure\n"; - return $store->load_row( + return $store->load_row( + database => $database, + input => $input, + id => $mfn, + ); + }, + ); + + $log->debug("ds = ", sub { dump($ds) }); + + if ( $ds ) { + + $store->save_ds( database => $database, - input => $input, + input => $input_name, id => $mfn, - ); - }, - ); + ds => $ds, + ) if !$stats; - $log->debug("ds = ", sub { dump($ds) }); + $indexer->add( + id => "${input_name}/${mfn}", + ds => $ds, + type => $config->get($indexer_config)->{type}, + ) if $indexer; - if ( $ds ) { - - $store->save_ds( - database => $database, - input => $input_name, - id => $mfn, - ds => $ds, - ) if !$stats; - - $indexer->add( - id => "${input_name}/${mfn}", - ds => $ds, - type => $config->get($indexer_config)->{type}, - ) if $indexer; + foreach my $out ( @output_modules ) { + $out->add( $mfn, $ds ) if $out->can('add'); + } - foreach my $out ( @output_modules ) { - $out->add( $mfn, $ds ) if $out->can('add'); + } else { + $log->warn("record $pos didn't produce any output after normalization rules!") unless $marc; } - - } else { - $log->warn("record $pos didn't produce any output after normalization rules!") unless $marc; } if ($marc) { @@ -645,7 +696,7 @@ 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');