Plack-Session-Store-KyotoTycoon
view release on metacpan or search on metacpan
lib/Plack/Session/Store/KyotoTycoon.pm view on Meta::CPAN
package Plack::Session::Store::KyotoTycoon;
use 5.010;
use Cache::KyotoTycoon;
use Try::Tiny;
use Storable qw/nfreeze thaw/;
use MIME::Base64 qw(encode_base64 decode_base64);
# ABSTRACT: Plack::Session storage for Kyoto Tycoon
our $VERSION = '0.1'; # VERSION
use parent 'Plack::Session::Store';
sub new {
my ($class, %params) = @_;
$params{tycoon} = _verify_tycoon_connection;
return bless {%params} => $class;
}
sub fetch {
my ($self, $key) = @_;
my @data;
try {
@data = $self->{tycoon}->get($key);
}
catch {
$self->_verify_tycoon_connection;
@data = $self->{tycoon}->get($key);
};
if (defined($data[0])) {
my $sess = thaw(decode_base64($data[0]));
$sess->{__expire} = $data[1];
return $sess;
}
return;
}
sub store {
my ($self, $key, $data, $expire) = @_;
$data = encode_base64(nfreeze($data));
$expire = 3600 unless $expire;
my $replace;
try {
$replace = $self->{tycoon}->replace($key, $data, $expire);
}
catch {
$self->_verify_tycoon_connection;
$replace = $self->{tycoon}->replace($key, $data, $expire);
};
return $self->{tycoon}->set($key, $data, $expire)
unless $replace;
return;
}
sub remove {
my ($self, $key) = @_;
try { return $self->{tycoon}->remove($key); }
catch {
$self->_verify_tycoon_connection;
return $self->{tycoon}->remove($key);
}
return;
}
sub _verify_tycoon_connection {
my ($self) = @_;
try { $self->{tycoon}->echo({ test => 1 }); }
catch {
( run in 0.692 second using v1.01-cache-2.11-cpan-800906f7e73 )