package Local::SessionClass; use warnings; use strict; use Apache::Session::MySQL; sub new { my ($class, %args) = @_; my $self = bless {}, ref($class) || $class; $self->init(%args); return $self; } sub init { my ($self, %args) = @_; my $id = $args{id} || undef; my %session; tie %session, 'Apache::Session::MySQL', $id, { Handle => $args{dbh}, LockHandle => $args{dbh} }; # I FEEL AS THOUGH THE USEFUL DATA (%session) IS NEEDLESSLY REMOVED FROM THE OBJECT'S MAIN DATA STRUCTURE (ITS ANONYMOUS HASH) REQUIRING ME TO DEREF MULTIPLE REFERENCES. $self->{session} = \%session; return; } sub get_sid { my $self = shift; # AS MENTIONED ABOVE ... MULTIPLE DEREF return $self->{session}->{_session_id}; } # THIS SUB ALLOWS ME TO PASS IN MULTIPLE KEY=>VAL PAIRS FOR STORAGE PURPOSES sub set_sdata { my ($self, %args) = @_; map{$self->{session}->{$_} = $args{$_}} keys %args; return; } sub get_sdata { my $self = shift; return %{$self->{session}}; } # DELETE A KEY=>VAL FROM THE TIED %SESSION HASH sub delete_sdata { my ($self, $key) = @_; delete $self->{session}->{$key}; return; } # SIMPLY UNTIE THE SESSION FOR CLEAN UP ... IS THIS NECCESSARY? sub close_session { my $self = shift; untie($self->{session}); } # MANUALLY KILL THE SESSION ON LOGOUT sub kill_session { my $self = shift; tied(%{$self->{session}})->delete; untie($self->{session}); return; } # CLEAN UP UPON EXIT sub DESTROY { my $self = shift; $self->close_session; } 1; ### CREATE A NEW SESSION - CALLED FROM LOGIN SCRIPT ### use Local::SessionClass; # CREATE SESSION ID my $session_obj = Local::WPSession->new(dbh => $dbhandle); my $session_id = $session_obj->get_sid(); # ... SET COOKIE WITH SESSION ID ... # SET SESSION VALUES $session_obj->set_sdata( val_1 => 'foo', val_2 => 'bar' ); ### RELOAD EXISTING SESSION - CALLED FROM SEPARATE SCRIPTS ### use Local::SessionClass; my $session_id = $q->cookie(-name => 'previously_set_cookie'); my $session_obj = Local::WPSession->new(dbh => $dbh, id => $session_id); # ACCESS SESSION VALUES my %sdata = $session_obj->get_sdata();