Apache-Session-Browseable
view release on metacpan or search on metacpan
lib/Apache/Session/Browseable/DBI.pm view on Meta::CPAN
package Apache::Session::Browseable::DBI;
use strict;
use DBI;
use Apache::Session;
use Apache::Session::Browseable::_common;
our $VERSION = '1.3.9';
our @ISA = qw(Apache::Session Apache::Session::Browseable::_common);
sub searchOn {
my $class = shift;
my ( $args, $selectField, $value, @fields ) = @_;
# Escape quotes
$selectField =~ s/'/''/g;
if ( $class->_fieldIsIndexed( $args, $selectField ) ) {
return $class->_query( $args, $selectField, $value,
{ query => "$selectField=?", values => [$value] }, @fields );
}
else {
return $class->SUPER::searchOn(@_);
}
}
sub searchOnExpr {
my $class = shift;
my ( $args, $selectField, $value, @fields ) = @_;
# Escape quotes
$value =~ s/'/''/g;
$selectField =~ s/'/''/g;
if ( $class->_fieldIsIndexed( $args, $selectField ) ) {
$value =~ s/\*/%/g;
return $class->_query( $args, $selectField, $value,
{ query => "$selectField like ?", values => [$value] }, @fields );
}
else {
return $class->SUPER::searchOnExpr(@_);
}
}
sub _query {
my ( $class, $args, $selectField, $value, $query, @fields ) = @_;
my %res = ();
my $index =
ref( $args->{Index} )
? $args->{Index}
: [ split /\s+/, $args->{Index} ];
my $dbh = $class->_classDbh($args);
my $table_name = $args->{TableName}
|| $Apache::Session::Store::DBI::TableName;
# Case 1: all requested fields are also indexed
my $indexed = $class->_tabInTab( \@fields, $index );
my $sth;
if ($indexed) {
my $fields = join( ',', 'id', map { s/'//g; $_ } @fields );
$sth = $dbh->prepare(
"SELECT $fields from $table_name where $query->{query}");
$sth->execute( @{ $query->{values} } );
return $sth->fetchall_hashref('id');
}
# Case 1: at least one field isn't indexed, decoding is needed
else {
$sth =
$dbh->prepare(
"SELECT id,a_session from $table_name where $query->{query}");
$sth->execute( @{ $query->{values} } );
while ( my @row = $sth->fetchrow_array ) {
no strict 'refs';
my $self = eval "&${class}::populate();";
my $sub = $self->{unserialize};
eval {
my $tmp = &$sub( { serialized => $row[1] } );
if (@fields) {
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@fields);
}
else {
$res{ $row[0] } = $tmp;
}
};
if ($@) {
print STDERR "Error in session $row[0]: $@\n";
delete $res{ $row[0] };
}
}
}
return \%res;
}
sub deleteIfLowerThan {
my ( $class, $args, $rule ) = @_;
my ( $query, %fields );
my $index =
ref( $args->{Index} )
? $args->{Index}
( run in 0.551 second using v1.01-cache-2.11-cpan-d7f47b0818f )