/[webpac2]/trunk/run.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/run.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 416 by dpavlin, Sun Feb 26 23:21:50 2006 UTC revision 1084 by dpavlin, Sun Dec 23 22:06:08 2007 UTC
# Line 4  use strict; Line 4  use strict;
4    
5  use Cwd qw/abs_path/;  use Cwd qw/abs_path/;
6  use File::Temp qw/tempdir/;  use File::Temp qw/tempdir/;
 use Data::Dumper;  
7  use lib './lib';  use lib './lib';
8    
9  use WebPAC::Common 0.02;  use WebPAC::Common 0.02;
10  use WebPAC::Lookup;  use WebPAC::Parser 0.08;
11  use WebPAC::Input 0.03;  use WebPAC::Input 0.16;
12  use WebPAC::Store 0.03;  use WebPAC::Store 0.15;
13  use WebPAC::Normalize::XML;  use WebPAC::Normalize 0.22;
14  use WebPAC::Output::TT;  use WebPAC::Output::TT;
15  use WebPAC::Output::Estraier '0.10';  use WebPAC::Validate 0.11;
16  use YAML qw/LoadFile/;  use WebPAC::Output::MARC;
17    use WebPAC::Config;
18  use Getopt::Long;  use Getopt::Long;
19  use File::Path;  use File::Path;
20  use Time::HiRes qw/time/;  use Time::HiRes qw/time/;
21    use File::Slurp;
22    use Data::Dump qw/dump/;
23    use Storable qw/dclone/;
24    use Pod::Usage qw/pod2usage/;
25    
26    use Proc::Queue size => 1;
27    use POSIX ":sys_wait_h"; # imports WNOHANG
28    
29  =head1 NAME  =head1 NAME
30    
# Line 25  run.pl - start WebPAC indexing Line 32  run.pl - start WebPAC indexing
32    
33  B<this command will probably go away. Don't get used to it!>  B<this command will probably go away. Don't get used to it!>
34    
35  Options:  =head1 OPTIONS
36    
37  =over 4  =over 4
38    
# Line 41  limit loading to 100 records Line 48  limit loading to 100 records
48    
49  remove database and Hyper Estraier index before indexing  remove database and Hyper Estraier index before indexing
50    
51  =item --one=database_name  =item --only=database_name/input_filter
52    
53    reindex just single database (legacy name is --one)
54    
55  reindex just single database  C</input_filter> is optional part which can be C<name>
56    or C<type> from input
57    
58  =item --config conf/config.yml  =item --config conf/config.yml
59    
60  path to YAML configuration file  path to YAML configuration file
61    
62    =item --stats
63    
64    disable indexing, modify_* in configuration and dump statistics about field
65    and subfield usage for each input
66    
67    =item --validate path/to/validation_file
68    
69    turn on extra validation of imput records, see L<WebPAC::Validation>
70    
71    You can use special variables C<$database> and $C<$input> in this parametar
72    like C<--validate 'conf/validate/$database-$input'> to construct filename
73    
74    =item --validate-delimiters path/to/validate_delimiters_file
75    
76    this option is used with C<--validate> to turn on extra validation of
77    delimiters. If file is non existant, it will be created on first run.
78    
79    =item --marc-generate
80    
81    Generate MARC file. This will automatically be on if file contains C<marc*> directives.
82    You can use this option as C<--no-marc-generate> to disable MARC generation.
83    
84    =item --marc-lint
85    
86    By default turned on if normalisation file has C<marc*> directives. You can disable lint
87    messages with C<--no-marc-lint>.
88    
89    =item --marc-dump
90    
91    Force dump or input and marc record for debugging.
92    
93    =item --parallel 4
94    
95    Run databases in parallel (aproximatly same as number of processors in
96    machine if you want to use full load)
97    
98    =item --only-links
99    
100    Create just links
101    
102    =item --merge
103    
104    Create merged index of databases which have links
105    
106  =back  =back
107    
108  =cut  =cut
# Line 57  my $offset; Line 111  my $offset;
111  my $limit;  my $limit;
112    
113  my $clean = 0;  my $clean = 0;
114  my $config = 'conf/config.yml';  my $config_path;
115  my $debug = 0;  my $debug = 0;
116  my $one_db_name;  my $only_filter;
117    my $stats = 0;
118    my $validate_path;
119    my $validate_delimiters_path;
120    my $marc_generate = 1;
121    my $marc_lint = 1;
122    my $marc_dump = 0;
123    my $parallel = 0;
124    my $only_links = 0;
125    my $merge = 0;
126    my $help;
127    
128    my $log = _new WebPAC::Common()->_get_logger();
129    
130  GetOptions(  GetOptions(
131          "limit=i" => \$limit,          "limit=i" => \$limit,
132          "offset=i" => \$offset,          "offset=i" => \$offset,
133          "clean" => \$clean,          "clean" => \$clean,
134          "one=s" => \$one_db_name,          "one=s" => \$only_filter,
135          "config" => \$config,          "only=s" => \$only_filter,
136          "debug" => \$debug,          "config=s" => \$config_path,
137            "debug+" => \$debug,
138            "stats" => \$stats,
139            "validate=s" => \$validate_path,
140            "validate-delimiters=s" => \$validate_delimiters_path,
141            "marc-generate!" => \$marc_generate,
142            "marc-lint!" => \$marc_lint,
143            "marc-dump!" => \$marc_dump,
144            "parallel=i" => \$parallel,
145            "only-links!" => \$only_links,
146            "merge" => \$merge,
147            "help" => \$help,
148  );  );
149    
150  $config = LoadFile($config);  $marc_generate = 0 if ( $validate_delimiters_path );
151    
152    pod2usage(-verbose => 2) if ($help);
153    
154    my $config = new WebPAC::Config( path => $config_path );
155    
156  print "config = ",Dumper($config) if ($debug);  WebPAC::Normalize::_debug( $debug - 1 ) if $debug > 1;
157    
158  die "no databases in config file!\n" unless ($config->{databases});  #print "config = ",dump($config) if ($debug);
159    
160    die "no databases in config file!\n" unless ($config->databases);
161    
162    $log->info( "-" x 79 );
163    
164    my $log_file = 'log';
165    
166    if (-e $log_file ) {    # && -s $log_file > 5 * 1024 * 1024) {
167            $log->info("moved old log with ", -s $log_file, " bytes to '${log_file}.old'");
168            rename $log_file, "${log_file}.old" || $log->logwarn("can't rename $log_file to ${log_file}.old: $!");
169    }
170    
171    my $estcmd_fh;
172    my $estcmd_path = './estcmd-merge.sh';
173    if ($merge) {
174            open($estcmd_fh, '>', $estcmd_path) || $log->logdie("can't open $estcmd_path: $!");
175            print $estcmd_fh 'cd /data/estraier/_node/ || exit 1',$/;
176            print $estcmd_fh 'sudo /etc/init.d/hyperestraier stop',$/;
177            $log->info("created merge batch file $estcmd_path");
178    }
179    
180    my $validate;
181    $validate = new WebPAC::Validate(
182            delimiters => $config->webpac('delimiters'),
183    ) if ($validate_path || $validate_delimiters_path);
184    
185    my $use_indexer = $config->use_indexer;
186    $stats ||= $validate;
187    if ($stats) {
188            $log->debug("disabled indexing for stats collection");
189            $use_indexer = undef;
190    } elsif ( $use_indexer ) {
191            $log->info("using $use_indexer indexing engine...");
192    }
193    
194    # parse normalize files and create source files for lookup and normalization
195    
196    my ($only_database,$only_input) = split(m#/#, $only_filter) if $only_filter;
197    
198    my $parser = new WebPAC::Parser(
199            config => $config,
200            only_database => $only_database,
201            only_input => $only_input,
202    );
203    
204  my $total_rows = 0;  my $total_rows = 0;
205  my $start_t = time();  my $start_t = time();
206    
207  while (my ($database, $db_config) = each %{ $config->{databases} }) {  my @links;
208    
209          next if ($one_db_name && $database !~ m/$one_db_name/i);  if ($parallel) {
210            $log->info("Using $parallel processes for speedup");
211            Proc::Queue::size($parallel);
212    }
213    
214    sub create_ds_config {
215            my ($db_config, $database, $input, $mfn) = @_;
216            my $c = dclone( $db_config );
217            $c->{_} = $database || $log->logconfess("need database");
218            $c->{_mfn} = $mfn || $log->logconfess("need mfn");
219            $c->{input} = $input || $log->logconfess("need input");
220            return $c;
221    }
222    
223    foreach my $database ( sort keys %{ $config->databases } ) {
224            my $db_config = $config->databases->{$database};
225    
226            next if ($only_database && $database !~ m/$only_database/i);
227    
228            if ($parallel) {
229                    my $f=fork;
230                    if(defined ($f) and $f==0) {
231                            $log->info("Created processes $$ for speedup");
232                    } else {
233                            next;
234                    }
235            }
236    
237            my $indexer;
238            if ($use_indexer && $parser->have_rules( 'search', $database )) {
239    
240                    my $cfg_name = $use_indexer;
241                    $cfg_name =~ s/\-.*$//;
242    
243                    my $indexer_config = $config->get( $cfg_name ) || $log->logdie("can't find '$cfg_name' part in confguration");
244                    $indexer_config->{database} = $database;
245                    $indexer_config->{clean} = $clean;
246                    $indexer_config->{label} = $db_config->{name};
247    
248                    # force clean if database has links
249                    $indexer_config->{clean} = 1 if ($db_config->{links});
250    
251                    if ($use_indexer eq 'hyperestraier') {
252    
253                            # open Hyper Estraier database
254                            require WebPAC::Output::Estraier;
255                            $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
256                    
257                    } elsif ($use_indexer eq 'hyperestraier-native') {
258    
259                            # open Hyper Estraier database
260                            require WebPAC::Output::EstraierNative;
261                            $indexer = new WebPAC::Output::EstraierNative( %{ $indexer_config } );
262    
263                    } elsif ($use_indexer eq 'kinosearch') {
264    
265                            die "no longer supported";
266    
267                    } else {
268                            $log->logdie("unknown use_indexer: $use_indexer");
269                    }
270    
271                    $log->logdie("can't continue without valid indexer") unless ($indexer);
272            }
273    
         my $log = _new WebPAC::Common()->_get_logger();  
274    
275          #          #
276          # open Hyper Estraier database          # store Hyper Estraier links to other databases
277          #          #
278            if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
279                    foreach my $link (@{ $db_config->{links} }) {
280                            if ($use_indexer eq 'hyperestraier') {
281                                    if ($merge) {
282                                            print $estcmd_fh 'sudo -u www-data estcmd merge ' . $database . ' ' . $link->{to},$/;
283                                    } else {
284                                            $log->info("saving link $database -> $link->{to} [$link->{credit}]");
285                                            push @links, sub {
286                                                    $log->info("adding link $database -> $link->{to} [$link->{credit}]");
287                                                    $indexer->add_link(
288                                                            from => $database,
289                                                            to => $link->{to},
290                                                            credit => $link->{credit},
291                                                    );
292                                            };
293                                    }
294                            } else {
295                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
296                            }
297                    }
298            }
299            next if ($only_links);
300    
         my $est_config = $config->{hyperestraier} || $log->logdie("can't find 'hyperestraier' part in confguration");  
         $est_config->{database} = $database;  
         $est_config->{clean} = $clean;  
         $est_config->{label} = $db_config->{name};  
   
         my $est = new WebPAC::Output::Estraier( %{ $est_config } );  
301    
302          #          #
303          # now WebPAC::Store          # now WebPAC::Store
304          #          #
305          my $abs_path = abs_path($0);          my $store = new WebPAC::Store({
306          $abs_path =~ s#/[^/]*$#/#;                  debug => $debug,
307            });
308    
         my $db_path = $config->{webpac}->{db_path} . '/' . $database;  
309    
310          if ($clean) {          #
311                  $log->info("creating new database $database in $db_path");          # prepare output
312                  rmtree( $db_path ) || $log->warn("can't remove $db_path: $!");          #
313          } else {          my @outputs = force_array( $db_config->{output}, sub {
314                  $log->debug("working on $database in $db_path");                  $log->error("Database $database doesn't have any outputs defined. Do you want to remove it from configuration?" );
315            } );
316    
317            my @output_modules;
318    
319            foreach my $output ( @outputs ) {
320    
321    #warn '## output = ',dump( $output );
322    
323                    my $module = $output->{module} || $log->logdie("need module in output section of $database");
324                    $module = 'WebPAC::Output::' . $module unless $module =~ m/::/;
325            
326                    $log->debug("loading output module $module");
327                    eval "require $module";
328    
329                    # add database to arugemnts for output filter
330                    $output->{database} = $database;
331                    $output->{clean} = $clean;
332    
333                    $log->debug("calling $module->new(",dump( $output ),")");
334                    my $out = new $module->new( $output );
335                    if ( $out->init ) {
336                            push @output_modules, $out;
337                    } else {
338                            $log->warn("SKIPPED $module");
339                    }
340          }          }
341    
         my $db = new WebPAC::Store(  
                 path => $db_path,  
                 database => $database,  
                 debug => $debug,  
         );  
   
342    
343          #          #
344          # now, iterate through input formats          # now, iterate through input formats
345          #          #
346    
         my @inputs;  
         if (ref($db_config->{input}) eq 'ARRAY') {  
                 @inputs = @{ $db_config->{input} };  
         } elsif ($db_config->{input}) {  
                 push @inputs, $db_config->{input};  
         } else {  
                 $log->info("database $database doesn't have inputs defined");  
         }  
347    
348          my @supported_inputs = keys %{ $config->{webpac}->{inputs} };          my @inputs = force_array( $db_config->{input}, sub {
349                    $log->info("database $database doesn't have inputs defined");
350            } );
351    
352          foreach my $input (@inputs) {          foreach my $input (@inputs) {
353    
354                    my $input_name = $input->{name} || $log->logdie("input without a name isn't valid: ",dump($input));
355    
356                    next if ($only_input && ($input_name !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));
357    
358                  my $type = lc($input->{type});                  my $type = lc($input->{type});
359    
360                  die "I know only how to handle input types ", join(",", @supported_inputs), " not '$type'!\n" unless (grep(/$type/, @supported_inputs));                  # FIXME check if input module exists
361                    my $input_module = $input->{module};
362    
363                  my $lookup = new WebPAC::Lookup(                  if ( ! $input_module ) {
364                          lookup_file => $input->{lookup},                          if ( grep(/$type/, $config->webpac('inputs')) ) {
365                  );                                  $input_module = $config->webpac('inputs')->{$type};
366                            } else {
367                                    $log->logdie("I know only how to handle input types ", join(",", $config->webpac('inputs') ), " not '$type'!" );
368                            }
369                    }
370    
371                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my @lookups = $parser->have_lookup_create($database, $input);
372    
373                    $log->info("working on $database/$input_name with $input_module on $input->{path}",
374                            @lookups ? " creating lookups: ".join(", ", @lookups) : ""
375                    );
376    
377                  $log->info("working on input '$input->{path}' [$input->{type}] using $input_module lookup '$input->{lookup}'");                  if ($stats) {
378                            # disable modification of records if --stats is in use
379                            delete($input->{modify_records});
380                            delete($input->{modify_file});
381                    }
382    
383                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
384                          module => $input_module,                          module => $input_module,
385                          code_page => $config->{webpac}->{webpac_encoding},                          encoding => $config->webpac('webpac_encoding'),
386                          limit => $limit || $input->{limit},                          limit => $limit || $input->{limit},
387                          offset => $offset,                          offset => $offset,
                         lookup => $lookup,  
388                          recode => $input->{recode},                          recode => $input->{recode},
389                            stats => $stats,
390                            modify_records => $input->{modify_records},
391                            modify_file => $input->{modify_file},
392                            input_config => $input,
393                  );                  );
394                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
395    
396                    if (defined( $input->{lookup} )) {
397                            $log->warn("$database/$input_name has depriciated lookup definition, removing it...");
398                            delete( $input->{lookup} );
399                    }
400    
401                    my $lookup_coderef;
402    
403                    if (@lookups) {
404    
405                            my $rules = $parser->lookup_create_rules($database, $input) || $log->logdie("no rules found for $database/$input");
406    
407                            $lookup_coderef = sub {
408                                    my $rec = shift || die "need rec!";
409                                    my $mfn = $rec->{'000'}->[0] || die "need mfn in 000";
410    
411                                    WebPAC::Normalize::data_structure(
412                                            row => $rec,
413                                            rules => $rules,
414                                            config => create_ds_config( $db_config, $database, $input, $mfn ),
415                                    );
416    
417                                    #warn "current lookup: ", dump(WebPAC::Normalize::_get_lookup());
418                            };
419    
420                            WebPAC::Normalize::_set_lookup( undef );
421    
422                            $log->debug("created lookup_coderef using:\n$rules");
423    
424                    };
425    
426                    my $lookup_jar;
427    
428                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
429                          path => $input->{path},                          path => $input->{path},
430                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
431                  );                          lookup_coderef => $lookup_coderef,
432                            lookup => $lookup_jar,
433                            %{ $input },
434                            load_row => sub {
435                                    my $a = shift;
436                                    return $store->load_row(
437                                            database => $database,
438                                            input => $input_name,
439                                            id => $a->{id},
440                                    );
441                            },
442                            save_row => sub {
443                                    my $a = shift;
444                                    return $store->save_row(
445                                            database => $database,
446                                            input => $input_name,
447                                            id => $a->{id},
448                                            row => $a->{row},
449                                    );
450                            },
451    
                 my $n = new WebPAC::Normalize::XML(  
                 #       filter => { 'foo' => sub { shift } },  
                         db => $db,  
                         lookup_regex => $lookup->regex,  
                         lookup => $lookup,  
                         prefix => $input->{name},  
452                  );                  );
453    
454                  my $normalize_path = $input->{normalize}->{path};                  my $lookup_data = WebPAC::Normalize::_get_lookup();
455    
456                  if ($normalize_path =~ m/\.xml$/i) {                  if (defined( $lookup_data->{$database}->{$input_name} )) {
457                          $n->open(                          $log->debug("created following lookups: ", sub { dump( $lookup_data ) } );
458                                  tag => $input->{normalize}->{tag},  
459                                  xml_file => $input->{normalize}->{path},                          foreach my $key (keys %{ $lookup_data->{$database}->{$input_name} }) {
460                          );                                  $store->save_lookup(
461                  } elsif ($normalize_path =~ m/\.(?:yml|yaml)$/i) {                                          database => $database,
462                          $n->open_yaml(                                          input => $input_name,
463                                  path => $normalize_path,                                          key => $key,
464                                  tag => $input->{normalize}->{tag},                                          data => $lookup_data->{$database}->{$input_name}->{$key},
465                                    );
466                            }
467                    }
468    
469                    my $report_fh;
470                    if ($stats || $validate) {
471                            my $path = "out/report/${database}-${input_name}.txt";
472                            open($report_fh, '>', $path) || $log->logdie("can't open $path: $!");
473    
474                            print $report_fh "Report for database '$database' input '$input_name' records ",
475                                    $offset || 1, "-", $limit || $input->{limit} || $maxmfn, "\n\n";
476                            $log->info("Generating report file $path");
477    
478                            if ( $validate ) {
479                                    $validate->read_validate_file( $validate->fill_in( $validate_path, database => $database, input => $input_name ) ) if ( $validate_path );
480                                    $validate->read_validate_delimiters_file( $validate->fill_in( $validate_delimiters_path, database => $database, input => $input_name ) ) if ( $validate_delimiters_path );
481                            }
482                    }
483    
484                    my $marc;
485                    if ($marc_generate && $parser->have_rules( 'marc', $database, $input_name )) {
486                            $marc = new WebPAC::Output::MARC(
487                                    path => "out/marc/${database}-${input_name}.marc",
488                                    lint => $marc_lint,
489                                    dump => $marc_dump,
490                          );                          );
491                  }                  }
492    
493                    my $rules = $parser->normalize_rules($database,$input_name);
494                    $log->logwarn("no normalize rules for $database/$input_name") unless $rules;
495    
496                    $log->debug("parsed normalize rules:\n$rules");
497    
498                    # reset position in database
499                    $input_db->seek(1);
500    
501                    # generate name of config key for indexer (strip everything after -)
502                    my $indexer_config = $use_indexer;
503                    $indexer_config =~ s/^(\w+)-?.*$/$1/g if ($indexer_config);
504    
505                    my $lookup_hash;
506                    my $depends = $parser->depends($database,$input_name);
507            
508                    if ($depends) {
509                            $log->debug("$database/$input_name depends on: ", dump($depends)) if ($depends);
510                            $log->logdie("parser->depends didn't return HASH") unless (ref($depends) eq 'HASH');
511    
512                            foreach my $db (keys %$depends) {
513                                    foreach my $i (keys %{$depends->{$db}}) {
514                                            foreach my $k (keys %{$depends->{$db}->{$i}}) {
515                                                    my $t = time();
516                                                    $log->debug("loading lookup $db/$i");
517                                                    $lookup_hash->{$db}->{$i}->{$k} = $store->load_lookup(
518                                                            database => $db,
519                                                            input => $i,
520                                                            key => $k,
521                                                    );
522                                                    $log->debug(sprintf("lookup $db/$i took %.2fs", time() - $t));
523                                            }
524                                    }
525                            }
526    
527                            $log->debug("lookup_hash = ", sub { dump( $lookup_hash ) });
528                    }
529    
530    
531                    # setup input name for all output filters
532                    foreach my $out ( @output_modules ) {
533                            if ( $out->can('input') ) {
534                                    $out->input( $input_name );
535                            } else {
536                                    $log->warn("output filter ",ref($out)," doesn't support input name");
537                            }
538                    }
539    
540    
541                  foreach my $pos ( 0 ... $input_db->size ) {                  foreach my $pos ( 0 ... $input_db->size ) {
542    
543                          my $row = $input_db->fetch || next;                          my $row = $input_db->fetch || next;
544    
545                            $total_rows++;
546    
547                          my $mfn = $row->{'000'}->[0];                          my $mfn = $row->{'000'}->[0];
548    
549                          if (! $mfn || $mfn !~ m#^\d+$#) {                          if (! $mfn || $mfn !~ m{^\d+$}) {
550                                  $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");                                  $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");
551                                  $mfn = $pos;                                  $mfn = $pos;
552                                  push @{ $row->{'000'} }, $pos;                                  push @{ $row->{'000'} }, $pos;
553                          }                          }
554    
                         my $ds = $n->data_structure($row);  
555    
556                          $est->add(                          if ($validate) {
557                                  id => $input->{name} . "/" . $mfn,                                  if ( my $errors = $validate->validate_rec( $row, $input_db->dump_ascii ) ) {
558                                  ds => $ds,                                          $log->error( "MFN $mfn validation error:\n",
559                                  type => $config->{hyperestraier}->{type},                                                  $validate->report_error( $errors )
560                          );                                          );
561                                    }
562                                    next;   # validation doesn't create any output
563                            }
564    
565                            if ($rules) {
566    
567                                    my $ds = WebPAC::Normalize::data_structure(
568                                            row => $row,
569                                            rules => $rules,
570                                            lookup => $lookup_hash,
571                                            config => create_ds_config( $db_config, $database, $input, $mfn ),
572                                            marc_encoding => 'utf-8',
573                                            load_row_coderef => sub {
574                                                    my ($database,$input,$mfn) = @_;
575    #warn "### load_row($database,$input,$mfn) from data_structure\n";
576                                                    return $store->load_row(
577                                                            database => $database,
578                                                            input => $input,
579                                                            id => $mfn,
580                                                    );
581                                            },
582                                    );
583    
584                                    $log->debug("ds = ", sub { dump($ds) });
585    
586                                    if ( $ds ) {
587    
588                                            $store->save_ds(
589                                                    database => $database,
590                                                    input => $input_name,
591                                                    id => $mfn,
592                                                    ds => $ds,
593                                            ) if !$stats;
594    
595                                            $indexer->add(
596                                                    id => "${input_name}/${mfn}",
597                                                    ds => $ds,
598                                                    type => $config->get($indexer_config)->{type},
599                                            ) if $indexer;
600    
601                                            foreach my $out ( @output_modules ) {
602                                                    $out->add( $mfn, $ds ) if $out->can('add');
603                                            }
604    
605                                    } else {
606                                            $log->warn("record $pos didn't produce any output after normalization rules!") unless $marc;
607                                    }
608                            }
609    
610                            if ($marc) {
611                                    my $i = 0;
612    
613                                    while (my $fields = WebPAC::Normalize::MARC::_get_marc_fields( fetch_next => 1 ) ) {
614                                            $marc->add(
615                                                    id => $mfn . ( $i ? "/$i" : '' ),
616                                                    fields => $fields,
617                                                    leader => WebPAC::Normalize::MARC::_get_marc_leader(),
618                                                    row => $row,
619                                            );
620                                            $i++;
621                                    }
622    
623                                    $log->info("Created $i instances of MFN $mfn\n") if ($i > 1);
624                            }
625    
                         $total_rows++;  
