yet another progress bar fix
[webpac] / all2xml.pl
index b7107e7..3fc1299 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/perl -w
 
 use strict;
-use OpenIsis;
+use IsisDB;
 use Getopt::Std;
 use Data::Dumper;
 use XML::Simple;
@@ -687,7 +687,10 @@ print STDERR "reading ./import_xml/$type.xml\n";
                my $current = shift;
                my $total = shift || 1;
                my $p = int($current * 100 / $total);
-               if ($p != $last_p) {
+               if ($p < $last_p || $current == 1) {
+                       $start_t = time();
+                       $last_p = 0;
+               } elsif ($p != $last_p) {
                        my $rate = ($current / (time() - $start_t || 1));
                        my $eta = ($total-$current) / ($rate || 1);
                        printf STDERR ("%5d [%-38s] %-5d %0.1f/s %s\r",$current,"=" x ($p/3)."$p%>", $total, $rate, fmt_time($eta));
@@ -696,16 +699,30 @@ print STDERR "reading ./import_xml/$type.xml\n";
        }
 
        my $fake_dir = 1;
+       my $fake_pos = 0;
+       my $last_fake_t = time();
        sub fakeprogress {
                return if (! $show_progress);
                my $current = shift @_;
 
-               my @ind = ('-','\\','|','/','-','\\','|','/', '-');
+               my @ind = ('-','\\','|','/','-','\\','|','/');
 
-               $last_p += $fake_dir;
-               $fake_dir = -$fake_dir if ($last_p > 1000 || $last_p < 0);
-               if ($last_p % 10 == 0) {
-                       printf STDERR ("%5d / %5s [%-51s]\r",$current,"?"," " x ($last_p/20).$ind[($last_p/20) % $#ind]);
+               if ($current < $fake_pos) {
+                       $start_t = time();
+                       $last_fake_t = 0;
+                       $fake_dir = 1;
+                       $fake_pos = 0;
+               }
+
+               if (time()-$last_fake_t >= 1) {
+                       $last_fake_t = time();
+                       $fake_pos += $fake_dir;
+                       $fake_dir = -$fake_dir if ($fake_pos > 38);
+               }
+
+               if ($current % 10 == 0) {
+                       my $rate = ($current / (time() - $start_t || 1));
+                       printf STDERR ("%5d [%-38s] %0.1f/s\r",$current, " " x $fake_pos .$ind[($current / 10) % 8], $rate);
                }
        }
 
@@ -720,66 +737,21 @@ print STDERR "using: $type...\n";
                my $isis_db = $cfg -> val($database, 'isis_db') || die "$database doesn't have 'isis_db' defined!";
 
                $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);
-               my $db = OpenIsis::open( $isis_db );
-
-               # check if .txt database for OpenIsis is zero length,
-               # if so, erase it and re-open database
-               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);
-               }
+               my $db = new IsisDB( isisdb => $isis_db );
 
-               # 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 );
-               }
+               my $max_rowid = $db->{'maxmfn'} || die "can't find maxmfn";
 
                print STDERR "Reading database: $isis_db [$max_rowid rows]\n";
 
                my $path = $database;
 
                for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {
-                       my $row = OpenIsis::read( $db, $row_id );
-                       if ($row && $row->{mfn}) {
-       
+                       my $row = $db->to_hash( $row_id );
+                       if ($row) {
+
+                               $row->{mfn} = $row_id;
+                               $row->{record} = $db->{record};
+
                                progress($row->{mfn}, $max_rowid);
 
                                my $swishpath = $path."#".int($row->{mfn});
@@ -793,10 +765,6 @@ print STDERR "using: $type...\n";
                                }
                        }
                }
-               # 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);
                print STDERR "\n";
 
        } elsif ($type_base eq "excel") {
@@ -964,7 +932,7 @@ all2xml.pl - read various file formats and dump XML for SWISH-E
 
 =head1 DESCRIPTION
 
-This command will read ISIS data file using OpenIsis perl module, MARC
+This command will read ISIS data file using IsisDB perl module, MARC
 records using MARC module and optionally Micro$oft Excel files to
 create one XML file for usage with I<SWISH-E> indexer. Dispite it's name,
 this script B<isn't general xml generator> from isis files (isis allready