package Plack::Session::Store::File; use strict; use warnings; our $VERSION = '0.23'; our $AUTHORITY = 'cpan:STEVAN'; use Storable (); use parent 'Plack::Session::Store'; use Plack::Util::Accessor qw[ dir serializer deserializer ]; sub new { my ($class, %params) = @_; $params{'dir'} ||= $ENV{TMPDIR} || '/tmp'; die "Storage directory (" . $params{'dir'} . ") is not writeable" unless -w $params{'dir'}; $params{'serializer'} ||= sub { Storable::lock_nstore( @_ ) }; $params{'deserializer'} ||= sub { Storable::lock_retrieve( @_ ) }; bless { %params } => $class; } sub fetch { my ($self, $session_id) = @_; my $file_path = $self->_get_session_file_path( $session_id ); return unless -f $file_path; $self->deserializer->( $file_path ); } sub store { my ($self, $session_id, $session) = @_; my $file_path = $self->_get_session_file_path( $session_id ); $self->serializer->( $session, $file_path ); } sub remove { my ($self, $session_id) = @_; unlink $self->_get_session_file_path( $session_id ); } sub _get_session_file_path { my ($self, $session_id) = @_; $self->dir . '/' . $session_id; } 1; __END__ =pod =head1 NAME Plack::Session::Store::File - Basic file-based session store =head1 SYNOPSIS use Plack::Builder; use Plack::Middleware::Session; use Plack::Session::Store::File; my $app = sub { return [ 200, [ 'Content-Type' => 'text/plain' ], [ 'Hello Foo' ] ]; }; builder { enable 'Session', store => Plack::Session::Store::File->new( dir => '/path/to/sessions' ); $app; }; # with custom serializer/deserializer builder { enable 'Session', store => Plack::Session::Store::File->new( dir => '/path/to/sessions', # YAML takes it's args the opposite order serializer => sub { YAML::DumpFile( reverse @_ ) }, deserializer => sub { YAML::LoadFile( @_ ) }, ); $app; }; =head1 DESCRIPTION This implements a basic file based storage for session data. By default it will use L to serialize and deserialize the data, but this can be configured easily. This is a subclass of L and implements its full interface. =head1 METHODS =over 4 =item B The C<%params> can include I, I and I options. It will check to be sure that the I is writeable for you. =item B This is the directory to store the session data files in, if nothing is provided then "/tmp" is used. =item B This is a CODE reference that implements the serialization logic. The CODE ref gets two arguments, the C<$value>, which is a HASH reference to be serialized, and the C<$file_path> to save it to. It is not expected to return anything. =item B This is a CODE reference that implements the deserialization logic. The CODE ref gets one argument, the C<$file_path> to load the data from. It is expected to return a HASH reference. =back =head1 BUGS All complex software has bugs lurking in it, and this module is no exception. If you find a bug please either email me, or add the bug to cpan-RT. =head1 AUTHOR Stevan Little Estevan.little@iinteractive.comE =head1 COPYRIGHT AND LICENSE Copyright 2009, 2010 Infinity Interactive, Inc. L This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut