| File-CounterSS documentation | Contained in the File-CounterSS distribution. |
File::CounterSS - Counter that used File::Storage::Stat
use File::CounterSS;
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id'});#Id =~ m|^[a-zA-Z0-9\-\_\/]+$|
my ($day, $total) = $c->count;
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id', type => 'last'});#'total' is default value of type
my ($day, $yesterday) = $c->count;
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id', range => 'week'});'day' is default value of range
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id', range => 'mon'});
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id', range => 'year'});
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id', range => 'day', type => 'last'});
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id', range => 'week', type => 'last'});
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id', range => 'mon', type => 'last'});
my $c = File::CounterSS->new({DirPath => 'dirpath', Id => 'id', range => 'year', type => 'last'});
counter with two kinds of values at the same time. the first value is counted according to hour, day, week, mon, year. the second value is the last count or a count of the total.
Kazuhiro Osawa <ko@yappo.ne.jp>
Copyright (C) 2005 by Kazuhiro Osawa
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.5 or, at your option, any later version of Perl 5 you may have available.
| File-CounterSS documentation | Contained in the File-CounterSS distribution. |
package File::CounterSS; use strict; use Carp; use File::Path; use File::Storage::Stat; require Exporter; our @ISA = qw(Exporter); our $VERSION = '0.01'; sub new { my $class = shift; my $options = shift; croak('Id is not set.') unless $options->{Id}; croak('Format error of Id.') unless $options->{Id} =~ /^[a-zA-Z0-9\-\_\/]+/; my $filepath = $options->{DirPath} . '/' . $options->{Id}; my $dirpath = $filepath; $dirpath =~ s|/[^/]+$||; mkpath($dirpath, 0, 0777) unless -d $dirpath; unless (-e $filepath) { open(C, ">$filepath"); close(C); chmod(0666, $filepath); utime(0, 0, $filepath); } my $fss = File::Storage::Stat->new({FilePath => $filepath}); my $range = lc($options->{Range}); $range = 'day' unless ($range =~ /^(hour|day|week|mon|year)$/); my $type = lc($options->{Type}); $type = 'total' unless ($type =~ /^(total|last)$/); my $self = { filepath => $filepath, dirpath => $dirpath, fss => $fss, range => $range, type => $type, }; return bless $self, $class; } sub count { my $self = shift; my($atime, $mtime, $ctime) = $self->{fss}->get; my $last_atime = $atime; my $clear = 0; if ($self->{range} eq 'week') { $clear = 1 unless (localtime($ctime))[6] eq 6 && (localtime(time))[6] eq 0; } else { my $f; if ($self->{range} eq 'hour') { $f = 2; } elsif ($self->{range} eq 'day') { $f = 3; } elsif ($self->{range} eq 'mon') { $f = 4; } elsif ($self->{range} eq 'year') { $f = 5; } $clear = 1 unless (localtime($ctime))[$f] eq (localtime(time))[$f]; } if ($clear) { $atime = 0; $mtime = $last_atime - 1 if $self->{type} eq 'last'; } ++$atime; ++$mtime; $self->{fss}->set($atime, $mtime); return ($atime, $mtime); } 1; __END__