Apache-Session-Browseable
view release on metacpan or search on metacpan
lib/Apache/Session/Browseable/PgJSON.pm view on Meta::CPAN
return 1;
}
}
sub get_key_from_all_sessions {
my ( $class, $args, $data ) = @_;
my $table_name = $args->{TableName}
|| $Apache::Session::Store::DBI::TableName;
my $dbh = $class->_classDbh($args);
my $sth;
# Special case if all wanted fields are indexed
if ( $data and ref($data) ne 'CODE' ) {
$data = [$data] unless ( ref($data) );
my $fields = join ',', 'id',
map { s/'//g; "a_session ->> '$_' AS \"$_\"" } @$data;
$sth = $dbh->prepare("SELECT $fields from $table_name");
$sth->execute;
return $sth->fetchall_hashref('id');
}
$sth = $dbh->prepare_cached("SELECT id,a_session from $table_name");
$sth->execute;
my %res;
while ( my @row = $sth->fetchrow_array ) {
no strict 'refs';
my $self = eval "&${class}::populate();";
eval {
my $sub = $self->{unserialize};
my $tmp = &$sub( { serialized => $row[1] } );
if ( ref($data) eq 'CODE' ) {
$tmp = &$data( $tmp, $row[0] );
$res{ $row[0] } = $tmp if ( defined($tmp) );
}
elsif ($data) {
$data = [$data] unless ( ref($data) );
$res{ $row[0] }->{$_} = $tmp->{$_} foreach (@$data);
}
else {
$res{ $row[0] } = $tmp;
}
};
if ($@) {
print STDERR "Error in session $row[0]: $@\n";
delete $res{ $row[0] };
}
}
return \%res;
}
sub _classDbh {
my ( $class, $args ) = @_;
my $datasource = $args->{DataSource} or die "No datasource given !";
my $username = $args->{UserName};
my $password = $args->{Password};
my $dbh =
DBI->connect_cached( $datasource, $username, $password,
{ RaiseError => 1, AutoCommit => 1 } )
|| die $DBI::errstr;
$dbh->{pg_enable_utf8} = 1;
return $dbh;
}
1;
__END__
=head1 NAME
Apache::Session::Browseable::PgJSON - Hstore type support for
L<Apache::Session::Browseable::Postgres>
=head1 SYNOPSIS
Create table:
CREATE UNLOGGED TABLE sessions (
id varchar(64) not null primary key,
a_session jsonb,
);
Optionally, add indexes on some fields. Example for Lemonldap::NG:
CREATE INDEX uid1 ON sessions USING BTREE ( (a_session ->> '_whatToTrace') );
CREATE INDEX s1 ON sessions ( (a_session ->> '_session_kind') );
CREATE INDEX u1 ON sessions ( ( cast(a_session ->> '_utime' AS bigint) ) );
CREATE INDEX ip1 ON sessions USING BTREE ( (a_session ->> 'ipAddr') );
Use it like L<Apache::Session::Browseable::Postgres> except that you don't
need to declare indexes
=head1 DESCRIPTION
Apache::Session::Browseable provides some class methods to manipulate all
sessions and add the capability to index some fields to make research faster.
Apache::Session::Browseable::PgJSON implements it for PosqtgreSQL databases
using "json" or "jsonb" type to be able to browse sessions.
=head1 SEE ALSO
L<http://lemonldap-ng.org>, L<Apache::Session::Postgres>
=head1 COPYRIGHT AND LICENSE
=encoding utf8
=over
=item 2009-2025 by Xavier Guimard
=item 2013-2025 by Clément Oudot
=item 2019-2025 by Maxime Besson
=item 2013-2025 by Worteks
=item 2023-2025 by Linagora
=back
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10.1 or,
at your option, any later version of Perl 5 you may have available.
=cut
( run in 1.104 second using v1.01-cache-2.11-cpan-39bf76dae61 )