/[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 606 by dpavlin, Tue Aug 1 13:59:47 2006 UTC revision 845 by dpavlin, Sun May 27 09:39:44 2007 UTC
# Line 7  use File::Temp qw/tempdir/; Line 7  use File::Temp qw/tempdir/;
7  use lib './lib';  use lib './lib';
8    
9  use WebPAC::Common 0.02;  use WebPAC::Common 0.02;
10  use WebPAC::Lookup 0.03;  use WebPAC::Parser 0.08;
11  use WebPAC::Input 0.07;  use WebPAC::Input 0.16;
12  use WebPAC::Store 0.03;  use WebPAC::Store 0.14;
13  use WebPAC::Normalize 0.11;  use WebPAC::Normalize 0.22;
14  use WebPAC::Output::TT;  use WebPAC::Output::TT;
15  use WebPAC::Validate;  use WebPAC::Validate 0.11;
16  use WebPAC::Output::MARC;  use WebPAC::Output::MARC;
17  use YAML qw/LoadFile/;  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/;  use Data::Dump qw/dump/;
23  use Storable qw/dclone/;  use Storable qw/dclone/;
24    use Pod::Usage qw/pod2usage/;
25    
26  use Proc::Queue size => 1;  use Proc::Queue size => 1;
27  use POSIX ":sys_wait_h"; # imports WNOHANG  use POSIX ":sys_wait_h"; # imports WNOHANG
# Line 31  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 60  path to YAML configuration file Line 61  path to YAML configuration file
61    
62  =item --stats  =item --stats
63    
64  disable indexing and dump statistics about field and subfield  disable indexing, modify_* in configuration and dump statistics about field
65  usage for each input  and subfield usage for each input
66    
67  =item --validate path/to/validation_file  =item --validate path/to/validation_file
68    
69  turn on extra validation of imput records, see L<WebPAC::Validation>  turn on extra validation of imput records, see L<WebPAC::Validation>
70    
71  =item --marc-normalize conf/normalize/mapping.pl  =item --validate-delimiters path/to/validate_delimiters_file
72    
73  This option specifies normalisation file for MARC creation  this option is used with C<--validate> to turn on extra validation of
74    delimiters. If file is non existant, it will be created on first run.
75    
76  =item --marc-output out/marc/test.marc  =item --marc-generate
77    
78  Optional path to output file  Generate MARC file. This will automatically be on if file contains C<marc*> directives.
79    You can use this option as C<--no-marc-generate> to disable MARC generation.
80    
81  =item --marc-lint  =item --marc-lint
82    
83  By default turned on if C<--marc-normalize> is used. You can disable lint  By default turned on if normalisation file has C<marc*> directives. You can disable lint
84  messages with C<--no-marc-lint>.  messages with C<--no-marc-lint>.
85    
86  =item --marc-dump  =item --marc-dump
# Line 89  Force dump or input and marc record for Line 92  Force dump or input and marc record for
92  Run databases in parallel (aproximatly same as number of processors in  Run databases in parallel (aproximatly same as number of processors in
93  machine if you want to use full load)  machine if you want to use full load)
94    
95    =item --only-links
96    
97    Create just links
98    
99    =item --merge
100    
101    Create merged index of databases which have links
102    
103  =back  =back
104    
105  =cut  =cut
# Line 97  my $offset; Line 108  my $offset;
108  my $limit;  my $limit;
109    
110  my $clean = 0;  my $clean = 0;
111  my $config = 'conf/config.yml';  my $config_path;
112  my $debug = 0;  my $debug = 0;
113  my $only_filter;  my $only_filter;
114  my $stats = 0;  my $stats = 0;
115  my $validate_path;  my $validate_path;
116  my ($marc_normalize, $marc_output);  my $validate_delimiters_path;
117    my $marc_generate = 1;
118  my $marc_lint = 1;  my $marc_lint = 1;
119  my $marc_dump = 0;  my $marc_dump = 0;
   
120  my $parallel = 0;  my $parallel = 0;
121    my $only_links = 0;
122    my $merge = 0;
123    my $help;
124    
125    my $log = _new WebPAC::Common()->_get_logger();
126    
127  GetOptions(  GetOptions(
128          "limit=i" => \$limit,          "limit=i" => \$limit,
# Line 114  GetOptions( Line 130  GetOptions(
130          "clean" => \$clean,          "clean" => \$clean,
131          "one=s" => \$only_filter,          "one=s" => \$only_filter,
132          "only=s" => \$only_filter,          "only=s" => \$only_filter,
133          "config" => \$config,          "config" => \$config_path,
134          "debug+" => \$debug,          "debug+" => \$debug,
135          "stats" => \$stats,          "stats" => \$stats,
136          "validate=s" => \$validate_path,          "validate=s" => \$validate_path,
137          "marc-normalize=s" => \$marc_normalize,          "validate-delimiters=s" => \$validate_delimiters_path,
138          "marc-output=s" => \$marc_output,          "marc-generate!" => \$marc_generate,
139          "marc-lint!" => \$marc_lint,          "marc-lint!" => \$marc_lint,
140          "marc-dump!" => \$marc_dump,          "marc-dump!" => \$marc_dump,
141          "parallel=i" => \$parallel,          "parallel=i" => \$parallel,
142            "only-links!" => \$only_links,
143            "merge" => \$merge,
144            "help" => \$help,
145  );  );
146    
147  $config = LoadFile($config);  pod2usage(-verbose => 2) if ($help);
148    
149  print "config = ",dump($config) if ($debug);  my $config = new WebPAC::Config( path => $config_path );
150    
151  die "no databases in config file!\n" unless ($config->{databases});  #print "config = ",dump($config) if ($debug);
152    
153    die "no databases in config file!\n" unless ($config->databases);
154    
 my $log = _new WebPAC::Common()->_get_logger();  
155  $log->info( "-" x 79 );  $log->info( "-" x 79 );
156    
157    my $log_file = 'log';
158    
159    if (-e $log_file ) {    # && -s $log_file > 5 * 1024 * 1024) {
160            $log->info("moved old log with ", -s $log_file, " bytes to '${log_file}.old'");
161            rename $log_file, "${log_file}.old" || $log->logwarn("can't rename $log_file to ${log_file}.old: $!");
162    }
163    
164    my $estcmd_fh;
165    my $estcmd_path = './estcmd-merge.sh';
166    if ($merge) {
167            open($estcmd_fh, '>', $estcmd_path) || $log->logdie("can't open $estcmd_path: $!");
168            print $estcmd_fh 'cd /data/estraier/_node/ || exit 1',$/;
169            print $estcmd_fh 'sudo /etc/init.d/hyperestraier stop',$/;
170            $log->info("created merge batch file $estcmd_path");
171    }
172    
173  my $validate;  my $validate;
174  $validate = new WebPAC::Validate(  $validate = new WebPAC::Validate(
175          path => $validate_path,          path => $validate_path,
176  ) if ($validate_path);          delimiters => $config->webpac('delimiters'),
177            delimiters_path => $validate_delimiters_path,
178    ) if ($validate_path || $validate_delimiters_path);
179    
180  my $use_indexer = $config->{use_indexer} || 'hyperestraier';  my $use_indexer = $config->use_indexer;
181    $stats ||= $validate;
182  if ($stats) {  if ($stats) {
183          $log->debug("option --stats disables update of indexing engine...");          $log->debug("disabled indexing for stats collection");
184          $use_indexer = undef;          $use_indexer = undef;
185  } else {  } else {
186          $log->info("using $use_indexer indexing engine...");          $log->info("using $use_indexer indexing engine...");
187  }  }
188    
189  # disable indexing when creating marc  # parse normalize files and create source files for lookup and normalization
190  $use_indexer = undef if ($marc_normalize);  
191    my $parser = new WebPAC::Parser( config => $config );
192    
193  my $total_rows = 0;  my $total_rows = 0;
194  my $start_t = time();  my $start_t = time();
195    
196  my @links;  my @links;
 my $indexer;  
197    
198  if ($parallel) {  if ($parallel) {
199          $log->info("Using $parallel processes for speedup");          $log->info("Using $parallel processes for speedup");
200          Proc::Queue::size($parallel);          Proc::Queue::size($parallel);
201  }  }
202    
203  while (my ($database, $db_config) = each %{ $config->{databases} }) {  sub create_ds_config {
204            my ($db_config, $database, $input, $mfn) = @_;
205            my $c = dclone( $db_config );
206            $c->{_} = $database || $log->logconfess("need database");
207            $c->{_mfn} = $mfn || $log->logconfess("need mfn");
208            $c->{input} = $input || $log->logconfess("need input");
209            return $c;
210    }
211    
212    while (my ($database, $db_config) = each %{ $config->databases }) {
213    
214          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);          my ($only_database,$only_input) = split(m#/#, $only_filter) if ($only_filter);
215          next if ($only_database && $database !~ m/$only_database/i);          next if ($only_database && $database !~ m/$only_database/i);
# Line 175  while (my ($database, $db_config) = each Line 223  while (my ($database, $db_config) = each
223                  }                  }
224          }          }
225    
226          if ($use_indexer) {          my $indexer;
227                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");          if ($use_indexer && $parser->have_rules( 'search', $database )) {
228    
229                    my $cfg_name = $use_indexer;
230                    $cfg_name =~ s/\-.*$//;
231    
232                    my $indexer_config = $config->get( $cfg_name ) || $log->logdie("can't find '$cfg_name' part in confguration");
233                  $indexer_config->{database} = $database;                  $indexer_config->{database} = $database;
234                  $indexer_config->{clean} = $clean;                  $indexer_config->{clean} = $clean;
235                  $indexer_config->{label} = $db_config->{name};                  $indexer_config->{label} = $db_config->{name};
236    
237                    # force clean if database has links
238                    $indexer_config->{clean} = 1 if ($db_config->{links});
239    
240                  if ($use_indexer eq 'hyperestraier') {                  if ($use_indexer eq 'hyperestraier') {
241    
242                          # open Hyper Estraier database                          # open Hyper Estraier database
243                          use WebPAC::Output::Estraier '0.10';                          use WebPAC::Output::Estraier '0.10';
244                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
245                                    
246                    } elsif ($use_indexer eq 'hyperestraier-native') {
247    
248                            # open Hyper Estraier database
249                            use WebPAC::Output::EstraierNative;
250                            $indexer = new WebPAC::Output::EstraierNative( %{ $indexer_config } );
251    
252                  } elsif ($use_indexer eq 'kinosearch') {                  } elsif ($use_indexer eq 'kinosearch') {
253    
254                          # open KinoSearch                          # open KinoSearch
# Line 203  while (my ($database, $db_config) = each Line 265  while (my ($database, $db_config) = each
265    
266    
267          #          #
268            # store Hyper Estraier links to other databases
269            #
270            if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
271                    foreach my $link (@{ $db_config->{links} }) {
272                            if ($use_indexer eq 'hyperestraier') {
273                                    if ($merge) {
274                                            print $estcmd_fh 'sudo -u www-data estcmd merge ' . $database . ' ' . $link->{to},$/;
275                                    } else {
276                                            $log->info("saving link $database -> $link->{to} [$link->{credit}]");
277                                            push @links, sub {
278                                                    $log->info("adding link $database -> $link->{to} [$link->{credit}]");
279                                                    $indexer->add_link(
280                                                            from => $database,
281                                                            to => $link->{to},
282                                                            credit => $link->{credit},
283                                                    );
284                                            };
285                                    }
286                            } else {
287                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
288                            }
289                    }
290            }
291            next if ($only_links);
292    
293    
294            #
295          # now WebPAC::Store          # now WebPAC::Store
296          #          #
297          my $abs_path = abs_path($0);          my $abs_path = abs_path($0);
298          $abs_path =~ s#/[^/]*$#/#;          $abs_path =~ s#/[^/]*$#/#;
299    
300          my $db_path = $config->{webpac}->{db_path} . '/' . $database;          my $db_path = $config->webpac('db_path');
301    
302          if ($clean) {          if ($clean) {
303                  $log->info("creating new database '$database' in $db_path");                  $log->info("creating new database '$database' in $db_path");
# Line 217  while (my ($database, $db_config) = each Line 306  while (my ($database, $db_config) = each
306                  $log->info("working on database '$database' in $db_path");                  $log->info("working on database '$database' in $db_path");
307          }          }
308    
309          my $db = new WebPAC::Store(          my $store = new WebPAC::Store(
310                  path => $db_path,                  path => $db_path,
                 database => $database,  
311                  debug => $debug,                  debug => $debug,
312          );          );
313    
# Line 237  while (my ($database, $db_config) = each Line 325  while (my ($database, $db_config) = each
325                  $log->info("database $database doesn't have inputs defined");                  $log->info("database $database doesn't have inputs defined");
326          }          }
327    
         my @supported_inputs = keys %{ $config->{webpac}->{inputs} };  
   
