diff options
| author | fukachan <fukachan> | 2001-02-20 15:03:55 +0000 |
|---|---|---|
| committer | fukachan <fukachan> | 2001-02-20 15:03:55 +0000 |
| commit | a26eb812e065e82546a9c93bd9c721101ac59f69 (patch) | |
| tree | f90fb35bbd487e07511c452561387976b619d362 /fml/lib/File/Sequence.pm | |
| parent | 60120edb4f3e83a82874a61b623d6c09e2978803 (diff) | |
| download | fml8-a26eb812e065e82546a9c93bd9c721101ac59f69.tar.gz fml8-a26eb812e065e82546a9c93bd9c721101ac59f69.tar.bz2 fml8-a26eb812e065e82546a9c93bd9c721101ac59f69.zip | |
move FML::SequenceFile and Utils to File::
add File::Errors also to avoid errors
Diffstat (limited to 'fml/lib/File/Sequence.pm')
| -rw-r--r-- | fml/lib/File/Sequence.pm | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/fml/lib/File/Sequence.pm b/fml/lib/File/Sequence.pm new file mode 100644 index 00000000..e0da18ae --- /dev/null +++ b/fml/lib/File/Sequence.pm @@ -0,0 +1,140 @@ +#-*- perl -*- +# +# Copyright (C) 2001 Ken'ichi Fukamachi +# All rights reserved. This program is free software; you can +# redistribute it and/or modify it under the same terms as Perl itself. +# +# $Id$ +# $FML$ +# + +package File::Sequence; +use strict; +use vars qw(@ISA @EXPORT @EXPORT_OK); +use Carp; +use File::Errors qw(error_reason error error_reset); + +=head1 NAME + +File::Sequence - maintain the sequence number + +=head1 SYNOPSIS + + use File::Sequence; + my $sfh = new File::Sequence { sequence_file => $seq_file }; + my $id = $sfh->increment_id; + if ($sfh->error) { use Carp; carp( $sfh->error ); } + +If you divide the $id by some modulus, use + + my $sfh = new File::Sequence { + sequence_file => $seq_file, + modulus => $modules, + }; + my $id = $sfh->increment_id; + +For example, if you do new() with modulus 3, + + my $sfh = new File::Sequence { + sequence_file => $seq_file, + modulus => 3, + }; + +$id becomes 0, 1, 2, 0, 1, 2... + +=head1 DESCRIPTION + +=head2 C<new($args)> + +$args->{ sequence_file } is the file holding the current sequence number. + +=head2 C<increment_id([$file])> + +increment the sequence number. + +=cut + +require Exporter; +@ISA = qw(Exporter); + + +sub new +{ + my ($self, $args) = @_; + my ($type) = ref($self) || $self; + my $me = {}; + $me->{ _sequence_file } = $args->{ sequence_file }; + $me->{ _modulus } = $args->{ modulus }; + return bless $me, $type; +} + + +sub increment_id +{ + my ($self, $file) = @_; + my $id = 0; + my $seq_file = $file || $self->{ _sequence_file }; + + unless ($seq_file) { + $self->error_reason("the sequence file is not specified"); + return 0; + }; + + # touch the sequence file if it does not exist. + unless (-f $seq_file) { + use File::Utils qw(touch); + touch($seq_file); + }; + + use IO::File::Atomic; + my ($rh, $wh) = IO::File::Atomic->rw_open($seq_file); + + # read the current sequence number + if (defined $rh) { + $id = $rh->getline; + $rh->close; + } + else { + $self->error_reason("cannot open the sequence file"); + return 0; + } + + # compute the modulus + if (defined $self->{ _modulus }) { + my $modulus = $self->{ _modulus }; + $id++; + $id = $id % $modulus; + } + # increment $id. The incremented number is the current article ID. + else { + $id++; + } + + # save $id + print $wh $id, "\n"; + $wh->close; + + $id; +} + + +=head1 AUTHOR + +Ken'ichi Fukamachi + +=head1 COPYRIGHT + +Copyright (C) 2001 Ken'ichi Fukamachi + +All rights reserved. This program is free software; you can +redistribute it and/or modify it under the same terms as Perl itself. + +=head1 HISTORY + +File::Sequence appeared in fml5 mailing list driver package. +See C<http://www.fml.org/> for more details. + +=cut + + +1; |
