use warnings; use strict; =head1 NAME Jifty::Model::Session - Jifty session tracking =head1 DESCRIPTION Every Jifty application automatically inherits this table, which tracks session information for the application. Individual keys in the session structure are stored as rows, making session updates take constant time, and also reducing the need for locking. =cut package Jifty::Model::Session; use Jifty::DBI::Schema; use Jifty::Record schema { column session_id => type is 'varchar(32)', is case_sensitive, is indexed; column data_key => type is 'text', is case_sensitive; column value => type is 'blob', filters are 'Jifty::DBI::Filter::Storable'; column created => type is 'timestamp', filters are 'Jifty::DBI::Filter::DateTime'; column updated => type is 'timestamp', filters are 'Jifty::DBI::Filter::DateTime'; column key_type => type is 'varchar(32)', is case_sensitive; }; use base qw( Jifty::Record ); use DateTime (); =head2 table Sessions are stored in the table C<_jifty_sessions>. =cut sub table {'_jifty_sessions'} =head2 since Sessions first started getting stored in the database in Jifty version 0.60428 =cut sub since { '0.60428' } =head2 current_user =head2 current_user_can Everyone is treated as the superuser when dealing with session objects. This avoids infinite recursion, as otherwise it would try to look up the current user in the session object to find out who we are... =cut my $SUPERUSER; sub current_user { return $SUPERUSER ||= Jifty->app_class('CurrentUser')->superuser } sub current_user_can {return 1;} =head2 new_session_id Returns a random new session id. This is a 32-character hex string. =cut sub new_session_id { return Digest::MD5::md5_hex( Digest::MD5::md5_hex( time() . {} . rand() . $$ ) ); } =head2 create Defaults the created and updated times to now. =cut sub create { my $self = shift; my %args = ( session_id => $self->new_session_id, key_type => "key", created => DateTime->now, updated => DateTime->now, @_, ); return $self->SUPER::create(%args); } =head2 before_set_value [VALUE] Updates the C column, in addition to setting the value. =cut sub before_set_value { shift->set_updated( DateTime->now ); } 1;