diff --git a/Koha/Exceptions/Object.pm b/Koha/Exceptions/Object.pm index 2ffa1ec851..4cad568347 100644 --- a/Koha/Exceptions/Object.pm +++ b/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", diff --git a/Koha/Object.pm b/Koha/Object.pm index 0956cca836..17609f2ada 100644 --- a/Koha/Object.pm +++ b/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();