/[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 674 by dpavlin, Tue Sep 12 14:47:25 2006 UTC
# Line 8  use lib './lib'; Line 8  use lib './lib';
8    
9  use WebPAC::Common 0.02;  use WebPAC::Common 0.02;
10  use WebPAC::Lookup 0.03;  use WebPAC::Lookup 0.03;
11  use WebPAC::Input 0.07;  use WebPAC::Input 0.11;
12  use WebPAC::Store 0.03;  use WebPAC::Store 0.03;
13  use WebPAC::Normalize 0.11;  use WebPAC::Normalize 0.11;
14  use WebPAC::Output::TT;  use WebPAC::Output::TT;
15  use WebPAC::Validate;  use WebPAC::Validate 0.06;
16  use WebPAC::Output::MARC;  use WebPAC::Output::MARC;
17  use YAML qw/LoadFile/;  use YAML qw/LoadFile/;
18  use Getopt::Long;  use Getopt::Long;
# Line 60  path to YAML configuration file Line 60  path to YAML configuration file
60    
61  =item --stats  =item --stats
62    
63  disable indexing and dump statistics about field and subfield  disable indexing, modify_* in configuration and dump statistics about field
64  usage for each input  and subfield usage for each input
65    
66  =item --validate path/to/validation_file  =item --validate path/to/validation_file
67    
# Line 89  Force dump or input and marc record for Line 89  Force dump or input and marc record for
89  Run databases in parallel (aproximatly same as number of processors in  Run databases in parallel (aproximatly same as number of processors in
90  machine if you want to use full load)  machine if you want to use full load)
91    
92    =item --only-links
93    
94    Create just links
95    
96    =item --merge
97    
98    Create merged index of databases which have links
99    
100  =back  =back
101    
102  =cut  =cut
# Line 105  my $validate_path; Line 113  my $validate_path;
113  my ($marc_normalize, $marc_output);  my ($marc_normalize, $marc_output);
114  my $marc_lint = 1;  my $marc_lint = 1;
115  my $marc_dump = 0;  my $marc_dump = 0;
   
116  my $parallel = 0;  my $parallel = 0;
117    my $only_links = 0;
118    my $merge = 0;
119    
120    my $log = _new WebPAC::Common()->_get_logger();
121    
122    my $hostname = `hostname`;
123    chomp($hostname);
124    $hostname =~ s/\..+$//;
125    if (-e "conf/$hostname.yml") {
126            $config = "conf/$hostname.yml";
127            $log->info("using host configuration file: $config");
128    }
129    
130  GetOptions(  GetOptions(
131          "limit=i" => \$limit,          "limit=i" => \$limit,
# Line 123  GetOptions( Line 142  GetOptions(
142          "marc-lint!" => \$marc_lint,          "marc-lint!" => \$marc_lint,
143          "marc-dump!" => \$marc_dump,          "marc-dump!" => \$marc_dump,
144          "parallel=i" => \$parallel,          "parallel=i" => \$parallel,
145            "only-links!" => \$only_links,
146            "merge" => \$merge,
147  );  );
148    
149  $config = LoadFile($config);  $config = LoadFile($config);
150    
151  print "config = ",dump($config) if ($debug);  #print "config = ",dump($config) if ($debug);
152    
153  die "no databases in config file!\n" unless ($config->{databases});  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    
158    my $estcmd_fh;
159    my $estcmd_path = './estcmd-merge.sh';
160    if ($merge) {
161            open($estcmd_fh, '>', $estcmd_path) || $log->logdie("can't open $estcmd_path: $!");
162            print $estcmd_fh 'cd /data/estraier/_node/ || exit 1',$/;
163            print $estcmd_fh 'sudo /etc/init.d/hyperestraier stop',$/;
164            $log->info("created merge batch file $estcmd_path");
165    }
166    
167    
168  my $validate;  my $validate;
169  $validate = new WebPAC::Validate(  $validate = new WebPAC::Validate(
170          path => $validate_path,          path => $validate_path,
171  ) if ($validate_path);  ) if ($validate_path);
172    
173    
174  my $use_indexer = $config->{use_indexer} || 'hyperestraier';  my $use_indexer = $config->{use_indexer} || 'hyperestraier';
175  if ($stats) {  if ($stats) {
176          $log->debug("option --stats disables update of indexing engine...");          $log->debug("option --stats disables update of indexing engine...");
# Line 154  my $total_rows = 0; Line 186  my $total_rows = 0;
186  my $start_t = time();  my $start_t = time();
187    
188  my @links;  my @links;
 my $indexer;  
189    
190  if ($parallel) {  if ($parallel) {
191          $log->info("Using $parallel processes for speedup");          $log->info("Using $parallel processes for speedup");
# Line 175  while (my ($database, $db_config) = each Line 206  while (my ($database, $db_config) = each
206                  }                  }
207          }          }
208    
209            my $indexer;
210          if ($use_indexer) {          if ($use_indexer) {
211                  my $indexer_config = $config->{$use_indexer} || $log->logdie("can't find '$use_indexer' part in confguration");  
212                    my $cfg_name = $use_indexer;
213                    $cfg_name =~ s/\-.*$//;
214    
215                    my $indexer_config = $config->{$cfg_name} || $log->logdie("can't find '$cfg_name' part in confguration");
216                  $indexer_config->{database} = $database;                  $indexer_config->{database} = $database;
217                  $indexer_config->{clean} = $clean;                  $indexer_config->{clean} = $clean;
218                  $indexer_config->{label} = $db_config->{name};                  $indexer_config->{label} = $db_config->{name};
219    
220                    # force clean if database has links
221                    $indexer_config->{clean} = 1 if ($db_config->{links});
222    
223                  if ($use_indexer eq 'hyperestraier') {                  if ($use_indexer eq 'hyperestraier') {
224    
225                          # open Hyper Estraier database                          # open Hyper Estraier database
226                          use WebPAC::Output::Estraier '0.10';                          use WebPAC::Output::Estraier '0.10';
227                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );                          $indexer = new WebPAC::Output::Estraier( %{ $indexer_config } );
228                                    
229                    } elsif ($use_indexer eq 'hyperestraier-native') {
230    
231                            # open Hyper Estraier database
232                            use WebPAC::Output::EstraierNative;
233                            $indexer = new WebPAC::Output::EstraierNative( %{ $indexer_config } );
234    
235                  } elsif ($use_indexer eq 'kinosearch') {                  } elsif ($use_indexer eq 'kinosearch') {
236    
237                          # open KinoSearch                          # open KinoSearch
# Line 203  while (my ($database, $db_config) = each Line 248  while (my ($database, $db_config) = each
248    
249    
250          #          #
251            # store Hyper Estraier links to other databases
252            #
253            if (ref($db_config->{links}) eq 'ARRAY' && $use_indexer) {
254                    foreach my $link (@{ $db_config->{links} }) {
255                            if ($use_indexer eq 'hyperestraier') {
256                                    if ($merge) {
257                                            print $estcmd_fh 'sudo -u www-data estcmd merge ' . $database . ' ' . $link->{to},$/;
258                                    } else {
259                                            $log->info("saving link $database -> $link->{to} [$link->{credit}]");
260                                            push @links, sub {
261                                                    $log->info("adding link $database -> $link->{to} [$link->{credit}]");
262                                                    $indexer->add_link(
263                                                            from => $database,
264                                                            to => $link->{to},
265                                                            credit => $link->{credit},
266                                                    );
267                                            };
268                                    }
269                            } else {
270                                    $log->warn("NOT IMPLEMENTED WITH $use_indexer: adding link $database -> $link->{to} [$link->{credit}]");
271                            }
272                    }
273            }
274            next if ($only_links);
275    
276    
277            #
278          # now WebPAC::Store          # now WebPAC::Store
279          #          #
280          my $abs_path = abs_path($0);          my $abs_path = abs_path($0);
# Line 261  while (my ($database, $db_config) = each Line 333  while (my ($database, $db_config) = each
333                          $input->{lookup} ? "lookup '$input->{lookup}'" : ""                          $input->{lookup} ? "lookup '$input->{lookup}'" : ""
334                  );                  );
335    
336                    if ($stats) {
337                            # disable modification of records if --stats is in use
338                            delete($input->{modify_records});
339                            delete($input->{modify_file});
340                    }
341    
342                  my $input_db = new WebPAC::Input(                  my $input_db = new WebPAC::Input(
343                          module => $input_module,                          module => $input_module,
344                          encoding => $config->{webpac}->{webpac_encoding},                          encoding => $config->{webpac}->{webpac_encoding},
# Line 273  while (my ($database, $db_config) = each Line 351  while (my ($database, $db_config) = each
351                          recode => $input->{recode},                          recode => $input->{recode},
352                          stats => $stats,                          stats => $stats,
353                          modify_records => $input->{modify_records},                          modify_records => $input->{modify_records},
354                            modify_file => $input->{modify_file},
355                  );                  );
356                  $log->logdie("can't create input using $input_module") unless ($input);                  $log->logdie("can't create input using $input_module") unless ($input);
357    
# Line 282  while (my ($database, $db_config) = each Line 361  while (my ($database, $db_config) = each
361                          %{ $input },                          %{ $input },
362                  );                  );
363    
364                    my $report_fh;
365                    if ($stats || $validate) {
366                            my $path = "out/report/" . $database . '-' . $input->{name} . '.txt';
367                            open($report_fh, '>', $path) || $log->logdie("can't open $path: $!");
368    
369                            print $report_fh "Report for database '$database' input '$input->{name}' records ",
370                                    $offset || 1, "-", $limit || $input->{limit} || $maxmfn, "\n\n";
371                            $log->info("Generating report file $path");
372                    }
373    
374                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?                  my @norm_array = ref($input->{normalize}) eq 'ARRAY' ?
375                          @{ $input->{normalize} } : ( $input->{normalize} );                          @{ $input->{normalize} } : ( $input->{normalize} );
376    
# Line 311  while (my ($database, $db_config) = each Line 400  while (my ($database, $db_config) = each
400                          # reset position in database                          # reset position in database
401                          $input_db->seek(1);                          $input_db->seek(1);
402    
403                            # generate name of config key for indexer (strip everything after -)
404                            my $indexer_config = $use_indexer;
405                            $indexer_config =~ s/^(\w+)-?.*$/$1/g;
406    
407                          foreach my $pos ( 0 ... $input_db->size ) {                          foreach my $pos ( 0 ... $input_db->size ) {
408    
409                                  my $row = $input_db->fetch || next;                                  my $row = $input_db->fetch || next;
# Line 325  while (my ($database, $db_config) = each Line 418  while (my ($database, $db_config) = each
418    
419    
420                                  if ($validate) {                                  if ($validate) {
421                                          my @errors = $validate->validate_errors( $row );                                          if ( my $errors = $validate->validate_errors( $row, $input_db->dump ) ) {
422                                          $log->error( "MFN $mfn validation errors:\n", join("\n", @errors) ) if (@errors);                                                  $log->error( "MFN $mfn validation error:\n",
423                                                            $validate->report_error( $errors )
424                                                    );
425                                            }
426                                  }                                  }
427    
428                                  my $ds_config = dclone($db_config);                                  my $ds_config = dclone($db_config);
# Line 357  while (my ($database, $db_config) = each Line 453  while (my ($database, $db_config) = each
453                                  $indexer->add(                                  $indexer->add(
454                                          id => $input->{name} . "/" . $mfn,                                          id => $input->{name} . "/" . $mfn,
455                                          ds => $ds,                                          ds => $ds,
456                                          type => $config->{$use_indexer}->{type},                                          type => $config->{$indexer_config}->{type},
457                                  ) if ($indexer && $ds);                                  ) if ($indexer && $ds);
458    
459                                  if ($marc) {                                  if ($marc) {
# Line 379  while (my ($database, $db_config) = each Line 475  while (my ($database, $db_config) = each
475                                  $total_rows++;                                  $total_rows++;
476                          }                          }
477    
478                          $log->info("statistics of fields usage:\n", $input_db->stats) if ($stats);                          if ($validate) {
479                                    my $errors = $validate->report;
480                                    if ($errors) {
481                                            $log->info("validation errors:\n$errors\n" );
482                                            print $report_fh "$errors\n" if ($report_fh);
483                                    }
484                            }
485    
486                            if ($stats) {
487                                    my $s = $input_db->stats;
488                                    $log->info("statistics of fields usage:\n$s");
489                                    print $report_fh "Statistics of fields usage:\n$s" if ($report_fh);
490                            }
491    
492                          # close MARC file                          # close MARC file
493                          $marc->finish if ($marc);                          $marc->finish if ($marc);
494    
495                            # close report
496                            close($report_fh) if ($report_fh)
497                  }                  }
498    
499          }          }
# Line 397  while (my ($database, $db_config) = each Line 507  while (my ($database, $db_config) = each
507                  )                  )
508          );          );
509    
         #  
         # 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}]");  
                         }  
                 }  
         }  
510    
511          # end forked process          # end forked process
512          if ($parallel) {          if ($parallel) {
# Line 429  if ($parallel) { Line 522  if ($parallel) {
522          $log->info("all parallel processes finished");          $log->info("all parallel processes finished");
523  }  }
524    
525  foreach my $link (@links) {  #
526          $log->info("adding link $link->{from} -> $link->{to} [$link->{credit}]");  # handle links or merge after indexing
527          $indexer->add_link( %{ $link } );  #
528    
529    if ($merge) {
530            print $estcmd_fh 'sudo /etc/init.d/hyperestraier start',$/;
531            close($estcmd_fh);
532            chmod 0700, $estcmd_path || $log->warn("can't chmod 0700 $estcmd_path: $!");
533            system $estcmd_path;
534    } else {
535            foreach my $link (@links) {
536                    $log->logdie("coderef in link ", Dumper($link), " is ", ref($link), " and not CODE") unless (ref($link) eq 'CODE');
537                    $link->();
538            }
539  }  }
   

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

  ViewVC Help
Powered by ViewVC 1.1.26