/[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 508 by dpavlin, Mon May 15 13:32:18 2006 UTC revision 957 by dpavlin, Fri Nov 2 10:54:44 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;
 use WebPAC::Normalize::Set;  
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;  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 26  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 42  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 --force-set  =item --stats
63    
64  force conversion C<< normalize->path >> in C<config.yml> from  disable indexing, modify_* in configuration and dump statistics about field
65  C<.xml> to C<.pl>  and subfield usage for each input
66    
67  =item --stats  =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  dump statistics about used fields and subfields in each input  =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    
# Line 67  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;
 my $force_set = 0;  
117  my $stats = 0;  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,
         "force-set" => \$force_set,  
138          "stats" => \$stats,          "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 $validate;
179    $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 $use_indexer = $config->{use_indexer} || 'hyperestraier';  my $parser = new WebPAC::Parser( config => $config );
 $log->info("using $use_indexer indexing engine...");  
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            my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
219            next if ($only_database && $database !~ m/$only_database/i);
220    
221          next if ($only_db_name && $database !~ m/$only_db_name/i);          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          if ($use_indexer eq 'hyperestraier') {                  $indexer_config->{clean} = $clean;
239                    $indexer_config->{label} = $db_config->{name};
240                  # open Hyper Estraier database  
241                  use WebPAC::Output::Estraier '0.10';                  # force clean if database has links
242                  $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );                  $indexer_config->{clean} = 1 if ($db_config->{links});
243            
244          } elsif ($use_indexer eq 'kinosearch') {                  if ($use_indexer eq 'hyperestraier') {
245    
246                            # open Hyper Estraier database
247                            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                    # add database to arugemnts for output filter
323                    $output->{database} = $database;
324    
325                    $log->debug("calling $module->new(",dump( $output ),")");
326                    my $out = new $module->new( $output );
327                    $out->init;
328    
329                    push @output_modules, $out;
330            }
331    
332    
333          #          #
334          # now, iterate through input formats          # now, iterate through input formats
335          #          #
336    
         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");  
         }  
337    
338          my @supported_inputs = keys %{ $config->{webpac}->{inputs} };          my @inputs = force_array( $db_config->{input}, sub {
339                    $log->info("database $database doesn't have inputs defined");
340            } );
341    
342          foreach my $input (@inputs) {          foreach my $input (@inputs) {
343    
344                    my $input_name = $input->{name} || $log->logdie("input without a name isn't valid: ",dump($input));
345    
346                    next if ($only_input && ($input_name !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));
347    
348                  my $type = lc($input->{type});                  my $type = lc($input->{type});
349    
350                  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')));
351    
352                  my $lookup = new WebPAC::Lookup(                  my $input_module = $config->webpac('inputs')->{$type};
                         lookup_file => $input->{lookup},  
                 );  
353    
354                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my @lookups = $parser->have_lookup_create($database, $input);
355    
356                  $log->info("working on input '$input->{path}' [$input->{type}] using $input_module lookup '$input->{lookup}'");                  $log->info("working on input '$input_name' in $input->{path} [type: $input->{type}] using $input_module",
357                            @lookups ? " creating lookups: ".join(", ", @lookups) : ""
358                    );
359    
360                    if ($stats) {
361                            # disable modification of records if --stats is in use
362                            delete($input->{modify_records});
363                            delete($input->{modify_file});
364                    }
365    
366                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
367                          module => $input_module,                          module => $input_module,
368                          code_page => $config->{webpac}->{webpac_encoding},                          encoding => $config->webpac('webpac_encoding'),
369                          limit => $limit || $input->{limit},                          limit => $limit || $input->{limit},
370                          offset => $offset,                          offset => $offset,
                         lookup => $lookup,  
371                          recode => $input->{recode},                          recode => $input->{recode},
372                          stats => $stats,                          stats => $stats,
373                            modify_records => $input->{modify_records},
374                            modify_file => $input->{modify_file},
375                            input_config => $input,
376                  );                  );
377                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
378    
379                    if (defined( $input->{lookup} )) {
380                            $log->warn("$database/$input_name has depriciated lookup definition, removing it...");
381                            delete( $input->{lookup} );
382                    }
383    
384                    my $lookup_coderef;
385    
386                    if (@lookups) {
387    
388                            my $rules = $parser->lookup_create_rules($database, $input) || $log->logdie("no rules found for $database/$input");
389    
390                            $lookup_coderef = sub {
391                                    my $rec = shift || die "need rec!";
392                                    my $mfn = $rec->{'000'}->[0] || die "need mfn in 000";
393    
394                                    WebPAC::Normalize::data_structure(
395                                            row => $rec,
396                                            rules => $rules,
397                                            config => create_ds_config( $db_config, $database, $input, $mfn ),
398                                    );
399    
400                                    #warn "current lookup: ", dump(WebPAC::Normalize::_get_lookup());
401                            };
402    
403                            WebPAC::Normalize::_set_lookup( undef );
404    
405                            $log->debug("created lookup_coderef using:\n$rules");
406    
407                    };
408    
409                    my $lookup_jar;
410    
411                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
412                          path => $input->{path},                          path => $input->{path},
413                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
414                  );                          lookup_coderef => $lookup_coderef,
415                            lookup => $lookup_jar,
416                            %{ $input },
417                            load_row => sub {
418                                    my $a = shift;
419                                    return $store->load_row(
420                                            database => $database,
421                                            input => $input_name,
422                                            id => $a->{id},
423                                    );
424                            },
425                            save_row => sub {
426                                    my $a = shift;
427                                    return $store->save_row(
428                                            database => $database,
429                                            input => $input_name,
430                                            id => $a->{id},
431                                            row => $a->{row},
432                                    );
433                            },
434    
                 my $n = new WebPAC::Normalize::XML(  
                 #       filter => { 'foo' => sub { shift } },  
                         db => $db,  
                         lookup_regex => $lookup->regex,  
                         lookup => $lookup,  
                         prefix => $input->{name},  
435                  );                  );
436    
437                  my $rules;                  my $lookup_data = WebPAC::Normalize::_get_lookup();
                 my $normalize_path = $input->{normalize}->{path};  
