Hi list,
I use a package to return a cached connection for a mod_perl application
connected to a Postgresql db, like so :
my $dbh_data = Aspro::db_handle::get_dbh_data($preferred_datestyle) ;
where $preferred_datestyle is either 'iso' or 'SQL, dmy', and is used for
setting date formats in the user's session.
I then do :
$dbh_data->do( 'SET datestyle TO ?', undef, ( $preferred_datestyle ) ) ;
to set the datestyle.
Following the documentation, I would like to use instead a callback to set the
date format at dbh creation time as you can see in my package's code below, but
can't get it right.
Using the "connect_cached.new" key for the callback returns an error :
Can't call method "do" on an undefined value at /home/lib/Aspro/db_handle.pm
Using the "connected" key works, but creates a new db handle for each
connection, as shown by Data::Dumper in CachedKids (apologies for the strangely
encoded characters)
'cachedkids' => '$VAR1 = {
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff34f642d80)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'iso\\\'\'
=> bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff34f645990)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff34f6449b8)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff34f641208)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff34fb80aa0)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff34f63fcf0)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff34f643980)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=sessions!www-data!!AutoCommit=\\\'1\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\'\'
=> bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff34f643b18)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'iso\\\'\'
=> bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff350e68e58)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff350e447b8)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff350de4990)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff350e69368)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
\'dbname=aspro!www-data!!AutoCommit=\\\'1\\\',Callbacks=\\\'HASH(0x7ff350d60a28)\\\',PrintError=\\\'1\\\',RaiseError=\\\'1\\\',Username=\\\'www-data\\\',dbi_connect_method=\\\'connect_cached\\\',pg_bool_tf=\\\'t\\\',private_preferred_datestyle=\\\'SQL,
dmy\\\'\' => bless( {}, \'DBI::db\' ),
What is the correct way to do this?
package Aspro::db_handle;
use strict;
use warnings;
use DBI ();
sub get_dbh_data {
#paramètre d'affichage des dates; les caches de connection en
tiennent compte
my $preferred_datestyle = shift || 'iso';
my $dbh = DBI->connect_cached( "DBI:Pg:dbname=aspro", 'www-data',
undef, {
PrintError =>1,
RaiseError => 1,
AutoCommit => 1,
pg_bool_tf => 't',
private_preferred_datestyle => $preferred_datestyle,
Callbacks => {
"connect_cached.new" => sub {
shift->do(qq{
SET datestyle TO $preferred_datestyle
});
return;
}
}
} )
or croak "Cannot connect to db: $DBI::errstr";
return $dbh;
}
1;
--
Salutations, Vincent Veyron
http://marica.fr/
Gestion des contrats, des contentieux juridiques et des sinistres
d'assurance