/[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 619 by dpavlin, Fri Dec 31 04:22:49 2004 UTC revision 620 by dpavlin, Sat Jan 1 18:16:21 2005 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl -w  #!/usr/bin/perl -w
2    
3  use strict;  use strict;
4  use IsisDB;  use OpenIsis;
5  use Getopt::Std;  use Getopt::Std;
6  use Data::Dumper;  use Data::Dumper;
7  use XML::Simple;  use XML::Simple;
# Line 684  print STDERR "reading ./import_xml/$type Line 684  print STDERR "reading ./import_xml/$type
684          my $start_t = time();          my $start_t = time();
685          sub progress {          sub progress {
686                  return if (! $show_progress);                  return if (! $show_progress);
687                  my $current = shift || 1;                  my $current = shift;
688                  my $total = shift || 1;                  my $total = shift || 1;
689                  my $p = int($current * 100 / $total);                  my $p = int($current * 100 / $total);
690                  if ($p != $last_p) {                  if ($p != $last_p) {
# Line 720  print STDERR "using: $type...\n"; Line 720  print STDERR "using: $type...\n";
720                  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!";
721    
722                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);
723                  my $db = new IsisDB( isisdb => $isis_db );                  my $db = OpenIsis::open( $isis_db );
724    
725                  my $max_rowid = $db->{'maxmfn'} || die "can't find maxmfn";                  # check if .txt database for OpenIsis is zero length,
726                    # if so, erase it and re-open database
727                    sub check_txt_db {
728                            my $isis_db = shift || die "need isis database name";
729                            my $reopen = 0;
730    
731                            if (-e $isis_db.".TXT") {
732                                    print STDERR "WARNING: removing $isis_db.TXT OpenIsis database...\n";
733                                    unlink $isis_db.".TXT" || warn "FATAL: unlink error on '$isis_db.TXT': $!";
734                                    $reopen++;
735                            }
736                            if (-e $isis_db.".PTR") {
737                                    print STDERR "WARNING: removing $isis_db.PTR OpenIsis database...\n";
738                                    unlink $isis_db.".PTR" || warn "FATAL: unlink error on '$isis_db.PTR': $!";
739                                    $reopen++;
740                            }
741                            return OpenIsis::open( $isis_db ) if ($reopen);
742                    }
743    
744                    # EOF error
745                    if ($db == -1) {
746                            $db = check_txt_db($isis_db);
747                            if ($db == -1) {
748                                    print STDERR "FATAL: OpenIsis can't open zero size file $isis_db\n";
749                                    next;
750                            }
751                    }
752    
753                    # OpenIsis::ERR_BADF
754                    if ($db == -4) {
755                            print STDERR "FATAL: OpenIsis can't find file $isis_db\n";
756                            next;
757                    # OpenIsis::ERR_IO
758                    } elsif ($db == -5) {
759                            print STDERR "FATAL: OpenIsis can't access file $isis_db\n";
760                            next;
761                    } elsif ($db < 0) {
762                            print STDERR "FATAL: OpenIsis unknown error $db with file $isis_db\n";
763                            next;
764                    }
765    
766                    my $max_rowid = OpenIsis::maxRowid( $db );
767    
768                    # if 0 records, try to rease isis .txt database
769                    if ($max_rowid == 0) {
770                            # force removal of database
771                            $db = check_txt_db($isis_db);
772                            $max_rowid = OpenIsis::maxRowid( $db );
773                    }
774    
775                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";
776    
777                  my $path = $database;                  my $path = $database;
778    
779                  for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {                  for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {
780                          my $row = $db->to_hash( $row_id );                          my $row = OpenIsis::read( $db, $row_id );
781                          if ($row) {                          if ($row && $row->{mfn}) {
782            
                                 $row->{mfn} = $row_id;  
                                 $row->{record} = $db->{record};  
   
783                                  progress($row->{mfn}, $max_rowid);                                  progress($row->{mfn}, $max_rowid);
784    
785                                  my $swishpath = $path."#".int($row->{mfn});                                  my $swishpath = $path."#".int($row->{mfn});
# Line 748  print STDERR "using: $type...\n"; Line 793  print STDERR "using: $type...\n";
793                                  }                                  }
794                          }                          }
795                  }                  }
796                    # for this to work with current version of OpenIsis (0.9.0)
797                    # you might need my patch from
798                    # https://www.rot13.org/~dpavlin/projects/openisis-0.9.0-perl_close.diff
799                    OpenIsis::close($db);
800                  print STDERR "\n";                  print STDERR "\n";
801    
802          } elsif ($type_base eq "excel") {          } elsif ($type_base eq "excel") {
# Line 811  print STDERR "using: $type...\n"; Line 860  print STDERR "using: $type...\n";
860                  }                  }
861          } elsif ($type_base eq "marc") {          } elsif ($type_base eq "marc") {
862    
863                  require MARC;                  require MARC::File::USMARC;
864                                    
865                  $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);                  $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);
866                  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!";
867    
868                  # optional argument is format                  # optional argument is format
869                  my $format = x($config->{marc_format}) || 'usmarc';                  warn "marc_format is no longer used!" if ($config->{marc_format});
   
870                  print STDERR "Reading MARC file '$marc_file'\n";                  print STDERR "Reading MARC file '$marc_file'\n";
871    
872                  my $marc = new MARC;                  my $marc = MARC::File::USMARC->in( $marc_file )
873                  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'";  
874    
875                  # read MARC file in memory                  # count records in MARC file
876                  $marc->nextmarc(-1);                  sub marc_count {
877                            my $filename = shift || die;
878                            my $file = MARC::File::USMARC->in($filename) || die $MARC::File::ERROR;
879                            my $count = 0;
880                            while ($file->skip()) {
881                                    $count++;
882                            }
883                            return $count;
884                    }
885    
886                  my $max_rec = $marc->marc_count();                  my $count = marc_count($marc_file) || warn "no records in '$marc_file'?";
887    
888                  for(my $i=1; $i<=$max_rec; $i++) {                  my $i = 0;
889    
890                          progress($i,$max_rec);                  while( my $rec = $marc->next() ) {
891    
892                          # store value for marc_sf.pm                          progress($i++,$count);
                         $main::cache->{marc_record} = $i;  
893    
894                          my $swishpath = $database."#".$i;                          my $swishpath = $database."#".$i;
895    
896                          if (my $xml = data2xml($type_base,$marc,$add_xml,$cfg,$database)) {                          if (my $xml = data2xml($type_base,$rec,$add_xml,$cfg,$database)) {
897                                  $xml = $cp2utf->convert($xml);                                  $xml = $cp2utf->convert($xml);
898                                  use bytes;      # as opposed to chars                                  use bytes;      # as opposed to chars
899                                  print "Path-Name: $swishpath\n";                                  print "Path-Name: $swishpath\n";

Legend:
Removed from v.619  
changed lines
  Added in v.620

  ViewVC Help
Powered by ViewVC 1.1.26