438    
439                  if ($force_set) {                  if (defined( $lookup_data->{$database}->{$input_name} )) {
440                          my $new_norm_path = $normalize_path;                          $log->debug("created following lookups: ", sub { dump( $lookup_data ) } );
441                          $new_norm_path =~ s/\.xml$/.pl/;  
442                          if (-e $new_norm_path) {                          foreach my $key (keys %{ $lookup_data->{$database}->{$input_name} }) {
443                                  $log->debug("--force-set replaced $normalize_path with $new_norm_path");                                  $store->save_lookup(
444                                  $normalize_path = $new_norm_path;                                          database => $database,
445                          } else {                                          input => $input_name,
446                                  $log->debug("--force-set failed on $new_norm_path, fallback to $normalize_path");                                          key => $key,
447                                            data => $lookup_data->{$database}->{$input_name}->{$key},
448                                    );
449                          }                          }
450                  }                  }
451    
452                  if ($normalize_path =~ m/\.xml$/i) {                  my $report_fh;
453                          $n->open(                  if ($stats || $validate) {
454                                  tag => $input->{normalize}->{tag},                          my $path = "out/report/${database}-${input_name}.txt";
455                                  xml_file => $normalize_path,                          open($report_fh, '>', $path) || $log->logdie("can't open $path: $!");
456                          );  
457                  } elsif ($normalize_path =~ m/\.(?:yml|yaml)$/i) {                          print $report_fh "Report for database '$database' input '$input_name' records ",
458                          $n->open_yaml(                                  $offset || 1, "-", $limit || $input->{limit} || $maxmfn, "\n\n";
459                                  path => $normalize_path,                          $log->info("Generating report file $path");
460                                  tag => $input->{normalize}->{tag},  
461                            if ( $validate ) {
462                                    $validate->read_validate_file( $validate->fill_in( $validate_path, database => $database, input => $input_name ) ) if ( $validate_path );
463                                    $validate->read_validate_delimiters_file( $validate->fill_in( $validate_delimiters_path, database => $database, input => $input_name ) ) if ( $validate_delimiters_path );
464                            }
465                    }
466    
467                    my $marc;
468                    if ($marc_generate && $parser->have_rules( 'marc', $database, $input_name )) {
469                            $marc = new WebPAC::Output::MARC(
470                                    path => "out/marc/${database}-${input_name}.marc",
471                                    lint => $marc_lint,
472                                    dump => $marc_dump,
473                          );                          );
                 } elsif ($normalize_path =~ m/\.(?:pl)$/i) {  
                         $n = undef;  
                         $log->info("using WebPAC::Normalize::Set to process $normalize_path");  
                         $rules = read_file( $normalize_path ) or die "can't open $normalize_path: $!";  
474                  }                  }
475    
476                    my $rules = $parser->normalize_rules($database,$input_name) || $log->logdie("no normalize rules found for $database/$input_name");
477                    $log->debug("parsed normalize rules:\n$rules");
478    
479                    # reset position in database
480                    $input_db->seek(1);
481    
482                    # generate name of config key for indexer (strip everything after -)
483                    my $indexer_config = $use_indexer;
484                    $indexer_config =~ s/^(\w+)-?.*$/$1/g if ($indexer_config);
485    
486                    my $lookup_hash;
487                    my $depends = $parser->depends($database,$input_name);
488            
489                    if ($depends) {
490                            $log->debug("$database/$input_name depends on: ", dump($depends)) if ($depends);
491                            $log->logdie("parser->depends didn't return HASH") unless (ref($depends) eq 'HASH');
492    
493                            foreach my $db (keys %$depends) {
494                                    foreach my $i (keys %{$depends->{$db}}) {
495                                            foreach my $k (keys %{$depends->{$db}->{$i}}) {
496                                                    my $t = time();
497                                                    $log->debug("loading lookup $db/$i");
498                                                    $lookup_hash->{$db}->{$i}->{$k} = $store->load_lookup(
499                                                            database => $db,
500                                                            input => $i,
501                                                            key => $k,
502                                                    );
503                                                    $log->debug(sprintf("lookup $db/$i took %.2fs", time() - $t));
504                                            }
505                                    }
506                            }
507    
508                            $log->debug("lookup_hash = ", sub { dump( $lookup_hash ) });
509                    }
510    
511    
512                    # setup input name for all output filters
513                    foreach my $out ( @output_modules ) {
514                            if ( $out->can('input') ) {
515                                    $out->input( $input_name );
516                            } else {
517                                    $log->warn("output filter ",ref($out)," doesn't support input name");
518                            }
519                    }
520    
521    
522                  foreach my $pos ( 0 ... $input_db->size ) {                  foreach my $pos ( 0 ... $input_db->size ) {
523    
524                          my $row = $input_db->fetch || next;                          my $row = $input_db->fetch || next;
525    
526                            $total_rows++;
527    
528                          my $mfn = $row->{'000'}->[0];                          my $mfn = $row->{'000'}->[0];
529    
530                          if (! $mfn || $mfn !~ m#^\d+$#) {                          if (! $mfn || $mfn !~ m{^\d+$}) {
531                                  $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");
532                                  $mfn = $pos;                                  $mfn = $pos;
533                                  push @{ $row->{'000'} }, $pos;                                  push @{ $row->{'000'} }, $pos;
534                          }                          }
535    
                                   
                         my $ds;  
                         if ($n) {  
                                 $ds = $n->data_structure($row);  
                         } else {  
                                 $ds = WebPAC::Normalize::Set::data_structure(  
                                         row => $row,  
                                         rules => $rules,  
                                         lookup => $lookup->lookup_hash,  
                                 );  
536    
537                                  $db->save_ds(                          if ($validate) {
538                                    if ( my $errors = $validate->validate_rec( $row, $input_db->dump_ascii ) ) {
539                                            $log->error( "MFN $mfn validation error:\n",
540                                                    $validate->report_error( $errors )
541                                            );
542                                    }
543                                    next;   # validation doesn't create any output
544                            }
545    
546                            if ( my $ds = WebPAC::Normalize::data_structure(
547                                    row => $row,
548                                    rules => $rules,
549                                    lookup => $lookup_hash,
550                                    config => create_ds_config( $db_config, $database, $input, $mfn ),
551                                    marc_encoding => 'utf-8',
552                                    load_row_coderef => sub {
553                                            my ($database,$input,$mfn) = @_;
554                                            return $store->load_row(
555                                                    database => $database,
556                                                    input => $input,
557                                                    id => $mfn,
558                                            );
559                                    },
560                            ) ) { # if
561    
562                                    $log->debug("ds = ", sub { dump($ds) });
563    
564                                    $store->save_ds(
565                                            database => $database,
566                                            input => $input_name,
567                                          id => $mfn,                                          id => $mfn,
568                                          ds => $ds,                                          ds => $ds,
569                                          prefix => $input->{name},                                  ) if !$stats;
570                                  ) if ($ds);  
571                                    $indexer->add(
572                                            id => "${input_name}/${mfn}",
573                                            ds => $ds,
574                                            type => $config->get($indexer_config)->{type},
575                                    ) if $indexer;
576    
577                                    if ($marc) {
578                                            my $i = 0;
579    
580                                            while (my $fields = WebPAC::Normalize::_get_marc_fields( fetch_next => 1 ) ) {
581                                                    $marc->add(
582                                                            id => $mfn . ( $i ? "/$i" : '' ),
583                                                            fields => $fields,
584                                                            leader => WebPAC::Normalize::_get_marc_leader(),
585                                                            row => $row,
586                                                    );
587                                                    $i++;
588                                            }
589    
590                                            $log->info("Created $i instances of MFN $mfn\n") if ($i > 1);
591                                    }
592    
593                                    foreach my $out ( @output_modules ) {
594                                            $out->add( $mfn, $ds ) if $out->can('add');
595                                    }
596    
597                            } else {
598                                    $log->warn("record $pos didn't produce any output after normalization rules!");
599                          }                          }
600    
601                          $indexer->add(                  }
                                 id => $input->{name} . "/" . $mfn,  
                                 ds => $ds,  
                                 type => $config->{$use_indexer}->{type},  
                         );  
