summaryrefslogtreecommitdiff
path: root/fml/lib/File/Sequence.pm
diff options
context:
space:
mode:
authorfukachan <fukachan>2001-02-20 15:03:55 +0000
committerfukachan <fukachan>2001-02-20 15:03:55 +0000
commita26eb812e065e82546a9c93bd9c721101ac59f69 (patch)
treef90fb35bbd487e07511c452561387976b619d362 /fml/lib/File/Sequence.pm
parent60120edb4f3e83a82874a61b623d6c09e2978803 (diff)
downloadfml8-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.pm140
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;