/[webpac]/trunk/all2xml.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/all2xml.pl

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

revision 618 by dpavlin, Fri Dec 31 03:35:43 2004 UTC revision 643 by dpavlin, Sun Jan 23 15:18:03 2005 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl -w  #!/usr/bin/perl -w
2    
3  use strict;  use strict;
4  use OpenIsis;  use Biblio::Isis;
5  use Getopt::Std;  use Getopt::Std;
6  use Data::Dumper;  use Data::Dumper;
7  use XML::Simple;  use XML::Simple;
# Line 22  die "FATAL: can't find configuration fil Line 22  die "FATAL: can't find configuration fil
22  my $config;  my $config;
23    
24  #use index_DBI;         # default DBI module for index  #use index_DBI;         # default DBI module for index
25  use index_DBI_cache;    # faster DBI module using memory cache  #use index_DBI_cache;   # faster DBI module using memory cache
26    use index_DBI_filter;   # filter support for indexes
27  my $index;  my $index;
28    
29  my %opts;  my %opts;
# Line 257  sub data2xml { Line 258  sub data2xml {
258                          # init vars so that we go into while...                          # init vars so that we go into while...
259                          ($swish,$display) = (1,1);                          ($swish,$display) = (1,1);
260    
                         # placeholder for all repeatable entries for index  
   
