[Catalyst] Duplicate entries with C::P::Session::Store::DBIC and MySQL

Matt S Trout dbix-class at trout.me.uk
Wed Jul 30 11:26:28 BST 2008


On Tue, Jul 29, 2008 at 12:49:17PM +0200, Tobias Kremer wrote:
> Quoting Tobias Kremer <list at funkreich.de>:
> > However, I'm unsure how to detect if the error really was a duplicate entry
> > error or something else.
> >   die $@ if $@ && $@ !~ /duplicate/i;
> > This doesn't work because different DBs throw different errors.
> 
> Also, flash() is supposed to always return a flash entry. So in case of a
> duplicate error we'd have to do another find(). That'd be 3 queries in the
> worst case.
> 
> Maybe it'd be better to ditch find_or_create in favor of something like this:
> 
> eval {
>   $row = $self->model->create( { ... } );
> }
> if( $@ && $@ =~ /duplicate/ ) { # the question about detecting this remains
>   $row = $self->model->find( { ... } );
> }
> 
> This would reduce the query to 1 at best and 2 at worst. On the other hand, I
> fear that it's still possible that the find() doesn't actually find a row
> because it was deleted in the meantime by the other request :(

It's still probably viable.

What I'd really like is to add some code to DBIC's storage to know what re
that /duplicate/ is on whatever DB so we can bury this away from the user
and DBIC can Just Use It for find_or_create on any supported database.

Maybe you could wander over to the DBIC list and poke at patching that
instead?

-- 
      Matt S Trout       Need help with your Catalyst or DBIx::Class project?
   Technical Director                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://chainsawblues.vox.com/            http://www.shadowcat.co.uk/servers/



More information about the Catalyst mailing list