I'm working on a Catalyst project that uses DBIx::Class (0.08010) as the ORM, and the StackTrace plugin. This combination is causing a problem.

In one section of this project I'm using a ResultSet to create a new row in a table as part of a transaction. In some cases the new row will violate a unique constraint, so I want to catch those errors and notify the user. However, the error that I get in $@ isn't due to the constraint violation.

Instead the error is due to trying to count the number of items in the ResultSet while in a failed transaction. I've traced this to the Devel::StackTrace module attempting to stringify the ResultSet. Because the string conversion operator isn't implemented but the numeric conversion operator is, the latter is used in place of the former. This results in trying to do a sql count before the failed transaction is rolled back.

I've worked around this problem by overloading string conversion to return a static string, but there may be better ways to avoid this problem.

Beginning of actual error text:
DBI Exception: DBD::Pg::st execute failed: ERROR:  current transaction is 
aborted, commands ignored until end of transaction block
 [for Statement "SELECT COUNT( * ) FROM property me"] at 
/usr/local/share/perl/5.8.8/DBIx/Class/Schema.pm line 954

Pseudocode:

eval { $schema->txn_do( sub {
  $schema->resultset('Property')->create( \%data );
  # Violates unique constraint
}) };

if( $@ and $@ =~ /unique constraint/ ) {
  # This isn't reached
}

_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/[EMAIL PROTECTED]

Reply via email to