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 )