@@ -, +, @@ into Koha exceptions - Apply this patch - Run: $ kshell k$ prove t/db_dependent/Koha/Object.t - Sign off :-D --- Koha/Exceptions/Object.pm | 10 ++++++++++ Koha/Object.pm | 28 +++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) --- a/Koha/Exceptions/Object.pm +++ a/Koha/Exceptions/Object.pm @@ -7,6 +7,16 @@ use Exception::Class ( 'Koha::Exceptions::Object' => { description => 'Something went wrong!', }, + 'Koha::Exceptions::Object::DuplicateID' => { + isa => 'Koha::Exceptions::Object', + description => "Duplicate ID passed", + fields => ['duplicate_id'] + }, + 'Koha::Exceptions::Object::FKConstraint' => { + isa => 'Koha::Exceptions::Object', + description => "Foreign key constraint broken", + fields => ['broken_fk'] + }, 'Koha::Exceptions::Object::MethodNotFound' => { isa => 'Koha::Exceptions::Object', description => "Invalid method", --- a/Koha/Object.pm +++ a/Koha/Object.pm @@ -22,6 +22,7 @@ use Modern::Perl; use Carp; use Mojo::JSON; +use Try::Tiny; use Koha::Database; use Koha::Exceptions::Object; @@ -119,7 +120,32 @@ Returns: sub store { my ($self) = @_; - return $self->_result()->update_or_insert() ? $self : undef; + try { + return $self->_result()->update_or_insert() ? $self : undef; + } + catch { + # Catch problems and raise relevant exceptions + if (ref($_) eq 'DBIx::Class::Exception') { + if ( $_->{msg} =~ /Cannot add or update a child row: a foreign key constraint fails/ ) { + # FK constraints + # FIXME: MySQL error, if we support more DB engines we should implement this for each + if ( $_->{msg} =~ /FOREIGN KEY \(`(?.*?)`\)/ ) { + Koha::Exceptions::Object::FKConstraint->throw( + error => 'Broken FK constraint', + broken_fk => $+{column} + ); + } + } + elsif( $_->{msg} =~ /Duplicate entry '(.*?)' for key '(?.*?)'/ ) { + Koha::Exceptions::Object::DuplicateID->throw( + error => 'Duplicate ID', + duplicate_id => $+{key} + ); + } + # Catch-all for foreign key breakages. It will help find other use cases + $->rethrow(); + } + } } =head3 $object->delete(); --