261                          sub mkformat($$) {                          sub mkformat($$) {
262                                  my $x = shift || die "mkformat needs tag reference";                                  my $x = shift || die "mkformat needs tag reference";
263                                  my $data = shift || return;                                  my $data = shift || return;
# Line 687  print STDERR "reading ./import_xml/$type Line 686  print STDERR "reading ./import_xml/$type
686                  my $current = shift;                  my $current = shift;
687                  my $total = shift || 1;                  my $total = shift || 1;
688                  my $p = int($current * 100 / $total);                  my $p = int($current * 100 / $total);
689                  if ($p != $last_p) {                  if ($p < $last_p || $current == 1) {
690                            $start_t = time();
691                            $last_p = 0;
692                    } elsif ($p != $last_p) {
693                          my $rate = ($current / (time() - $start_t || 1));                          my $rate = ($current / (time() - $start_t || 1));
694                          my $eta = ($total-$current) / ($rate || 1);                          my $eta = ($total-$current) / ($rate || 1);
695                          printf STDERR ("%5d [%-38s] %-5d %0.1f/s %s\r",$current,"=" x ($p/3)."$p%>", $total, $rate, fmt_time($eta));                          printf STDERR ("%5d [%-38s] %-5d %0.1f/s %s\r",$current,"=" x ($p/3)."$p%>", $total, $rate, fmt_time($eta));
# Line 696  print STDERR "reading ./import_xml/$type Line 698  print STDERR "reading ./import_xml/$type
698          }          }
699    
700          my $fake_dir = 1;          my $fake_dir = 1;
701            my $fake_pos = 0;
702            my $last_fake_t = time();
703          sub fakeprogress {          sub fakeprogress {
704                  return if (! $show_progress);                  return if (! $show_progress);
705                  my $current = shift @_;                  my $current = shift @_;
706    
707                  my @ind = ('-','\\','|','/','-','\\','|','/', '-');                  my @ind = ('-','\\','|','/','-','\\','|','/');
708    
709                    if ($current < $fake_pos) {
710                            $start_t = time();
711                            $last_fake_t = 0;
712                            $fake_dir = 1;
713                            $fake_pos = 0;
714                    }
715    
716                  $last_p += $fake_dir;                  if (time()-$last_fake_t >= 1) {
717                  $fake_dir = -$fake_dir if ($last_p > 1000 || $last_p < 0);                          $last_fake_t = time();
718                  if ($last_p % 10 == 0) {                          $fake_pos += $fake_dir;
719                          printf STDERR ("%5d / %5s [%-51s]\r",$current,"?"," " x ($last_p/20).$ind[($last_p/20) % $#ind]);                          $fake_dir = -$fake_dir if ($fake_pos > 38);
720                    }
721    
722                    if ($current % 10 == 0) {
723                            my $rate = ($current / (time() - $start_t || 1));
724                            printf STDERR ("%5d [%-38s] %0.1f/s\r",$current, " " x $fake_pos .$ind[($current / 10) % 8], $rate);
725                  }                  }
726          }          }
727    
# Line 720  print STDERR "using: $type...\n"; Line 736  print STDERR "using: $type...\n";
736                  my $isis_db = $cfg -> val($database, 'isis_db') || die "$database doesn't have 'isis_db' defined!";                  my $isis_db = $cfg -> val($database, 'isis_db') || die "$database doesn't have 'isis_db' defined!";
737    
738                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);
739                  my $db = OpenIsis::open( $isis_db );                  my $db = new Biblio::Isis( isisdb => $isis_db );
740    
741                  # check if .txt database for OpenIsis is zero length,                  my $max_rowid = $db->count || die "can't find maxmfn";
742                  # if so, erase it and re-open database  $max_rowid = 200; # XXX
                 sub check_txt_db {  
                         my $isis_db = shift || die "need isis database name";  
                         my $reopen = 0;  
   
                         if (-e $isis_db.".TXT") {  
                                 print STDERR "WARNING: removing $isis_db.TXT OpenIsis database...\n";  
                                 unlink $isis_db.".TXT" || warn "FATAL: unlink error on '$isis_db.TXT': $!";  
                                 $reopen++;  
                         }  
                         if (-e $isis_db.".PTR") {  
                                 print STDERR "WARNING: removing $isis_db.PTR OpenIsis database...\n";  
                                 unlink $isis_db.".PTR" || warn "FATAL: unlink error on '$isis_db.PTR': $!";  
                                 $reopen++;  
                         }  
                         return OpenIsis::open( $isis_db ) if ($reopen);  
                 }  
   
                 # EOF error  
                 if ($db == -1) {  
                         $db = check_txt_db($isis_db);  
                         if ($db == -1) {  
                                 print STDERR "FATAL: OpenIsis can't open zero size file $isis_db\n";  
                                 next;  
                         }  
                 }  
   
                 # OpenIsis::ERR_BADF  
                 if ($db == -4) {  
                         print STDERR "FATAL: OpenIsis can't find file $isis_db\n";  
                         next;  
                 # OpenIsis::ERR_IO  
                 } elsif ($db == -5) {  
                         print STDERR "FATAL: OpenIsis can't access file $isis_db\n";  
                         next;  
                 } elsif ($db < 0) {  
                         print STDERR "FATAL: OpenIsis unknown error $db with file $isis_db\n";  
                         next;  
                 }  
   
                 my $max_rowid = OpenIsis::maxRowid( $db );  
   
                 # if 0 records, try to rease isis .txt database  
                 if ($max_rowid == 0) {  
                         # force removal of database  
                         $db = check_txt_db($isis_db);  
                         $max_rowid = OpenIsis::maxRowid( $db );  
                 }  
743    
744                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";
745    
746                  my $path = $database;                  $path = $database;
747    
748                  for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {                  for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {
749                          my $row = OpenIsis::read( $db, $row_id );                          my $row = $db->to_hash( $row_id );
750                          if ($row && $row->{mfn}) {                          if ($row) {
751            
752                                    $row->{mfn} = $row_id;
753                                    $row->{record} = $db->{record};
754    
755                                  progress($row->{mfn}, $max_rowid);                                  progress($row->{mfn}, $max_rowid);
756    
757                                  my $swishpath = $path."#".int($row->{mfn});                                  my $swishpath = $path."#".int($row->{mfn});
# Line 793  print STDERR "using: $type...\n"; Line 765  print STDERR "using: $type...\n";
765                                  }                                  }
766                          }                          }
767                  }                  }
                 # for this to work with current version of OpenIsis (0.9.0)  
                 # you might need my patch from  
                 # http://www.rot13.org/~dpavlin/projects/openisis-0.9.0-perl_close.diff  
                 OpenIsis::close($db);  
768                  print STDERR "\n";                  print STDERR "\n";
769    
770          } elsif ($type_base eq "excel") {          } elsif ($type_base eq "excel") {
# Line 860  print STDERR "using: $type...\n"; Line 828  print STDERR "using: $type...\n";
828                  }                  }
829          } elsif ($type_base eq "marc") {          } elsif ($type_base eq "marc") {
830    
831                  require MARC;                  require MARC::File::USMARC;
832                                    
833                  $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);
834                  my $marc_file = $cfg -> val($database, 'marc_file') || die "$database doesn't have 'marc_file' defined!";                  my $marc_file = $cfg -> val($database, 'marc_file') || die "$database doesn't have 'marc_file' defined!";
835    
836                  # optional argument is format                  # optional argument is format
837                  my $format = x($config->{marc_format}) || 'usmarc';                  warn "marc_format is no longer used!" if ($config->{marc_format});
   
