On Friday, January 4, 2002, at 02:22 AM, Ken Williams wrote:
> For the sake of thread completion, here's a script which demonstrates 
> the bug.  It turns out to be a Perl bug (5.6.1, at least), not an 
> Apache::Session bug.  I'll post to p5p after I post here.

I was surprised to find the "it's not a bug, it's a feature" defense on 
p5p.  So here's an update.  The following is either a workaround, or the 
proper fix, depending on what you think Perl's proper behavior should 
be. ;-)

{
   local *session;
   tie %session, 'Apache::Session::MySQL', ...;
    ...
}


The "local *session;" is the important bit.  It doesn't work to do
"local %session;", because %session will still be tied even after it 
goes out of scope, and thus the hash data will never get written to 
storage.

In a Mason context, which is where I'm using it, I do this in my 
top-level autohandler (ignore the main:: subroutines, they're just for 
pedagogy):


<%init>
  # 'local' so it's available to lower-level components
  local *session;

  my $dbh = &::get_dbh;
  my $session_id = &::get_cookie('_session_id');
  tie %session, 'Apache::Session::MySQL', $session_id,
               {Handle => $dbh, LockHandle => $dbh};
  ...
</%init>


  -Ken

Reply via email to