File: EachFile.pm

package info (click to toggle)
tiarra 20100212-4
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,732 kB
  • ctags: 1,712
  • sloc: perl: 32,032; lisp: 193; sh: 109; makefile: 10
file content (110 lines) | stat: -rw-r--r-- 2,093 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# -*- cperl -*-
# -----------------------------------------------------------------------------
# $Id: EachFile.pm 11365 2008-05-10 14:58:28Z topia $
# -----------------------------------------------------------------------------
# copyright (C) 2003 Topia <topia@clovery.jp>. all rights reserved.
package Tools::FileCache::EachFile;
use strict;
use warnings;
use Carp;
use Module::Use qw(Tools::LinedDB);
use Tools::LinedDB;
use Tiarra::Utils;
our $AUTOLOAD;

my $timeout = 2.5 * 60;

sub new {
    my ($class, $parent, $fpath, $mode, $charset) = @_;

    my ($this) = {
	parent => $parent,
	mode => undef,
	database => undef,
	refcount => 0,
	expire => undef,
    };

    if ($mode =~ /raw/i) {
	$this->{mode} = 'raw';
	$this->{database} = 
	    Tools::LinedDB->new(
		FilePath => $fpath,
		Charset => $charset,
	       );
    } elsif ($mode =~ /std/i) {
	$this->{mode} = 'std';
	$this->{database} = 
	    Tools::LinedDB->new(
		FilePath => $fpath,
		Charset => $charset,
		Parse => sub {
		    my ($line) = @_;
		    $line =~ s/^\s+//;
		    return () if $line =~ /^[\#\;]/;
		    $line =~ s/\s+$//;
		    return () if $line eq '';
		    return $line;
		},
	       );
    } else {
	croak 'can\'t understand type "' . $mode . '"';
    }

    bless $this, $class;

    return $this;
}


sub register {
    my $this = shift;

    $this->add_ref;
    $this;
}

sub unregister {
    my $this = shift;

    $this->release;
    $this;
}

Tiarra::Utils->define_attr_getter(0, qw(refcount expire));

sub add_ref { ++(shift->{refcount}); }
sub release { --(shift->{refcount}); }
sub can_remove { (shift->refcount <= 0); }

sub set_expire {
    my ($this) = @_;

    $this->{expire} = time() + $timeout;
    return $this;
}

sub clean {
    my ($this) = @_;

    $this->{database} = undef;
}

sub AUTOLOAD {
    my ($this, @args) = @_;

    if ($AUTOLOAD =~ /::DESTROY$/) {
	# DESTROYは伝達させない。
	return;
    }

    (my $method = $AUTOLOAD) =~ s/.+?:://g;

    # define method
    eval "sub $method { shift->{database}->$method(\@_); }";

    no strict 'refs';
    goto &$AUTOLOAD;
}

1;