Re: using callbacks with connect_cached

Tim Bunce <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.general
Message-ID <[email protected]>
On Sun, Aug 25, 2013 at 01:38:57PM +0200, David E. Wheeler wrote:
> On Aug 24, 2013, at 9:40 PM, Vincent Veyron <[email protected]> wrote:
> 
> You can also use a private attribute in connect_cached.new to tell the connected callback to do its thing:
> 
> my $cb = {
>     'connect_cached.new' => sub {
>         $_[4]->{private_is_new} = 1;
>         return;
>     },
>     connected => sub {
>         my $dbh = shift;
>         warn "connected\n" if delete $dbh->{private_is_new};
>         return;
>     }
> };
> 
> for (1..3) {
>     DBI->connect_cached('dbi:SQLite:', '', '', {
>         PrintError => 0,
>         RaiseError => 1,
>         AutoCommit => 1,
>         Callbacks  => $cb,
>     });
> }
> 
> This emits "connected" only once.

If you're going to use a callback on connected and an attribute then
there's no need to also use connect_cached.new. Just this should do:

      connected => sub {
          my $dbh = shift;
          if (++$dbh->{private_connected_count} == 1) {
              ... # is new connection
          }
          return;
      }

Tim.

p.s. I'd be delighted to get a doc patch that notes the need to use a
lexical for the callbacks hashref on connect_cached.

p.p.s. I'd also consider a patch to add a 'connect_cached.connected'
callback for new connections.
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.