summaryrefslogtreecommitdiff
path: root/fml/lib
diff options
context:
space:
mode:
authorfukachan <fukachan>2003-03-16 10:44:40 +0000
committerfukachan <fukachan>2003-03-16 10:44:40 +0000
commit82bb28981ac79e3f4017b396d2f627eaf4896182 (patch)
treecf3cb4169f78841bd3952f97d933f67266d6069d /fml/lib
parent010c3f1f92bf862013c46b8457c0dc901d8ba110 (diff)
downloadfml8-82bb28981ac79e3f4017b396d2f627eaf4896182.tar.gz
fml8-82bb28981ac79e3f4017b396d2f627eaf4896182.tar.bz2
fml8-82bb28981ac79e3f4017b396d2f627eaf4896182.zip
move id related functions to FML::Article::Sequence
Diffstat (limited to 'fml/lib')
-rw-r--r--fml/lib/FML/Article.pm156
-rw-r--r--fml/lib/FML/Article/Sequence.pm207
2 files changed, 211 insertions, 152 deletions
diff --git a/fml/lib/FML/Article.pm b/fml/lib/FML/Article.pm
index d305bf34..4652d33a 100644
--- a/fml/lib/FML/Article.pm
+++ b/fml/lib/FML/Article.pm
@@ -4,7 +4,7 @@
# All rights reserved. This program is free software; you can
# redistribute it and/or modify it under the same terms as Perl itself.
#
-# $FML: Article.pm,v 1.53 2003/03/03 15:27:22 fukachan Exp $
+# $FML: Article.pm,v 1.54 2003/03/16 08:38:58 fukachan Exp $
#
package FML::Article;
@@ -14,6 +14,9 @@ use vars qw(@ISA @EXPORT @EXPORT_OK);
use Carp;
use FML::Log qw(Log LogWarn LogError);
+use FML::Article::Sequence;
+@ISA = qw(FML::Article::Sequence);
+
=head1 NAME
@@ -114,82 +117,6 @@ sub _setup_article_template
}
-=head2 C<increment_id()>
-
-increment the sequence number of this article C<$self> and
-save it to C<$sequence_file>.
-
-This routine uses C<File::Sequence> module.
-
-=cut
-
-
-# Descriptions: determine article id (sequence number)
-# Arguments: OBJ($self)
-# Side Effects: save and update the current article sequence number
-# Return Value: NUM(sequence identifier)
-sub increment_id
-{
- my ($self) = @_;
- my $curproc = $self->{ curproc };
- my $config = $curproc->config();
- my $pcb = $curproc->pcb();
- my $seq_file = $config->{ sequence_file };
-
- # XXX-TODO we should enhance IO::Adapter module to handle
- # XXX-TODO sequential number.
- use File::Sequence;
- my $sfh = new File::Sequence { sequence_file => $seq_file };
- my $id = $sfh->increment_id;
- if ($sfh->error) { LogError( $sfh->error ); }
-
- # save $id in pcb (process control block) and return $id
- $pcb->set('article', 'id', $id);
-
- return $id;
-}
-
-
-=head2 C<id()>
-
-return the current article sequence number.
-
-=cut
-
-# Descriptions: return the article id (sequence number)
-# Arguments: OBJ($self)
-# Side Effects: none
-# Return Value: NUM(sequence number)
-sub id
-{
- my ($self) = @_;
- my $curproc = $self->{ curproc };
- my $config = $curproc->config();
- my $pcb = $curproc->pcb();
-
- my $n = $pcb->get('article', 'id');
-
- # within Process::Distribute
- if ($n) {
- return $n;
- }
- # processes not Process::Distribute
- else {
- my $seq_file = $config->{ sequence_file };
- my $n = 0;
-
- use File::Sequence;
- my $sfh = new File::Sequence { sequence_file => $seq_file };
- if (defined $sfh) {
- $n = $sfh->get_id();
- $sfh->close();
- }
-
- return $n;
- }
-}
-
-
=head2 C<spool_in(id)>
save the article to the file name C<id> in the article spool.
@@ -314,81 +241,6 @@ sub _filepath
}
-=head2 speculate_max_id([$spool_dir])
-
-scan the spool_dir and get the max number among files in it. It must
-be the max (latest) article number in its folder.
-
-=cut
-
-
-# Descriptions: scan the spool_dir and get max number among files in it.
-# It must be the max (latest) article number in its folder.
-# Arguments: OBJ($curproc) STR($spool_dir)
-# Side Effects: none
-# Return Value: NUM(sequence number) or undef
-sub speculate_max_id
-{
- my ($curproc, $spool_dir) = @_;
- my $config = $curproc->config();
- my $use_subdir = $config->{ spool_type } eq 'subdir' ? 1 : 0;
-
- unless (defined $spool_dir) {
- $spool_dir = $config->{ spool_dir };
- }
-
- Log("max_id: (debug) scan $spool_dir subdir=$use_subdir");
-
- if ($use_subdir) {
- use DirHandle;
- my $dh = new DirHandle $spool_dir;
-
- if (defined $dh) {
- my $fn = ''; # file name
- my $subdir = '';
- my $max_subdir = 0;
-
- ENTRY:
- while (defined($fn = $dh->read)) {
- next ENTRY unless $fn =~ /^\d+$/;
-
- use File::Spec;
- $subdir = File::Spec->catfile($spool_dir, $fn);
-
- if (-d $subdir) {
- my $max_subdir = $max_subdir > $fn ? $max_subdir : $fn;
- }
- }
-
- $dh->close();
-
- # XXX-TODO wrong? to speculate max_id in subdir spool?
- $subdir = File::Spec->catfile($spool_dir, $max_subdir);
- Log("max_id: (debug) scan $subdir");
- $curproc->speculate_max_id($subdir);
- }
- }
-
- use DirHandle;
- my $dh = new DirHandle $spool_dir;
- if (defined $dh) {
- my $max = 0;
- my $fn = ''; # file name
-
- while (defined($fn = $dh->read)) {
- next unless $fn =~ /^\d+$/;
- $max = $max < $fn ? $fn : $max;
- }
-
- $dh->close();
-
- return( $max > 0 ? $max : undef );
- }
-
- return undef;
-}
-
-
=head1 SEE ALSO
L<FML::Header>,
diff --git a/fml/lib/FML/Article/Sequence.pm b/fml/lib/FML/Article/Sequence.pm
new file mode 100644
index 00000000..cb156f38
--- /dev/null
+++ b/fml/lib/FML/Article/Sequence.pm
@@ -0,0 +1,207 @@
+#-*- perl -*-
+#
+# Copyright (C) 2003 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.
+#
+# $FML: @template.pm,v 1.7 2003/01/01 02:06:22 fukachan Exp $
+#
+
+package FML::Article::Sequence;
+use strict;
+use vars qw(@ISA @EXPORT @EXPORT_OK $AUTOLOAD);
+use Carp;
+
+# XXX_LOCK_CHANNEL: article_sequence
+my $lock_channel = 'article_sequence';
+
+
+=head1 NAME
+
+FML::Article::Sequence - article sequence manipulation
+
+=head1 SYNOPSIS
+
+=head1 DESCRIPTION
+
+=head1 METHODS
+
+=head2 C<increment_id()>
+
+increment the sequence number of this article C<$self> and
+save it to C<$sequence_file>.
+
+This routine uses C<File::Sequence> module.
+
+=cut
+
+
+# Descriptions: determine article id (sequence number)
+# Arguments: OBJ($self)
+# Side Effects: save and update the current article sequence number
+# Return Value: NUM(sequence identifier)
+sub increment_id
+{
+ my ($self) = @_;
+ my $curproc = $self->{ curproc };
+ my $config = $curproc->config();
+ my $pcb = $curproc->pcb();
+ my $seq_file = $config->{ sequence_file };
+
+ $curproc->lock($lock_channel);
+
+ # XXX-TODO we should enhance IO::Adapter module to handle
+ # XXX-TODO sequential number.
+ use File::Sequence;
+ my $sfh = new File::Sequence { sequence_file => $seq_file };
+ my $id = $sfh->increment_id;
+ if ($sfh->error) { LogError( $sfh->error ); }
+
+ # save $id in pcb (process control block) and return $id
+ $pcb->set('article', 'id', $id);
+
+ $curproc->unlock($lock_channel);
+
+ return $id;
+}
+
+
+=head2 C<id()>
+
+return the current article sequence number.
+
+=cut
+
+# Descriptions: return the article id (sequence number)
+# Arguments: OBJ($self)
+# Side Effects: none
+# Return Value: NUM(sequence number)
+sub id
+{
+ my ($self) = @_;
+ my $curproc = $self->{ curproc };
+ my $config = $curproc->config();
+ my $pcb = $curproc->pcb();
+
+ my $n = $pcb->get('article', 'id');
+
+ # within Process::Distribute
+ if ($n) {
+ return $n;
+ }
+ # processes not Process::Distribute
+ else {
+ my $seq_file = $config->{ sequence_file };
+ my $n = 0;
+
+ use File::Sequence;
+ my $sfh = new File::Sequence { sequence_file => $seq_file };
+ if (defined $sfh) {
+ $n = $sfh->get_id();
+ $sfh->close();
+ }
+
+ return $n;
+ }
+}
+
+
+=head2 speculate_max_id([$spool_dir])
+
+scan the spool_dir and get the max number among files in it. It must
+be the max (latest) article number in its folder.
+
+=cut
+
+
+# Descriptions: scan the spool_dir and get max number among files in it.
+# It must be the max (latest) article number in its folder.
+# Arguments: OBJ($curproc) STR($spool_dir)
+# Side Effects: none
+# Return Value: NUM(sequence number) or undef
+sub speculate_max_id
+{
+ my ($curproc, $spool_dir) = @_;
+ my $config = $curproc->config();
+ my $use_subdir = $config->{ spool_type } eq 'subdir' ? 1 : 0;
+
+ unless (defined $spool_dir) {
+ $spool_dir = $config->{ spool_dir };
+ }
+
+ Log("max_id: (debug) scan $spool_dir subdir=$use_subdir");
+
+ if ($use_subdir) {
+ use DirHandle;
+ my $dh = new DirHandle $spool_dir;
+
+ if (defined $dh) {
+ my $fn = ''; # file name
+ my $subdir = '';
+ my $max_subdir = 0;
+
+ ENTRY:
+ while (defined($fn = $dh->read)) {
+ next ENTRY unless $fn =~ /^\d+$/;
+
+ use File::Spec;
+ $subdir = File::Spec->catfile($spool_dir, $fn);
+
+ if (-d $subdir) {
+ my $max_subdir = $max_subdir > $fn ? $max_subdir : $fn;
+ }
+ }
+
+ $dh->close();
+
+ # XXX-TODO wrong? to speculate max_id in subdir spool?
+ $subdir = File::Spec->catfile($spool_dir, $max_subdir);
+ Log("max_id: (debug) scan $subdir");
+ $curproc->speculate_max_id($subdir);
+ }
+ }
+
+ use DirHandle;
+ my $dh = new DirHandle $spool_dir;
+ if (defined $dh) {
+ my $max = 0;
+ my $fn = ''; # file name
+
+ while (defined($fn = $dh->read)) {
+ next unless $fn =~ /^\d+$/;
+ $max = $max < $fn ? $fn : $max;
+ }
+
+ $dh->close();
+
+ return( $max > 0 ? $max : undef );
+ }
+
+ return undef;
+}
+
+
+=head1 CODING STYLE
+
+See C<http://www.fml.org/software/FNF/> on fml coding style guide.
+
+=head1 AUTHOR
+
+Ken'ichi Fukamachi
+
+=head1 COPYRIGHT
+
+Copyright (C) 2003 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
+
+FML::Article::Sequence appeared in fml8 mailing list driver package.
+See C<http://www.fml.org/> for more details.
+
+=cut
+
+
+1;