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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
# -----------------------------------------------------------------------------
# $Id: Reload.pm 12856 2008-05-30 14:37:23Z hio $
# -----------------------------------------------------------------------------
# Tools::Reload.
# -----------------------------------------------------------------------------
package Tools::Reload;
use strict;
use warnings;
use BulletinBoard;
use Timer;
# -----------------------------------------------------------------------------
# とりあえずサンプル.
# うごくかわかんない.
# -----------------------------------------------------------------------------
our $VERSION = '0.01';
our $BBS_KEY = __PACKAGE__;
our $DEFAULT_EXPIRE = 300; # seconds.
1;
# -----------------------------------------------------------------------------
# (private)
# $bbs_val = $pkg->_get().
# $bbs_val = $pkg->_get(-no_create).
# 全部の情報が入ってるハッシュを取得.
#
sub _get
{
my $this = shift;
my $no_create = shift;
my $bbs_val = BulletinBoard->shared->get($BBS_KEY);
if( !$bbs_val && !$no_create )
{
#$runloop->notify_msg(__PACKAGE__."#_get, bbs[$BBS_KEY] initialize");
$bbs_val = {
inited_at => time,
data => {},
};
BulletinBoard->shared->set($BBS_KEY, $bbs_val);
}
$bbs_val;
}
# -----------------------------------------------------------------------------
# Reload->store($my_key, $value).
#
sub store
{
my $this = shift;
my $opts;
if( @_ >= 2 )
{
my $key = shift;
my $value = shift;
$opts = {
Key => $key,
Value => $value,
Expire => $DEFAULT_EXPIRE,
};
}else
{
$opts = shift;
}
my $key = $opts->{Key} or die __PACKAGE__."#store, no Key";
my $value = $opts->{Value} or die __PACKAGE__."#store, no Value";
my $expire = $opts->{Expire} || $DEFAULT_EXPIRE;
my $bbs_val = $this->_get();
my $ref = ref($key) || "$key";
my $timer = Timer->new(
After => $expire,
Code => sub{
if( $bbs_val->{data} )
{
delete $bbs_val->{data}{$ref};
}
},
)->install;
my $entry = {
key => $ref,
value => $value,
timer => $timer,
after => $expire,
};
$bbs_val->{data}{$ref} = $entry;
$value;
}
# -----------------------------------------------------------------------------
# my $value = Reload->get($my_key).
#
sub get
{
my $this = shift;
my $key = shift;
$key or die __PACKAGE__."#get, no key";
my $bbs_val = $this->_get();
my $ref = ref($key) || "$key";
$bbs_val->{data}{$ref} && $bbs_val->{data}{$ref}{value};
}
# -----------------------------------------------------------------------------
# my $existence = Reload->exists($my_key).
#
sub exists
{
my $this = shift;
my $key = shift;
$key or die __PACKAGE__."#exists, no key";
my $bbs_val = $this->_get();
my $ref = ref($key) || "$key";
CORE::exists($bbs_val->{data}{$ref});
}
=head1 NAME
Tools::Reload - save data for reloading.
=head1 SYNOPSIS
$my_key = __PACKAGE__;
# At destruct().
Tools::Reload->store($my_key, $value);
# At new().
my $value = Tools::Reload->fetch($my_key);
if( !$value )
{
# new loading.
}else
{
# reloading.
}
=head1 DESCRIPTION
リロード用にデータの一時保存.
リロードじゃなくてアンロードだった場合は,
タイマーで既定秒後に削除される.
=cut
|