using callbacks with connect_cached

Vincent Veyron <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.general
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.