ASP4
view release on metacpan or search on metacpan
lib/ASP4/SessionStateManager.pm view on Meta::CPAN
local $s->db_Session->{AutoCommit} = 1;
my $sth = $s->db_Session->prepare_cached(<<"");
SELECT session_data, modified_on
FROM asp_sessions
WHERE session_id = ?
my $now = time2iso();
$sth->execute( $id );
my ($data, $modified_on) = $sth->fetchrow;
$data = thaw($data) || { SessionID => $id };
$sth->finish();
$s->{$_} = $data->{$_} for keys %$data;
return $s;
}# end retrieve()
sub save
{
my ($s) = @_;
return unless $s->{SessionID};
no warnings 'uninitialized';
# $s->{__lastMod} = time();
$s->sign;
local $s->db_Session->{AutoCommit} = 1;
my $sth = $s->db_Session->prepare_cached(<<"");
UPDATE asp_sessions SET
session_data = ?,
modified_on = ?
WHERE session_id = ?
my %clone = %$s;
delete $clone{____is_read_only};
my $data = freeze( \%clone );
$sth->execute( $data, time2iso(), $s->{SessionID} );
$sth->finish();
1;
}# end save()
sub sign
{
my $s = shift;
$s->{__signature} = $s->_hash;
}# end sign()
sub _hash
{
my $s = shift;
no warnings 'uninitialized';
md5_hex(
join ":",
map { "$_:$s->{$_}" }
grep { $_ ne '__signature' && $_ ne '____is_read_only' } sort keys(%$s)
);
}# end _hash()
sub is_changed
{
my $s = shift;
no warnings 'uninitialized';
$s->_hash ne $s->{__signature};
}# end is_changed()
sub reset
{
my $s = shift;
delete($s->{$_}) for grep { $_ ne 'SessionID' } keys %$s;
$s->save;
return;
}# end reset()
sub DESTROY
{
my $s = shift;
return undef(%$s) unless $s->{SessionID};
unless( $s->is_read_only )
{
$s->save;# if $s->is_changed;
}# end unless()
undef(%$s);
}# end DESTROY()
1;# return true:
=pod
=head1 NAME
ASP4::SessionStateManager - Per-user state persistence
=head1 SYNOPSIS
You've seen this page <%= $Session->{counter}++ %> times before.
=head1 DESCRIPTION
Web applications require session state management - and the simpler, the better.
C<ASP4::SessionStateManager> is a simple blessed hash. When it goes out of scope,
it is saved to the database (or whatever).
If no changes were made to the session, it is not saved.
=head1 PUBLIC PROPERTIES
( run in 1.135 second using v1.01-cache-2.11-cpan-39bf76dae61 )