626                  }                  }
627    
628          };                  if ($validate) {
629                            my $errors = $validate->report;
630                            if ($errors) {
631                                    $log->info("validation errors:\n$errors\n" );
632                                    print $report_fh "$errors\n" if ($report_fh);
633                            }
634    
635                            print $report_fh "\nAll possible subfields/delimiter templates:\n", $validate->delimiters_templates( report => 1, current_input => 1 ), "\n\n";
636    
637                            # must be last thing that touches $validate for this input
638                            $validate->reset;
639                    }
640    
641                    if ($stats) {
642                            my $s = $input_db->stats;
643                            $log->info("statistics of fields usage:\n$s");
644                            print $report_fh "Statistics of fields usage:\n$s" if ($report_fh);
645                    }
646    
647                    # close MARC file
648                    $marc->finish if ($marc);
649    
650                    # close report
651                    close($report_fh) if ($report_fh);
652            }
653    
654            eval { $indexer->finish } if ($indexer && $indexer->can('finish'));
655    
656            foreach my $out ( @output_modules ) {
657                    $out->finish if $out->can('finish');
658            }
659    
660          my $dt = time() - $start_t;          my $dt = time() - $start_t;
661          $log->info("$total_rows records indexed in " .          $log->info("$total_rows records ", $indexer ? "indexed " : "",
662                  sprintf("%.2f sec [%.2f rec/sec]",                  sprintf("in %.2f sec [%.2f rec/sec]",
663                          $dt, ($total_rows / $dt)                          $dt, ($total_rows / $dt)
664                  )                  )
665          );          );
666    
667          #  
668          # add Hyper Estraier links to other databases          # end forked process
669          #          if ($parallel) {
670          if (ref($db_config->{links}) eq 'ARRAY') {                  $log->info("parallel process $$ finished");
671                  foreach my $link (@{ $db_config->{links} }) {                  exit(0);
                         $log->info("adding link $database -> $link->{to} [$link->{credit}]");  
                         $est->add_link(  
                                 from => $database,  
                                 to => $link->{to},  
                                 credit => $link->{credit},  
                         );  
                 }  
672          }          }
673    
674  }  }
675    
676    if ($parallel) {
677            # wait all children to finish
678            sleep(1) while wait != -1;
679            $log->info("all parallel processes finished");
680    }
681    
682    # save new delimiters if needed
683    $validate->save_delimiters_templates if ( $validate_delimiters_path );
684    
685    #
686    # handle links or merge after indexing
687    #
688    
689    if ($merge) {
690            print $estcmd_fh 'sudo /etc/init.d/hyperestraier start',$/;
691            close($estcmd_fh);
692            chmod 0700, $estcmd_path || $log->warn("can't chmod 0700 $estcmd_path: $!");
693            system $estcmd_path;
694    } else {
695            foreach my $link (@links) {
696                    $log->logdie("coderef in link ", Dumper($link), " is ", ref($link), " and not CODE") unless (ref($link) eq 'CODE');
697                    $link->();
698            }
699    }

Legend:
Removed from v.416  
changed lines
  Added in v.1084

  ViewVC Help
Powered by ViewVC 1.1.26