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;
}

Reply via email to