328          foreach my $input (@inputs) {          foreach my $input (@inputs) {
329    
330                  next if ($only_input && ($input->{name} !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));                  my $input_name = $input->{name} || $log->logdie("input without a name isn't valid: ",dump($input));
331    
332                    next if ($only_input && ($input_name !~ m#$only_input#i && $input->{type} !~ m#$only_input#i));
333    
334                  my $type = lc($input->{type});                  my $type = lc($input->{type});
335    
336                  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')));
337    
338                  my $lookup;                  my $input_module = $config->webpac('inputs')->{$type};
                 if ($input->{lookup}) {  
                         $lookup = new WebPAC::Lookup(  
                                 lookup_file => $input->{lookup},  
                         );  
                         delete( $input->{lookup} );  
                 }  
339    
340                  my $input_module = $config->{webpac}->{inputs}->{$type};                  my @lookups = $parser->have_lookup_create($database, $input);
341    
342                  $log->info("working on input '$input->{name}' in $input->{path} [type: $input->{type}] using $input_module",                  $log->info("working on input '$input_name' in $input->{path} [type: $input->{type}] using $input_module",
343                          $input->{lookup} ? "lookup '$input->{lookup}'" : ""                          @lookups ? " creating lookups: ".join(", ", @lookups) : ""
344                  );                  );
345    
346                    if ($stats) {
347                            # disable modification of records if --stats is in use
348                            delete($input->{modify_records});
349                            delete($input->{modify_file});
350                    }
351    
352                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
353                          module => $input_module,                          module => $input_module,
354                          encoding => $config->{webpac}->{webpac_encoding},                          encoding => $config->webpac('webpac_encoding'),
355                          limit => $limit || $input->{limit},                          limit => $limit || $input->{limit},
356                          offset => $offset,                          offset => $offset,
                         lookup_coderef => sub {  
                                 my $rec = shift || return;  
                                 $lookup->add( $rec );  
                         },  
357                          recode => $input->{recode},                          recode => $input->{recode},
358                          stats => $stats,                          stats => $stats,
359                          modify_records => $input->{modify_records},                          modify_records => $input->{modify_records},
360                            modify_file => $input->{modify_file},
361                  );                  );
362                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
363    
364                    if (defined( $input->{lookup} )) {
365                            $log->warn("$database/$input_name has depriciated lookup definition, removing it...");
366                            delete( $input->{lookup} );
367                    }
368    
369                    my $lookup_coderef;
370    
371                    if (@lookups) {
372    
373                            my $rules = $parser->lookup_create_rules($database, $input) || $log->logdie("no rules found for $database/$input");
374    
375                            $lookup_coderef = sub {
376                                    my $rec = shift || die "need rec!";
377                                    my $mfn = $rec->{'000'}->[0] || die "need mfn in 000";
378    
379                                    WebPAC::Normalize::data_structure(
380                                            row => $rec,
381                                            rules => $rules,
382                                            config => create_ds_config( $db_config, $database, $input, $mfn ),
383                                    );
384    
385                                    #warn "current lookup: ", dump(WebPAC::Normalize::_get_lookup());
386                            };
387    
388                            WebPAC::Normalize::_set_lookup( undef );
389    
390                            $log->debug("created lookup_coderef using:\n$rules");
391    
392                    };
393    
394                    my $lookup_jar;
395    
396                  my $maxmfn = $input_db->open(                  my $maxmfn = $input_db->open(
397                          path => $input->{path},                          path => $input->{path},
398                          code_page => $input->{encoding},        # database encoding                          code_page => $input->{encoding},        # database encoding
399                            lookup_coderef => $lookup_coderef,
400                            lookup => $lookup_jar,
401                          %{ $input },                          %{ $input },
402                  );                          load_row => sub {
403                                    my $a = shift;
404                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?                                  return $store->load_row(
405                          @{ $input->{normalize} } : ( $input->{normalize} );                                          database => $database,
406                                            input => $input_name,
407                  if ($marc_normalize) {                                          id => $a->{id},
408                          @norm_array = ( {                                  );
409                                  path => $marc_normalize,                          },
410                                  output => $marc_output || 'out/marc/' . $database . '-' . $input->{name} . '.marc',                          save_row => sub {
411                          } );                                  my $a = shift;
412                  }                                  return $store->save_row(
413                                            database => $database,
414                                            input => $input_name,
415                                            id => $a->{id},
416                                            row => $a->{row},
417                                    );
418                            },
419    
420                  foreach my $normalize (@norm_array) {                  );
421    
422                          my $normalize_path = $normalize->{path} || $log->logdie("can't find normalize path in config");                  my $lookup_data = WebPAC::Normalize::_get_lookup();
423    
424                          $log->logdie("Found '$normalize_path' as normalization file which isn't supported any more!") unless ( $normalize_path =~ m!\.pl$!i );                  if (defined( $lookup_data->{$database}->{$input_name} )) {
425                            $log->debug("created following lookups: ", sub { dump( $lookup_data ) } );
426    
427                          my $rules = read_file( $normalize_path ) or die "can't open $normalize_path: $!";                          foreach my $key (keys %{ $lookup_data->{$database}->{$input_name} }) {
428                                    $store->save_lookup(
429                                            database => $database,
430                                            input => $input_name,
431                                            key => $key,
432                                            data => $lookup_data->{$database}->{$input_name}->{$key},
433                                    );
434                            }
435                    }
436    
437                          $log->info("Using $normalize_path for normalization...");                  my $report_fh;
438                    if ($stats || $validate) {
439                            my $path = "out/report/${database}-${input_name}.txt";
440                            open($report_fh, '>', $path) || $log->logdie("can't open $path: $!");
441    
442                            print $report_fh "Report for database '$database' input '$input_name' records ",
443                                    $offset || 1, "-", $limit || $input->{limit} || $maxmfn, "\n\n";
444                            $log->info("Generating report file $path");
445                    }
446    
447                          my $marc = new WebPAC::Output::MARC(                  my $marc;
448                                  path => $normalize->{output},                  if ($marc_generate && $parser->have_rules( 'marc', $database, $input_name )) {
449                            $marc = new WebPAC::Output::MARC(
450                                    path => "out/marc/${database}-${input_name}.marc",
451                                  lint => $marc_lint,                                  lint => $marc_lint,
452                                  dump => $marc_dump,                                  dump => $marc_dump,
453                          ) if ($normalize->{output});                          );
454                    }
455    
456                          # reset position in database                  my $rules = $parser->normalize_rules($database,$input_name) || $log->logdie("no normalize rules found for $database/$input_name");
457                          $input_db->seek(1);                  $log->debug("parsed normalize rules:\n$rules");
458    
459                          foreach my $pos ( 0 ... $input_db->size ) {                  # reset position in database
460                    $input_db->seek(1);
461    
462                                  my $row = $input_db->fetch || next;                  # generate name of config key for indexer (strip everything after -)
463                    my $indexer_config = $use_indexer;
464                    $indexer_config =~ s/^(\w+)-?.*$/$1/g if ($indexer_config);
465    
466                    my $lookup_hash;
467                    my $depends = $parser->depends($database,$input_name);
468            
469                    if ($depends) {
470                            $log->debug("$database/$input_name depends on: ", dump($depends)) if ($depends);
471                            $log->logdie("parser->depends didn't return HASH") unless (ref($depends) eq 'HASH');
472    
473                            foreach my $db (keys %$depends) {
474                                    foreach my $i (keys %{$depends->{$db}}) {
475                                            foreach my $k (keys %{$depends->{$db}->{$i}}) {
476                                                    my $t = time();
477                                                    $log->debug("loading lookup $db/$i");
478                                                    $lookup_hash->{$db}->{$i}->{$k} = $store->load_lookup(
479                                                            database => $db,
480                                                            input => $i,
481                                                            key => $k,
482                                                    );
483                                                    $log->debug(sprintf("lookup $db/$i took %.2fs", time() - $t));
484                                            }
485                                    }
486                            }
487    
488                                  my $mfn = $row->{'000'}->[0];                          $log->debug("lookup_hash = ", sub { dump( $lookup_hash ) });
489                    }
490    
                                 if (! $mfn || $mfn !~ m#^\d+$#) {  
                                         $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");  
                                         $mfn = $pos;  
                                         push @{ $row->{'000'} }, $pos;  
                                 }  
491    
492                    foreach my $pos ( 0 ... $input_db->size ) {
493    
494                                  if ($validate) {                          my $row = $input_db->fetch || next;
                                         my @errors = $validate->validate_errors( $row );  
                                         $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);  
                                 }  
495    
496                                  my $ds_config = dclone($db_config);                          $total_rows++;
497    
498                                  # default values -> database key                          my $mfn = $row->{'000'}->[0];
                                 $ds_config->{_} = $database;  
499    
500                                  # current mfn                          if (! $mfn || $mfn !~ m#^\d+$#) {
501                                  $ds_config->{_mfn} = $mfn;                                  $log->warn("record $pos doesn't have valid MFN but '$mfn', using $pos");
502                                    $mfn = $pos;
503                                    push @{ $row->{'000'} }, $pos;
504                            }
505    
                                 # attach current input  
                                 $ds_config->{input} = $input;  
506    
507                                  my $ds = WebPAC::Normalize::data_structure(                          if ($validate) {
508                                          row => $row,                                  if ( my $errors = $validate->validate_rec( $row, $input_db->dump_ascii ) ) {
509                                          rules => $rules,                                          $log->error( "MFN $mfn validation error:\n",
510                                          lookup => $lookup ? $lookup->lookup_hash : undef,                                                  $validate->report_error( $errors )
511                                          config => $ds_config,                                          );
512                                          marc_encoding => 'utf-8',                                  }
513                                  );                                  next;   # validation doesn't create any output
514                            }
515    
516                                  $db->save_ds(                          my $ds = WebPAC::Normalize::data_structure(
517                                          id => $mfn,                                  row => $row,
518                                          ds => $ds,                                  rules => $rules,
519                                          prefix => $input->{name},                                  lookup => $lookup_hash,
520                                  ) if ($ds && !$stats);                                  config => create_ds_config( $db_config, $database, $input, $mfn ),
521                                    marc_encoding => 'utf-8',
522                                  $indexer->add(                                  load_row_coderef => sub {
523                                          id => $input->{name} . "/" . $mfn,                                          my ($database,$input,$mfn) = @_;
524                                          ds => $ds,                                          return $store->load_row(
525                                          type => $config->{$use_indexer}->{type},                                                  database => $database,
526                                  ) if ($indexer && $ds);                                                  input => $input,
527                                                    id => $mfn,
528                                  if ($marc) {                                          );
529                                          my $i = 0;                                  },
530                            );
                                         while (my $fields = WebPAC::Normalize::_get_marc_fields( fetch_next => 1 ) ) {  
                                                 $marc->add(  
                                                         id => $mfn . ( $i ? "/$i" : '' ),  
                                                         fields => $fields,  
                                                         leader => WebPAC::Normalize::marc_leader(),  
                                                         row => $row,  
                                                 );  
                                                 $i++;  
                                         }  
531    
532                                          $log->info("Created $i instances of MFN $mfn\n") if ($i > 1);                          $log->debug("ds = ", sub { dump($ds) }) if ($ds);
533    
534                            $store->save_ds(
535                                    database => $database,
536                                    input => $input_name,
537                                    id => $mfn,
538                                    ds => $ds,
539                            ) if ($ds && !$stats);
540    
541                            $indexer->add(
542                                    id => "${input_name}/${mfn}",
543                                    ds => $ds,
544                                    type => $config->get($indexer_config)->{type},
545                            ) if ($indexer && $ds);
546    
547                            if ($marc) {
548                                    my $i = 0;
549    
550                                    while (my $fields = WebPAC::Normalize::_get_marc_fields( fetch_next => 1 ) ) {
551                                            $marc->add(
552                                                    id => $mfn . ( $i ? "/$i" : '' ),
553                                                    fields => $fields,
554                                                    leader => WebPAC::Normalize::_get_marc_leader(),
555                                                    row => $row,
556                                            );
557                                            $i++;
558                                  }                                  }
559    
560                                  $total_rows++;                                  $log->info("Created $i instances of MFN $mfn\n") if ($i > 1);
561                          }                          }
562                    }
563    
564                          $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);                  if ($validate) {
565                            my $errors = $validate->report;
566                            if ($errors) {
567                                    $log->info("validation errors:\n$errors\n" );
568                                    print $report_fh "$errors\n" if ($report_fh);
569                            }
570    
571                          # close MARC file                          print $report_fh "\nAll possible subfields/delimiter templates:\n", $validate->delimiters_templates( report => 1 ), "\n\n";
572                          $marc->finish if ($marc);                  }
573    
574                    if ($stats) {
575                            my $s = $input_db->stats;
576                            $log->info("statistics of fields usage:\n$s");
577                            print $report_fh "Statistics of fields usage:\n$s" if ($report_fh);
578                  }                  }
579    
580                    # close MARC file
581                    $marc->finish if ($marc);
582    
583                    # close report
584                    close($report_fh) if ($report_fh)
585    
586          }          }
587    
588          eval { $indexer->finish } if ($indexer && $indexer->can('finish'));          eval { $indexer->finish } if ($indexer && $indexer->can('finish'));
# Line 397  while (my ($database, $db_config) = each Line 594  while (my ($database, $db_config) = each
594                  )                  )
595          );          );
596    
         #  
         # add Hyper Estraier links to other databases  
         #  
         if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {  
                 foreach my $link (@{ $db_config->{links} }) {  
                         if ($use_indexer eq 'hyperestraier') {  
                                 $log->info("saving link $database -> $link->{to} [$link->{credit}]");  
                                 push @links, {  
                                         from => $database,  
                                         to => $link->{to},  
                                         credit => $link->{credit},  
                                 };  
                         } else {  
                                 $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");  
                         }  
                 }  
         }  
597    
598          # end forked process          # end forked process
599          if ($parallel) {          if ($parallel) {
# Line 429  if ($parallel) { Line 609  if ($parallel) {
609          $log->info("all parallel processes finished");          $log->info("all parallel processes finished");
610  }  }
611    
612  foreach my $link (@links) {  # save new delimiters if needed
613          $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");  $validate->save_delimiters_templates if ( $validate );
         $indexer->add_link( %{ $link } );  
 }  
614    
615    #
616    # handle links or merge after indexing
617    #
618    
619    if ($merge) {
620            print $estcmd_fh 'sudo /etc/init.d/hyperestraier start',$/;
621            close($estcmd_fh);
622            chmod 0700, $estcmd_path || $log->warn("can't chmod 0700 $estcmd_path: $!");
623            system $estcmd_path;
624    } else {
625            foreach my $link (@links) {
626                    $log->logdie("coderef in link ", Dumper($link), " is ", ref($link), " and not CODE") unless (ref($link) eq 'CODE');
627                    $link->();
628            }
629    }

Legend:
Removed from v.606  
changed lines
  Added in v.845

  ViewVC Help
Powered by ViewVC 1.1.26