Alvis-Convert

 view release on metacpan or  search on metacpan

lib/Alvis/Buffer.pm  view on Meta::CPAN

it under the same terms as Perl itself, either Perl version 5.8.4 or,
at your option, any later version of Perl 5 you may have available.

=cut




#############################################
#  parameters - fixed per instance
our $BUFFER="building.xml-ish";
our $HEADER='<?xml version="1.0" encoding="UTF-8"?>
<documentCollection xmlns="http://alvis.info/enriched/" version="1.1">
';
our $TRAILER='</documentCollection>
';

#############################################
#  run time variables
our $docs = 0;
our $size = 0;
our $verbose = 0;

############################################
#
#  add XML chunk
sub add() {
  my $xml = shift();
  my $xc = $xml;
  my $count = $xc =~ s/<\/documentRecord>//g;
  #  now save
  print ABUF $xml,"\n";
  if ( $verbose ) {
    my $tt = Time::Simple->new;
    print STDERR "Docs of $count of size " . length($xml) . " added at time "
      . $tt->format . "\n";
  }
  $docs += $count;
  $size += length($xml);
}

sub close() {
  CORE::close(ABUF);
}

############################################
#
#  make sure the output XML buffer file is in OK state
#  and open it for append, as filehandle ABUF
#  and set $docs, $size
#  return 0 on fatal error, after printing error message
sub fix() {
  $docs = 0;
  $size = 0;
  if ( ! -f $BUFFER ) {
    #  start new one
    if ( ! open(ABUF,">>$BUFFER") ) {
      print STDERR "Cannot open $BUFFER: $!\n";
      return 0;
    }
    select((select(ABUF), $| = 1)[0]);
    print ABUF $HEADER;
  } else {
    #  check old one first
    if ( ! open(ABUF,"<$BUFFER") ) {
      print STDERR "Cannot open $BUFFER: $!\n";
      return 0;
    }
    #  its a UTF-8 file, so have to read it all
    #  since cannot start half way through
    my $last = "";
    my $last2 = "";
    my $last3 = "";
    while ( ($_=<ABUF>) ) {
      if (  ! /^\s+$/ ) {
	$last3 = $last2;
	$last2 = $last;
	$last = $_;
	if ( /<\/documentRecord/ ) {
	  $docs++;
	}
	$size += length($_);
      }
    }
    $last = $last3 . $last2 . $last;
    if ( $last !~ /<documentCollection [^>]+>\s*$/
	 && $last !~ /<\/documentRecord>\s*$/ ) {
      print STDERR "Output buffer $BUFFER in unstable state\n";
      if (  $last =~ /<\/documentCollection>/ ) {
	print STDERR "  has been completed, so move manually\n";
      }
      return 0;
    }
    CORE::close(ABUF);
    # now open for append
    if ( ! open(ABUF,">>$BUFFER") ) {
      print STDERR "Cannot open $BUFFER: $!\n";
      return 0;
    }
    select((select(ABUF), $| = 1)[0]);
  }
  1;
}

############################################
#
#  rename output XML buffer file to xml-add/N.xml for some N
#  and create a new output XML buffer file, name is returned;
#  return undef on fatal error, after printing error message
sub save() {
  print ABUF $TRAILER; 
  CORE::close(ABUF);
  #  determine next available name
  if ( ! opendir(XA,"xml-add") ) {
    print STDERR "Cannot opendir xml-add/: $!\n";
    return undef;
  }
  my $latest = 0;
  while ( ($_=readdir(XA)) ) {
    if ( /^([0-9]+).xml$/ ) {
      if ( $latest < int($1) ) {
	$latest = int($1);
      }
    }
  }
  closedir(XA);
  if ( ! $latest ) {
    if ( !opendir(XA,"xml") ) {
      print STDERR "Cannot opendir xml/: $!\n";
      return undef;
    }
    while ( ($_=readdir(XA)) ) {
      if ( /^([0-9]+).xml$/ ) {
	if ( $latest < int($1) ) {
	  $latest = int($1);
	}
      }
    }
    closedir(XA);
  }
  $latest++;
  my $nf = "xml-add/$latest.xml";
  #   now save
  rename($BUFFER,$nf);
  if ( ! &fix() ) {
    return undef;
  }
  return $nf;
}

1;



( run in 0.694 second using v1.01-cache-2.11-cpan-39bf76dae61 )