dump_session — dump named user session partially or in whole
| Attribute | Pos. | Req. | Default | Description |
|---|---|---|---|---|
| name | Yes | Yes | User session ID. | |
| joiner | A space | |||
| find | ||||
| key | Hash key to use as top-level value in session dump, instead of the complete session. | |||
| interpolate | 0 | interpolate output? | ||
| hide | 0 | Hide the tag return value? |
The tag dumps content of a named session.
If the key= argument is specified,
that will become the top-level element for display.
This tag appears to be affected by, or affects, the following:
Catalog Variables: ACTIVE_SESSION_MINUTES
Example: Displaying current user's session dump
<pre> [dump-session name="[data session id]"] </pre>
Example: Displaying a specific part of current user's session
<pre> [dump-session name="[data session id]" key=browser] </pre>
Interchange 5.9.0:
Source: code/UI_Tag/dump_session.coretag
Lines: 134
# Copyright 2002-2007 Interchange Development Group and others
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. See the LICENSE file for details.
#
# $Id: dump_session.coretag,v 1.8 2007-03-30 23:40:54 pajamian Exp $
UserTag dump_session Order name
UserTag dump_session AddAttr
UserTag dump_session Version $Revision: 1.8 $
UserTag dump_session Routine <<EOR
sub show_part {
my ($ref, $key) = @_;
return $ref unless $key;
if ($key eq 'SCALAR') {
my $newref = {};
foreach my $k (keys %$ref) {
next if ref $ref->{$k};
$newref->{$k} = $ref->{$k};
}
return $newref;
}
else {
return { $key, $ref->{$key} };
}
}
sub {
my ($name, $opt) = @_;
my $joiner = $opt->{joiner} || ' ';
return "Cannot dump or find sessions with session type $Vend::Cfg->{SessionType}."
if ($Vend::Cfg->{SessionType} ne 'File' && $Vend::Cfg->{SessionType} ne 'DBI');
if ($Vend::Cfg->{SessionType} eq 'File') {
if($opt->{find}) {
require File::Find;
my $expire = $Vend::Cfg->{SessionExpire};
if( int($::Variable->{ACTIVE_SESSION_MINUTES}) ) {
$expire = $::Variable->{ACTIVE_SESSION_MINUTES} * 60;
}
my $now = time();
$expire = $now - $expire;
my @files;
my $wanted = sub {
return unless -f $_;
return if (stat(_))[9] < $expire;
return if /\.lock$/;
push @files, $_;
};
File::Find::find($wanted, $Vend::Cfg->{SessionDatabase});
return join $joiner, @files;
}
elsif (! $name) {
return "dump-session: Nothing to do.";
}
else {
my $fn = Vend::Util::get_filename($name, 2, 1, $Vend::Cfg->{SessionDatabase});
return '' unless -f $fn;
my $ref = Vend::Util::eval_file($fn);
$ref = show_part($ref, $opt->{key}) if $opt->{key};
my $out = '';
eval {
$out = Vend::Util::uneval($ref);
};
return uneval($ref) if $@;
return $out;
}
}
if ($Vend::Cfg->{SessionType} eq 'DBI') {
if($opt->{find}) {
my $expire = $Vend::Cfg->{SessionExpire};
if( int($::Variable->{ACTIVE_SESSION_MINUTES}) ) {
$expire = $::Variable->{ACTIVE_SESSION_MINUTES} * 60;
}
my $now = time();
$expire = $now - $expire;
my @sesscodes;
my $db = Vend::Data::database_exists_ref($Vend::Cfg->{SessionDB})
or return errmsg("Table %s is not available", $Vend::Cfg->{SessionDB});
my $dbh = $db->dbh();
my $tname = $db->name();
my $sql = "select code from $tname where UNIX_TIMESTAMP(last_accessed) >= ?";
my $sth = $dbh->prepare($sql);
$sth->execute($expire) || return $DBI::errstr;
my $code;
$sth->bind_columns( undef, \$code);
while($sth->fetch) {
push @sesscodes, $code;
}
$sth->finish;
return join $joiner, @sesscodes;
}
elsif (! $name) {
return "dump-session: Nothing to do.";
}
else {
my $db = Vend::Data::database_exists_ref($Vend::Cfg->{SessionDB})
or return errmsg("Table %s is not available", $Vend::Cfg->{SessionDB});
my $dbh = $db->dbh();
my $tname = $db->name();
my $sql = "select session from $tname where code=?";
my $sth = $dbh->prepare($sql);
$sth->execute($name);
my $session;
$sth->bind_columns( undef, \$session);
$sth->fetch;
$sth->finish;
my $out = '';
my $ref = Vend::Util::evalr($session);
## Allow show of only part
$ref = show_part($ref, $opt->{key}) if $opt->{key};
eval {
$out = Vend::Util::uneval($ref);
};
return uneval($ref) if $@;
return $out;
}
}
}
EOR