I'm using Apache::Session::Postgres to track sessions via
cookies. When I access a page, the cookie is correctly
sent by the server, and accepted by the client. However,
on the second request, I'm getting a 'Object does not exist
in data store' error.
It looks like the session is not being stored in the
database, although I can't figure out why. When running
postmaster -d 2, I get the following output:
started: host=localhost user=postgres database=sessions
InitPostgres
StartTransactionCommand
query: begin
ProcessUtility: begin
CommitTransactionCommand
StartTransactionCommand
query:
INSERT INTO sessions (id, a_session)
VALUES
('8efc89ae6006cfdfa24d12eba4019526','AwMAAAABCiA4ZWZjODlhZTYwMD
ZjZmRmYTI0ZDEyZWJhNDAxOTUyNlgAAAALX3Nlc3Npb25faWRY
')
ProcessQuery
CommitTransactionCommand
StartTransactionCommand
query: rollback
ProcessUtility: rollback
CommitTransactionCommand
StartTransactionCommand
query: begin
ProcessUtility: begin
CommitTransactionCommand
StartTransactionCommand
query:
UPDATE sessions SET a_session =
'AwMAAAAAWA==
' WHERE id = NULL
ProcessQuery
CommitTransactionCommand
StartTransactionCommand
query: commit
ProcessUtility: commit
CommitTransactionCommand
StartTransactionCommand
query: begin
ProcessUtility: begin
CommitTransactionCommand
It appears to be rolling back the insert transaction, but I
don't know why. The session does not appear in the
database, and all subsequent requests fail. I've tried
undef'ing, untie'ing, and make_modified (and various
combinations) on the hash, to no avail.
The whole handler is below, in case you're interested.
thanks,
Todd
package LocalSites::Session;
use strict;
use Apache::Constants qw( DECLINED);
use Apache::Log;
use Apache::Session::Postgres;
sub handler {
my $r = shift;
my $log = $r->server->log();
my $session;
my $use_cookies = $r->dir_config->{'UseCookies'} || 0;
if ($use_cookies) {
$log->error("Session: Begin Transaction Using
Cookies");
$session = $r->header_in('Cookie');
$session =~ s/SESSION_ID=(\w*)/$1/;
$log->error("Session: ID is $session");
} else {
$log->error("Session: Begin Transaction Using Path
Info");
# Placeholder for code to extract SESSION_ID from
the path
}
undef $session if ! $session;
my %session = ();
tie %session, 'Apache::Session::Postgres', $session, {
DataSource=>'dbi:Pg:dbname=sessions',
UserName=>'postgres',
Password=>'password',
Commit=>1
};
my $cookie = "SESSION_ID=".%session->{_session_id}.";
domain=.dom.com; path=/;";
$r->header_out("Set-Cookie"=>$cookie ) if ! $session;
$r->pnotes('SESSION_ID', %session->{_session_id});
$r->pnotes('AUTH_LEVEL', %session->{auth_level} || 0
);
$log->error("Session: ".%session->{_session_id});
untie(%session);
undef %session;
$log->error("Session: End Transaction");
return DECLINED;
}