File Coverage

blib/lib/File/CounterSS.pm
Criterion Covered Total %
statement 10 12 83.3
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 16 87.5


line stmt bran cond sub pod time code
1             package File::CounterSS;
2              
3 1     1   22334 use strict;
  1         3  
  1         29  
4 1     1   4 use Carp;
  1         2  
  1         81  
5 1     1   5 use File::Path;
  1         4  
  1         47  
6 1     1   390 use File::Storage::Stat;
  0            
  0            
7              
8             require Exporter;
9              
10             our @ISA = qw(Exporter);
11             our $VERSION = '0.01';
12              
13              
14             sub new {
15             my $class = shift;
16             my $options = shift;
17              
18             croak('Id is not set.')
19             unless $options->{Id};
20              
21             croak('Format error of Id.')
22             unless $options->{Id} =~ /^[a-zA-Z0-9\-\_\/]+/;
23              
24             my $filepath = $options->{DirPath} . '/' . $options->{Id};
25             my $dirpath = $filepath;
26             $dirpath =~ s|/[^/]+$||;
27              
28             mkpath($dirpath, 0, 0777)
29             unless -d $dirpath;
30              
31             unless (-e $filepath) {
32             open(C, ">$filepath");
33             close(C);
34             chmod(0666, $filepath);
35             utime(0, 0, $filepath);
36             }
37              
38             my $fss = File::Storage::Stat->new({FilePath => $filepath});
39              
40             my $range = lc($options->{Range});
41             $range = 'day'
42             unless ($range =~ /^(hour|day|week|mon|year)$/);
43              
44             my $type = lc($options->{Type});
45             $type = 'total'
46             unless ($type =~ /^(total|last)$/);
47              
48             my $self = {
49             filepath => $filepath,
50             dirpath => $dirpath,
51              
52             fss => $fss,
53              
54             range => $range,
55             type => $type,
56             };
57              
58              
59             return bless $self, $class;
60             }
61              
62             sub count {
63             my $self = shift;
64              
65             my($atime, $mtime, $ctime) = $self->{fss}->get;
66              
67             my $last_atime = $atime;
68             my $clear = 0;
69             if ($self->{range} eq 'week') {
70             $clear = 1
71             unless (localtime($ctime))[6] eq 6 && (localtime(time))[6] eq 0;
72             } else {
73             my $f;
74             if ($self->{range} eq 'hour') {
75             $f = 2;
76             } elsif ($self->{range} eq 'day') {
77             $f = 3;
78             } elsif ($self->{range} eq 'mon') {
79             $f = 4;
80             } elsif ($self->{range} eq 'year') {
81             $f = 5;
82             }
83             $clear = 1
84             unless (localtime($ctime))[$f] eq (localtime(time))[$f];
85             }
86              
87             if ($clear) {
88             $atime = 0;
89             $mtime = $last_atime - 1
90             if $self->{type} eq 'last';
91             }
92             ++$atime; ++$mtime;
93             $self->{fss}->set($atime, $mtime);
94              
95             return ($atime, $mtime);
96             }
97              
98             1;
99             __END__