Apache-Session-Browseable
view release on metacpan or search on metacpan
lib/Apache/Session/Browseable/MySQLJSON.pm view on Meta::CPAN
package Apache::Session::Browseable::MySQLJSON;
use strict;
use Apache::Session;
use Apache::Session::Lock::Null;
use Apache::Session::Browseable::Store::MySQL;
use Apache::Session::Generate::SHA256;
use Apache::Session::Serialize::JSON;
use Apache::Session::Browseable::DBI;
our $VERSION = '1.3.9';
our @ISA = qw(Apache::Session::Browseable::DBI Apache::Session);
sub populate {
my $self = shift;
$self->{object_store} = new Apache::Session::Browseable::Store::MySQL $self;
$self->{lock_manager} = new Apache::Session::Lock::Null $self;
$self->{generate} = \&Apache::Session::Generate::SHA256::generate;
$self->{validate} = \&Apache::Session::Generate::SHA256::validate;
$self->{serialize} = \&Apache::Session::Serialize::JSON::serialize;
$self->{unserialize} = \&Apache::Session::Serialize::JSON::unserialize;
return $self;
}
sub searchOn {
my ( $class, $args, $selectField, $value, @fields ) = @_;
$selectField =~ s/'/''/g;
my $query =
{ query => qq'a_session->>"\$.$selectField" =?', values => [$value] };
return $class->_query( $args, $query, @fields );
}
sub searchOnExpr {
my ( $class, $args, $selectField, $value, @fields ) = @_;
$selectField =~ s/'/''/g;
$value =~ s/\*/%/g;
my $query =
{ query => qq'a_session->>"\$.$selectField" like ?', values => [$value] };
return $class->_query( $args, $query, @fields );
}
sub _query {
my ( $class, $args, $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;
my $sth;
my $fields =
join( ',', 'id', map { s/'//g; qq(a_session->>"\$.$_" AS $_) } @fields );
$sth =
$dbh->prepare("SELECT $fields from $table_name where $query->{query}");
$sth->execute( @{ $query->{values} } );
# In this case, PostgreSQL change field name in lowercase
my $res = $sth->fetchall_hashref('id') or return {};
foreach (@fields) {
if ( $_ ne lc($_) ) {
foreach my $s ( keys %$res ) {
$res->{$s}->{$_} = delete $res->{$s}->{ lc $_ };
}
}
}
return $res;
}
sub deleteIfLowerThan {
my ( $class, $args, $rule ) = @_;
my $query;
if ( $rule->{or} ) {
$query = join ' OR ',
map { qq{cast(a_session->>"\$.$_" as UNSIGNED) < $rule->{or}->{$_}} }
( run in 1.204 second using v1.01-cache-2.11-cpan-39bf76dae61 )