/[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 434 by dpavlin, Mon Apr 17 16:50:53 2006 UTC revision 924 by dpavlin, Wed Oct 31 00:26:45 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 YAML qw/LoadFile/;  use WebPAC::Validate 0.11;
16    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 24  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 40  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 --only=database_name  =item --only=database_name/input_filter
52    
53  reindex just single database (legacy name is --one)  reindex just single database (legacy name is --one)
54    
55    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 56  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 $only_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" => \$only_db_name,          "one=s" => \$only_filter,
135          "only=s" => \$only_db_name,          "only=s" => \$only_filter,
136          "config" => \$config,          "config" => \$config_path,
137          "debug" => \$debug,          "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  print "config = ",Dumper($config) if ($debug);  pod2usage(-verbose => 2) if ($help);
153    
154  die "no databases in config file!\n" unless ($config->{databases});  my $config = new WebPAC::Config( path => $config_path );
155    
156  my $log = _new WebPAC::Common()->_get_logger();  #print "config = ",dump($config) if ($debug);
157    
158    die "no databases in config file!\n" unless ($config->databases);
159    
160    $log->info( "-" x 79 );
161    
162    my $log_file = 'log';
163    
164    if (-e $log_file ) {    # && -s $log_file > 5 * 1024 * 1024) {
165            $log->info("moved old log with ", -s $log_file, " bytes to '${log_file}.old'");
166            rename $log_file, "${log_file}.old" || $log->logwarn("can't rename $log_file to ${log_file}.old: $!");
167    }
168    
169    my $estcmd_fh;
170    my $estcmd_path = './estcmd-merge.sh';
171    if ($merge) {
172            open($estcmd_fh, '>', $estcmd_path) || $log->logdie("can't open $estcmd_path: $!");
173            print $estcmd_fh 'cd /data/estraier/_node/ || exit 1',$/;
174            print $estcmd_fh 'sudo /etc/init.d/hyperestraier stop',$/;
175            $log->info("created merge batch file $estcmd_path");
176    }
177    
178  my $use_indexer = $config->{use_indexer} || 'hyperestraier';  my $validate;
179  $log->info("using $use_indexer indexing engine...");  $validate = new WebPAC::Validate(
180            delimiters => $config->webpac('delimiters'),
181    ) if ($validate_path || $validate_delimiters_path);
182    
183    my $use_indexer = $config->use_indexer;
184    $stats ||= $validate;
185    if ($stats) {
186            $log->debug("disabled indexing for stats collection");
187            $use_indexer = undef;
188    } elsif ( $use_indexer ) {
189            $log->info("using $use_indexer indexing engine...");
190    }
191    
192    # parse normalize files and create source files for lookup and normalization
193    
194    my $parser = new WebPAC::Parser( config => $config );
195    
196  my $total_rows = 0;  my $total_rows = 0;
197  my $start_t = time();  my $start_t = time();
198    
199  while (my ($database, $db_config) = each %{ $config->{databases} }) {  my @links;
200    
201    if ($parallel) {
202            $log->info("Using $parallel processes for speedup");
203            Proc::Queue::size($parallel);
204    }
205    
206    sub create_ds_config {
207            my ($db_config, $database, $input, $mfn) = @_;
208            my $c = dclone( $db_config );
209            $c->{_} = $database || $log->logconfess("need database");
210            $c->{_mfn} = $mfn || $log->logconfess("need mfn");
211            $c->{input} = $input || $log->logconfess("need input");
212            return $c;
213    }
214    
215    foreach my $database ( sort keys %{ $config->databases } ) {
216            my $db_config = $config->databases->{$database};
217    
218          next if ($only_db_name && $database !~ m/$only_db_name/i);          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
219            next if ($only_database && $database !~ m/$only_database/i);
220    
221            if ($parallel) {
222                    my $f=fork;
223                    if(defined ($f) and $f==0) {
224                            $log->info("Created processes $$ for speedup");
225                    } else {
226                            next;
227                    }
228            }
229    
230          my $indexer;          my $indexer;
231            if ($use_indexer && $parser->have_rules( 'search', $database )) {
232    
233          my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");                  my $cfg_name = $use_indexer;
234          $indexer_config->{database} = $database;                  $cfg_name =~ s/\-.*$//;
235          $indexer_config->{clean} = $clean;  
236          $indexer_config->{label} = $db_config->{name};                  my $indexer_config = $config->get( $cfg_name ) || $log->logdie("can't find '$cfg_name' part in confguration");
237                    $indexer_config->{database} = $database;
238          # important: clean database just once!                  $indexer_config->{clean} = $clean;
239          $clean = 0;                  $indexer_config->{label} = $db_config->{name};
240    
241          if ($use_indexer eq 'hyperestraier') {                  # force clean if database has links
242                    $indexer_config->{clean} = 1 if ($db_config->{links});
243                  # open Hyper Estraier database  
244                  use WebPAC::Output::Estraier '0.10';                  if ($use_indexer eq 'hyperestraier') {
245                  $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );  
246                                    # open Hyper Estraier database
247          } elsif ($use_indexer eq 'kinosearch') {                          require WebPAC::Output::Estraier;
248                            $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
249                    
250                    } elsif ($use_indexer eq 'hyperestraier-native') {
251    
252                            # open Hyper Estraier database
253                            require WebPAC::Output::EstraierNative;
254                            $indexer = new WebPAC::Output::EstraierNative( %{ $indexer_config } );
255    
256                    } elsif ($use_indexer eq 'kinosearch') {
257    
258                            die "no longer supported";
259    
260                    } else {
261                            $log->logdie("unknown use_indexer: $use_indexer");
262                    }
263    
264                    $log->logdie("can't continue without valid indexer") unless ($indexer);
265            }
266    
                 # open KinoSearch  
                 use WebPAC::Output::KinoSearch;  
                 $indexer_config->{clean} = 1 unless (-e $indexer_config->{index_path});  
                 $indexer = new WebPAC::Output::KinoSearch( %{ $indexer_config } );  
267    
268          } else {          #
269                  $log->logdie("unknown use_indexer: $use_indexer");          # store Hyper Estraier links to other databases
270            #
271            if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
272                    foreach my $link (@{ $db_config->{links} }) {
273                            if ($use_indexer eq 'hyperestraier') {
274                                    if ($merge) {
275                                            print $estcmd_fh 'sudo -u www-data estcmd merge ' . $database . ' ' . $link->{to},$/;
276                                    } else {
277                                            $log->info("saving link $database -> $link->{to} [$link->{credit}]");
278                                            push @links, sub {
279                                                    $log->info("adding link $database -> $link->{to} [$link->{credit}]");
280                                                    $indexer->add_link(
281                                                            from => $database,
282                                                            to => $link->{to},
283                                                            credit => $link->{credit},
284                                                    );
285                                            };
286                                    }
287                            } else {
288                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
289                            }
290                    }
291          }          }
292            next if ($only_links);
293    
         $log->logide("can't continue without valid indexer") unless ($indexer);  
294    
295          #          #
296          # now WebPAC::Store          # now WebPAC::Store
297          #          #
298          my $abs_path = abs_path($0);          my $store = new WebPAC::Store({
299          $abs_path =~ s#/[^/]*$#/#;                  debug => $debug,
300            });
301    
         my $db_path = $config->{webpac}->{db_path} . '/' . $database;  
302    
303          if ($clean) {          #
304                  $log->info("creating new database $database in $db_path");          # prepare output
305                  rmtree( $db_path ) || $log->warn("can't remove $db_path: $!");          #
306          } else {          my @outputs = force_array( $db_config->{output}, sub {
307                  $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?" );
308          }          } );
309    
310          my $db = new WebPAC::Store(          my @output_modules;
311                  path => $db_path,  
312                  database => $database,          foreach my $output ( @outputs ) {
313                  debug => $debug,  
314          );  warn '## output = ',dump( $output );
315    
316                    my $module = $output->{module} || $log->logdie("need module in output section of $database");
317                    $module = 'WebPAC::Output::' . $module unless $module =~ m/::/;
318            
319                    $log->debug("loading output module $module");
320                    eval "require $module";
321            
322                    $output->{database} = $database;
323    
324                    $log->debug("calling $module->new(",dump( $output ),")");
325                    my $out = new $module->new( $output );
326                    $out->init;
327    
328                    push @output_modules, $out;
329            }
330    
331    
332          #          #
333          # now, iterate through input formats          # now, iterate through input formats
334          #          #
335    
         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");  
         }  
