our
$VERSION
=
'1.3.15'
;
our
$redis
;
BEGIN {
$redis
=
'Redis::Fast'
;
eval
'use Redis::Fast'
;
if
($@) {
$redis
=
'Redis'
;
}
}
sub
new {
my
(
$class
,
$session
) =
@_
;
my
$self
;
$session
->{args}->{encoding} =
undef
if
(
$session
->{args}->{encoding}
and
$session
->{args}->{encoding} eq
"undef"
);
if
(
$session
->{args}->{sentinels}
and
ref
$session
->{args}->{sentinels} ne
'ARRAY'
)
{
$session
->{args}->{sentinels} =
[
split
/[,\s]+/,
$session
->{args}->{sentinels} ];
}
$self
->{cache} =
$redis
->new( %{
$session
->{args} } );
$self
->{cache}->
select
(
$session
->{args}->{database} )
if
defined
$session
->{args}->{database};
bless
$self
,
$class
;
}
sub
insert {
my
(
$self
,
$session
) =
@_
;
my
$index
=
ref
(
$session
->{args}->{Index} )
?
$session
->{args}->{Index}
: [
split
/\s+/,
$session
->{args}->{Index} ];
my
$id
=
$session
->{data}->{_session_id};
$self
->{cache}->set(
$id
,
$session
->{serialized} );
foreach
my
$i
(
@$index
) {
my
$t
=
$session
->{data}->{
$i
};
next
unless
(
defined
(
$t
) and (
length
(
$t
) > 0 ) );
$self
->{cache}->sadd(
"${i}_$t"
,
$id
);
}
}
*update
=
*insert
;
sub
materialize {
my
(
$self
,
$session
) =
@_
;
$session
->{serialized} =
$self
->{cache}->get(
$session
->{data}->{_session_id} )
or
die
'Object does not exist in data store.'
;
}
sub
remove {
my
(
$self
,
$session
) =
@_
;
my
$index
=
ref
(
$session
->{args}->{Index} )
?
$session
->{args}->{Index}
: [
split
/\s+/,
$session
->{args}->{Index} ];
my
$id
=
$session
->{data}->{_session_id};
foreach
my
$i
(
@$index
) {
my
$t
;
next
unless
(
$t
=
$session
->{data}->{
$i
} );
eval
{
$self
->{cache}->srem(
"${i}_$t"
,
$id
); };
}
$self
->{cache}->del(
$id
);
}
1;