838                  print STDERR "Reading MARC file '$marc_file'\n";                  print STDERR "Reading MARC file '$marc_file'\n";
839    
840                  my $marc = new MARC;                  my $marc = MARC::File::USMARC->in( $marc_file )
841                  my $nr = $marc->openmarc({                          || die "Can't open MARC file '$marc_file': ".$MARC::File::ERROR;
                                 file=>$marc_file, format=>$format  
                         }) || die "Can't open MARC file '$marc_file' with format '$format'";  
842    
843                  # read MARC file in memory                  # count records in MARC file
844                  $marc->nextmarc(-1);                  sub marc_count {
845                            my $filename = shift || die;
846                            my $file = MARC::File::USMARC->in($filename) || die $MARC::File::ERROR;
847                            my $count = 0;
848                            while ($file->skip()) {
849                                    $count++;
850                            }
851                            return $count;
852                    }
853    
854                  my $max_rec = $marc->marc_count();                  my $count = marc_count($marc_file) || warn "no records in '$marc_file'?";
855    
856                  for(my $i=1; $i<=$max_rec; $i++) {                  my $i = 0;
857    
858                          progress($i,$max_rec);                  while( my $rec = $marc->next() ) {
859    
860                          # store value for marc_sf.pm                          progress($i++,$count);
                         $main::cache->{marc_record} = $i;  
861    
862                          my $swishpath = $database."#".$i;                          my $swishpath = $database."#".$i;
863    
864                          if (my $xml = data2xml($type_base,$marc,$add_xml,$cfg,$database)) {                          if (my $xml = data2xml($type_base,$rec,$add_xml,$cfg,$database)) {
865                                  $xml = $cp2utf->convert($xml);                                  $xml = $cp2utf->convert($xml);
866                                  use bytes;      # as opposed to chars                                  use bytes;      # as opposed to chars
867                                  print "Path-Name: $swishpath\n";                                  print "Path-Name: $swishpath\n";
# Line 960  all2xml.pl - read various file formats a Line 932  all2xml.pl - read various file formats a
932    
933  =head1 DESCRIPTION  =head1 DESCRIPTION
934    
935  This command will read ISIS data file using OpenIsis perl module, MARC  This command will read ISIS data file using IsisDB perl module, MARC
936  records using MARC module and optionally Micro$oft Excel files to  records using MARC module and optionally Micro$oft Excel files to
937  create one XML file for usage with I<SWISH-E> indexer. Dispite it's name,  create one XML file for usage with I<SWISH-E> indexer. Dispite it's name,
938  this script B<isn't general xml generator> from isis files (isis allready  this script B<isn't general xml generator> from isis files (isis allready

Legend:
Removed from v.618  
changed lines
  Added in v.643

  ViewVC Help
Powered by ViewVC 1.1.26