602    
603                          $total_rows++;                  if ($validate) {
604                            my $errors = $validate->report;
605                            if ($errors) {
606                                    $log->info("validation errors:\n$errors\n" );
607                                    print $report_fh "$errors\n" if ($report_fh);
608                            }
609    
610                            print $report_fh "\nAll possible subfields/delimiter templates:\n", $validate->delimiters_templates( report => 1, current_input => 1 ), "\n\n";
611    
612                            # must be last thing that touches $validate for this input
613                            $validate->reset;
614                  }                  }
615    
616                  $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);                  if ($stats) {
617                            my $s = $input_db->stats;
618                            $log->info("statistics of fields usage:\n$s");
619                            print $report_fh "Statistics of fields usage:\n$s" if ($report_fh);
620                    }
621    
622                    # close MARC file
623                    $marc->finish if ($marc);
624    
625          };                  # close report
626                    close($report_fh) if ($report_fh);
627            }
628    
629          eval { $indexer->finish } if ($indexer->can('finish'));          eval { $indexer->finish } if ($indexer && $indexer->can('finish'));
630    
631            foreach my $out ( @output_modules ) {
632                    $out->finish if $out->can('finish');
633            }
634    
635          my $dt = time() - $start_t;          my $dt = time() - $start_t;
636          $log->info("$total_rows records indexed in " .          $log->info("$total_rows records ", $indexer ? "indexed " : "",
637                  sprintf("%.2f sec [%.2f rec/sec]",                  sprintf("in %.2f sec [%.2f rec/sec]",
638                          $dt, ($total_rows / $dt)                          $dt, ($total_rows / $dt)
639                  )                  )
640          );          );
641    
642          #  
643          # add Hyper Estraier links to other databases          # end forked process
644          #          if ($parallel) {
645          if (ref($db_config->{links}) eq 'ARRAY') {                  $log->info("parallel process $$ finished");
646                  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}]");  
                         }  
                 }  
647          }          }
648    
649  }  }
650    
651    if ($parallel) {
652            # wait all children to finish
653            sleep(1) while wait != -1;
654            $log->info("all parallel processes finished");
655    }
656    
657    # save new delimiters if needed
658    $validate->save_delimiters_templates if ( $validate_delimiters_path );
659    
660    #
661    # handle links or merge after indexing
662    #
663    
664    if ($merge) {
665            print $estcmd_fh 'sudo /etc/init.d/hyperestraier start',$/;
666            close($estcmd_fh);
667            chmod 0700, $estcmd_path || $log->warn("can't chmod 0700 $estcmd_path: $!");
668            system $estcmd_path;
669    } else {
670            foreach my $link (@links) {
671                    $log->logdie("coderef in link ", Dumper($link), " is ", ref($link), " and not CODE") unless (ref($link) eq 'CODE');
672                    $link->();
673            }
674    }

Legend:
Removed from v.508  
changed lines
  Added in v.957

  ViewVC Help
Powered by ViewVC 1.1.26