From: Yuval Kogman Date: Mon, 5 Dec 2005 20:12:45 +0000 (+0000) Subject: Flash data is now in a separately prefixed session storage thingy X-Git-Tag: v0.03~11 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=9b0fa2a634afaeb2571652e13a617a87355578c9;p=catagits%2FCatalyst-Plugin-Session.git Flash data is now in a separately prefixed session storage thingy --- diff --git a/Changes b/Changes index 50542d5..c4dcbce 100644 --- a/Changes +++ b/Changes @@ -3,6 +3,7 @@ Revision history for Perl extension Catalyst::Plugin::Session 0.03 - Lazify loading of session data for better performance and less chance of race conditions + - support for $c->flash a la Ruby on Rails 0.02 ??? - Doc fixes diff --git a/lib/Catalyst/Plugin/Session.pm b/lib/Catalyst/Plugin/Session.pm index 7e2ac41..f66ab64 100644 --- a/lib/Catalyst/Plugin/Session.pm +++ b/lib/Catalyst/Plugin/Session.pm @@ -14,7 +14,7 @@ use overload (); our $VERSION = "0.02"; BEGIN { - __PACKAGE__->mk_accessors(qw/_sessionid _session _session_delete_reason/); + __PACKAGE__->mk_accessors(qw/_sessionid _session _session_delete_reason _flash _flash_stale_keys/); } sub setup { @@ -60,17 +60,33 @@ sub setup_session { sub finalize { my $c = shift; + $c->_save_session; + $c->_save_flash; + + $c->NEXT::finalize(@_); +} + +sub _save_session { + my $c = shift; + if ( my $session_data = $c->_session ) { # all sessions are extended at the end of the request my $now = time; @{ $session_data }{qw/__updated __expires/} = ( $now, $c->config->{session}{expires} + $now ); - delete @{ $session_data->{__flash} }{ @{ delete $session_data->{__flash_stale_keys} || [] } }; - $c->store_session_data( $c->sessionid, $session_data ); + + $c->store_session_data( "session:" . $c->sessionid, $session_data ); } +} - $c->NEXT::finalize(@_); +sub _save_flash { + my $c = shift; + + if ( my $flash_data = $c->_flash ) { + delete @{ $flash_data }{ @{ $c->_flash_stale_keys || [] } }; + $c->store_session_data( "flash:" . $c->sessionid, $flash_data ); + } } sub _load_session { @@ -79,7 +95,7 @@ sub _load_session { if ( my $sid = $c->_sessionid ) { no warnings 'uninitialized'; # ne __address - my $session_data = $c->_session || $c->_session( $c->get_session_data($sid) ); + my $session_data = $c->_session || $c->_session( $c->get_session_data( "session:$sid" ) ); if ( !$session_data or $session_data->{__expires} < time ) { # session expired @@ -101,7 +117,6 @@ sub _load_session { } $c->_expire_ession_keys; - $session_data->{__flash_stale_keys} = [ keys %{ $session_data->{__flash} } ]; return $session_data; } @@ -109,6 +124,19 @@ sub _load_session { return undef; } +sub _load_flash { + my $c = shift; + + if ( my $sid = $c->_sessionid ) { + if ( my $flash_data = $c->_flash || $c->_flash( $c->get_session_data("flash:$sid") ) ) { + $c->_flash_stale_keys([ keys %$flash_data ]); + return $flash_data; + } + } + + return undef; +} + sub _expire_ession_keys { my ( $c, $data ) = @_; @@ -126,7 +154,7 @@ sub delete_session { # delete the session data my $sid = $c->_sessionid || return; - $c->delete_session_data($sid); + $c->delete_session_data( "session:$sid" ); # reset the values in the context object $c->_session(undef); @@ -182,7 +210,7 @@ sub session { sub flash { my $c = shift; - return $c->session->{__flash} ||= {}; + $c->_flash || $c->_load_flash || $c->_flash( {} ); } sub session_expire_key { diff --git a/t/03_flash.t b/t/03_flash.t index 66b4531..edbf607 100644 --- a/t/03_flash.t +++ b/t/03_flash.t @@ -12,19 +12,18 @@ BEGIN { use_ok( $m = "Catalyst::Plugin::Session" ) } my $c = Test::MockObject::Extends->new( $m ); -$c->set_always( get_session_data => { __expires => time+10000, __updated => time } ); -$c->set_always( config => { session => { expires => 1000000 } } ); +$c->set_always( get_session_data => { } ); +$c->set_true( "store_session_data" ); +$c->set_always( _sessionid => "deadbeef"); -$c->sessionid("deadbeef"); - -$c->_load_session; +$c->_load_flash; is_deeply( $c->flash, {}, "nothing in flash"); $c->flash->{foo} = "moose"; $c->finalize; -$c->_load_session; +$c->_load_flash; is_deeply( $c->flash, { foo => "moose" }, "one key in flash" ); @@ -33,11 +32,11 @@ $c->flash->{bar} = "gorch"; is_deeply( $c->flash, { foo => "moose", bar => "gorch" }, "two keys in flash"); $c->finalize; -$c->_load_session; +$c->_load_flash; is_deeply( $c->flash, { bar => "gorch" }, "one key in flash" ); $c->finalize; -$c->_load_session; +$c->_load_flash; is_deeply( $c->flash, {}, "nothing in flash");