You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Adam Cassar <ad...@netregistry.com.au> on 2000/02/24 01:03:32 UTC
Apache::Session, tie and references to hashes
hi all
the problem with Apache::Session is a simple one and has more to do with tie
consider the following code
tie %session, 'Apache::Session::File', undef, {Directory => "/tmp/sessions"};
$sid = $session{_session_id};
%session{data} = { data => deadbeef };
$session{data}->{data} = "fatmice";
untie %session;
tie %session, 'Apache::Session::File', $sid, {Directory => "/tmp/sessions"};
print $session{data}->{data};
exit;
Now instead of getting "fatmice" we get "deadbeef";
This is due to the fact that Apache::Session only saves the %session if it has been modified. Which it has,
but because $session{data} contains a reference to an anonymous hash, the memory location doesn't chance
even though the data within that memory location has.
The only solution(s) is to
a) increment a variable that is not a reference to force a change or
b) add an option to Apache::Session that 'forces' a write everytime the hash is untied - i believe this is the best option and looking at the code very simple to implement.
--
Adam Cassar
Senior Web Developer
___________________________________________
NetRegistry http://www.netregistry.com.au
Tel: +61 2 9699 6099 | Fax: +61 2 9699 6088
PO Box 270 Broadway NSW 2007 Australia
Re: Apache::Session, tie and references to hashes
Posted by "Jeffrey W. Baker" <jw...@acm.org>.
Adam Cassar wrote:
>
> hi all
>
> the problem with Apache::Session is a simple one and has more to do with tie
>
> consider the following code
>
> tie %session, 'Apache::Session::File', undef, {Directory => "/tmp/sessions"};
>
> $sid = $session{_session_id};
>
> %session{data} = { data => deadbeef };
>
> $session{data}->{data} = "fatmice";
>
> untie %session;
>
> tie %session, 'Apache::Session::File', $sid, {Directory => "/tmp/sessions"};
>
> print $session{data}->{data};
>
> exit;
>
> Now instead of getting "fatmice" we get "deadbeef";
>
> This is due to the fact that Apache::Session only saves the %session if it has been modified. Which it has,
> but because $session{data} contains a reference to an anonymous hash, the memory location doesn't chance
> even though the data within that memory location has.
>
> The only solution(s) is to
> a) increment a variable that is not a reference to force a change or
> b) add an option to Apache::Session that 'forces' a write everytime the hash is untied - i believe this is the best option and looking at the code very simple to implement.
You forgot the correct solution:
c) Use the object interface thoughtfully provided by the author to force
a write. e.g. tied(%session)->make_modified();
d) Use the object interface thoughtfully provided by the author to force
a write. e.g. tied(%session)->{object_store}->update(tied(%session));
You pick :)
Cheers,
Jeffrey