336    
337          my @supported_inputs = keys %{ $config->{webpac}->{inputs} };          my @inputs = force_array( $db_config->{input}, sub {
338                    $log->info("database $database doesn't have inputs defined");
339            } );
340    
341          foreach my $input (@inputs) {          foreach my $input (@inputs) {
342    
343                    my $input_name = $input->{name} || $log->logdie("input without a name isn't valid: ",dump($input));
344    
345                    next if ($only_input && ($input_name !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));
346    
347                  my $type = lc($input->{type});                  my $type = lc($input->{type});
348    
349                  die "I know only how to handle input types ", join(",", @supported_inputs), " not '$type'!\n" unless (grep(/$type/, @supported_inputs));                  die "I know only how to handle input types ", join(",", $config->webpac('inputs') ), " not '$type'!\n" unless (grep(/$type/, $config->webpac('inputs')));
350    
351                  my $lookup = new WebPAC::Lookup(                  my $input_module = $config->webpac('inputs')->{$type};
352                          lookup_file => $input->{lookup},  
353                  );                  my @lookups = $parser->have_lookup_create($database, $input);
354    
355                  my $input_module = $config->{webpac}->{inputs}->{$type};                  $log->info("working on input '$input_name' in $input->{path} [type: $input->{type}] using $input_module",
356                            @lookups ? " creating lookups: ".join(", ", @lookups) : ""
357                    );
358    
359                  $log->info("working on input '$input->{path}' [$input->{type}] using $input_module lookup '$input->{lookup}'");                  if ($stats) {
360                            # disable modification of records if --stats is in use
361                            delete($input->{modify_records});
362                            delete($input->{modify_file});
363                    }
364    
365                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
366                          module => $input_module,                          module => $input_module,
367                          code_page => $config->{webpac}->{webpac_encoding},                          encoding => $config->webpac('webpac_encoding'),
368                          limit => $limit || $input->{limit},                          limit => $limit || $input->{limit},
369                          offset => $offset,                          offset => $offset,
                         lookup => $lookup,  
370                          recode => $input->{recode},                          recode => $input->{recode},
371                            stats => $stats,
372                            modify_records => $input->{modify_records},
373                            modify_file => $input->{modify_file},
374                            input_config => $input,
375                  );                  );
376                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
377    
378                    if (defined( $input->{lookup} )) {
379                            $log->warn("$database/$input_name has depriciated lookup definition, removing it...");
380                            delete( $input->{lookup} );
381                    }
382    
383                    my $lookup_coderef;
384    
385                    if (@lookups) {
386    
387                            my $rules = $parser->lookup_create_rules($database, $input) || $log->logdie("no rules found for $database/$input");
388    
389                            $lookup_coderef = sub {
390                                    my $rec = shift || die "need rec!";
391                                    my $mfn = $rec->{'000'}->[0] || die "need mfn in 000";
392    
393                                    WebPAC::Normalize::data_structure(
394                                            row => $rec,
395                                            rules => $rules,
396                                            config => create_ds_config( $db_config, $database, $input, $mfn ),
397                                    );
398    
399                                    #warn "current lookup: ", dump(WebPAC::Normalize::_get_lookup());
400                            };
401    
402                            WebPAC::Normalize::_set_lookup( undef );
403    
404                            $log->debug("created lookup_coderef using:\n$rules");
405    
406                    };
407    
408                    my $lookup_jar;
409    
410                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
411                          path => $input->{path},                          path => $input->{path},
412                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
413                  );                          lookup_coderef => $lookup_coderef,
414                            lookup => $lookup_jar,
415                            %{ $input },
416                            load_row => sub {
417                                    my $a = shift;
418                                    return $store->load_row(
419                                            database => $database,
420                                            input => $input_name,
421                                            id => $a->{id},
422                                    );
423                            },
424                            save_row => sub {
425                                    my $a = shift;
426                                    return $store->save_row(
427                                            database => $database,
428                                            input => $input_name,
429                                            id => $a->{id},
430                                            row => $a->{row},
431                                    );
432                            },
433    
                 my $n = new WebPAC::Normalize::XML(  
                 #       filter => { 'foo' => sub { shift } },  
                         db => $db,  
                         lookup_regex => $lookup->regex,  
                         lookup => $lookup,  
                         prefix => $input->{name},  
434                  );                  );
435    
436                  my $normalize_path = $input->{normalize}->{path};                  my $lookup_data = WebPAC::Normalize::_get_lookup();
437    
438                  if ($normalize_path =~ m/\.xml$/i) {                  if (defined( $lookup_data->{$database}->{$input_name} )) {
439                          $n->open(                          $log->debug("created following lookups: ", sub { dump( $lookup_data ) } );
440                                  tag => $input->{normalize}->{tag},  
441                                  xml_file => $input->{normalize}->{path},                          foreach my $key (keys %{ $lookup_data->{$database}->{$input_name} }) {
442                          );                                  $store->save_lookup(
443                  } elsif ($normalize_path =~ m/\.(?:yml|yaml)$/i) {                                          database => $database,
444                          $n->open_yaml(                                          input => $input_name,
445                                  path => $normalize_path,                                          key => $key,
446                                  tag => $input->{normalize}->{tag},                                          data => $lookup_data->{$database}->{$input_name}->{$key},
447                                    );
448                            }
449                    }
450    
451                    my $report_fh;
452                    if ($stats || $validate) {
453                            my $path = "out/report/${database}-${input_name}.txt";
454                            open($report_fh, '>', $path) || $log->logdie("can't open $path: $!");
455    
456                            print $report_fh "Report for database '$database' input '$input_name' records ",
457                                    $offset || 1, "-", $limit || $input->{limit} || $maxmfn, "\n\n";
458                            $log->info("Generating report file $path");
459    
460                            if ( $validate ) {
461                                    $validate->read_validate_file( $validate->fill_in( $validate_path, database => $database, input => $input_name ) ) if ( $validate_path );
462                                    $validate->read_validate_delimiters_file( $validate->fill_in( $validate_delimiters_path, database => $database, input => $input_name ) ) if ( $validate_delimiters_path );
463                            }
464                    }
465    
466                    my $marc;
467                    if ($marc_generate && $parser->have_rules( 'marc', $database, $input_name )) {
468                            $marc = new WebPAC::Output::MARC(
469                                    path => "out/marc/${database}-${input_name}.marc",
470                                    lint => $marc_lint,
471                                    dump => $marc_dump,
472                          );                          );
473                  }                  }
474    
475                    my $rules = $parser->normalize_rules($database,$input_name) || $log->logdie("no normalize rules found for $database/$input_name");
476                    $log->debug("parsed normalize rules:\n$rules");
477    
478                    # reset position in database
479                    $input_db->seek(1);
480    
481                    # generate name of config key for indexer (strip everything after -)
482                    my $indexer_config = $use_indexer;
483                    $indexer_config =~ s/^(\w+)-?.*$/$1/g if ($indexer_config);
484    
485                    my $lookup_hash;
486                    my $depends = $parser->depends($database,$input_name);
487            
488                    if ($depends) {
489                            $log->debug("$database/$input_name depends on: ", dump($depends)) if ($depends);
490                            $log->logdie("parser->depends didn't return HASH") unless (ref($depends) eq 'HASH');
491    
492                            foreach my $db (keys %$depends) {
493                                    foreach my $i (keys %{$depends->{$db}}) {
494                                            foreach my $k (keys %{$depends->{$db}->{$i}}) {
495                                                    my $t = time();
496                                                    $log->debug("loading lookup $db/$i");
497                                                    $lookup_hash->{$db}->{$i}->{$k} = $store->load_lookup(
498                                                            database => $db,
499                                                            input => $i,
500                                                            key => $k,
501                                                    );
502                                                    $log->debug(sprintf("lookup $db/$i took %.2fs", time() - $t));
503                                            }
504                                    }
505                            }
506    
507                            $log->debug("lookup_hash = ", sub { dump( $lookup_hash ) });
508                    }
509    
510    
511                  foreach my $pos ( 0 ... $input_db->size ) {                  foreach my $pos ( 0 ... $input_db->size ) {
512    
513                          my $row = $input_db->fetch || next;                          my $row = $input_db->fetch || next;
514    
515                            $total_rows++;
516    
517                          my $mfn = $row->{'000'}->[0];                          my $mfn = $row->{'000'}->[0];
518    
519                          if (! $mfn || $mfn !~ m#^\d+$#) {                          if (! $mfn || $mfn !~ m{^\d+$}) {
520                                  $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");
521                                  $mfn = $pos;                                  $mfn = $pos;
522                                  push @{ $row->{'000'} }, $pos;                                  push @{ $row->{'000'} }, $pos;
523                          }                          }
524    
525                          my $ds = $n->data_structure($row);  
526                            if ($validate) {
527                                    if ( my $errors = $validate->validate_rec( $row, $input_db->dump_ascii ) ) {
528                                            $log->error( "MFN $mfn validation error:\n",
529                                                    $validate->report_error( $errors )
530                                            );
531                                    }
532                                    next;   # validation doesn't create any output
533                            }
534    
535                            my $ds = WebPAC::Normalize::data_structure(
536                                    row => $row,
537                                    rules => $rules,
538                                    lookup => $lookup_hash,
539                                    config => create_ds_config( $db_config, $database, $input, $mfn ),
540                                    marc_encoding => 'utf-8',
541                                    load_row_coderef => sub {
542                                            my ($database,$input,$mfn) = @_;
543                                            return $store->load_row(
544                                                    database => $database,
545                                                    input => $input,
546                                                    id => $mfn,
547                                            );
548                                    },
549                            );
550    
551                            $log->debug("ds = ", sub { dump($ds) }) if ($ds);
552    
553                            $store->save_ds(
554                                    database => $database,
555                                    input => $input_name,
556                                    id => $mfn,
557                                    ds => $ds,
558                            ) if ($ds && !$stats);
559    
560                          $indexer->add(                          $indexer->add(
561                                  id => $input->{name} . "/" . $mfn,                                  id => "${input_name}/${mfn}",
562                                  ds => $ds,                                  ds => $ds,
563                                  type => $config->{$use_indexer}->{type},                                  type => $config->get($indexer_config)->{type},
564                          );                          ) if ($indexer && $ds);
565    
566                          $total_rows++;                          if ($marc) {
567                                    my $i = 0;
568    
569                                    while (my $fields = WebPAC::Normalize::_get_marc_fields( fetch_next => 1 ) ) {
570                                            $marc->add(
571                                                    id => $mfn . ( $i ? "/$i" : '' ),
572                                                    fields => $fields,
573                                                    leader => WebPAC::Normalize::_get_marc_leader(),
574                                                    row => $row,
575                                            );
576                                            $i++;
577                                    }
578    
579                                    $log->info("Created $i instances of MFN $mfn\n") if ($i > 1);
580                            }
581    
582                            foreach my $out ( @output_modules ) {
583                                    $out->add( $mfn, $ds ) if $out->can('add');
584                            }
585    
586                    }
587    
588                    if ($validate) {
589                            my $errors = $validate->report;
590                            if ($errors) {
591                                    $log->info("validation errors:\n$errors\n" );
592                                    print $report_fh "$errors\n" if ($report_fh);
593                            }
594    
595                            print $report_fh "\nAll possible subfields/delimiter templates:\n", $validate->delimiters_templates( report => 1, current_input => 1 ), "\n\n";
596    
597                            # must be last thing that touches $validate for this input
598                            $validate->reset;
599                    }
600    
601                    if ($stats) {
602                            my $s = $input_db->stats;
603                            $log->info("statistics of fields usage:\n$s");
604                            print $report_fh "Statistics of fields usage:\n$s" if ($report_fh);
605                  }                  }
606    
607          };                  # close MARC file
608                    $marc->finish if ($marc);
609    
610                    # close report
611                    close($report_fh) if ($report_fh);
612            }
613    
614          eval { $indexer->finish } if ($indexer->can('finish'));          eval { $indexer->finish } if ($indexer && $indexer->can('finish'));
615    
616            foreach my $out ( @output_modules ) {
617                    $out->finish if $out->can('finish');
618            }
619    
620          my $dt = time() - $start_t;          my $dt = time() - $start_t;
621          $log->info("$total_rows records indexed in " .          $log->info("$total_rows records ", $indexer ? "indexed " : "",
622                  sprintf("%.2f sec [%.2f rec/sec]",                  sprintf("in %.2f sec [%.2f rec/sec]",
623                          $dt, ($total_rows / $dt)                          $dt, ($total_rows / $dt)
624                  )                  )
625          );          );
626    
627          #  
628          # add Hyper Estraier links to other databases          # end forked process
629          #          if ($parallel) {
630          if (ref($db_config->{links}) eq 'ARRAY') {                  $log->info("parallel process $$ finished");
631                  foreach my $link (@{ $db_config->{links} }) {                  exit(0);
                         if ($use_indexer eq 'hyperestraier') {  
                                 $log->info("adding link $database -> $link->{to} [$link->{credit}]");  
                                 $indexer->add_link(  
                                         from => $database,  
                                         to => $link->{to},  
                                         credit => $link->{credit},  
                                 );  
                         } else {  
                                 $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");  
                         }  
                 }  
632          }          }
633    
634  }  }
635    
636    if ($parallel) {
637            # wait all children to finish
638            sleep(1) while wait != -1;
639            $log->info("all parallel processes finished");
640    }
641    
642    # save new delimiters if needed
643    $validate->save_delimiters_templates if ( $validate_delimiters_path );
644    
645    #
646    # handle links or merge after indexing
647    #
648    
649    if ($merge) {
650            print $estcmd_fh 'sudo /etc/init.d/hyperestraier start',$/;
651            close($estcmd_fh);
652            chmod 0700, $estcmd_path || $log->warn("can't chmod 0700 $estcmd_path: $!");
653            system $estcmd_path;
654    } else {
655            foreach my $link (@links) {
656                    $log->logdie("coderef in link ", Dumper($link), " is ", ref($link), " and not CODE") unless (ref($link) eq 'CODE');
657                    $link->();
658            }
659    }

Legend:
Removed from v.434  
changed lines
  Added in v.924

  ViewVC Help
Powered by ViewVC 1.1.26