From 28cb7c3e440aa53f048031d6e7ab9cc59b56008d Mon Sep 17 00:00:00 2001 From: Tomas Cohen Arazi Date: Mon, 18 Dec 2017 13:48:56 -0300 Subject: [PATCH] Bug 19828: Make Koha::Object->store translate DBIC exceptions into Koha exceptions This patch introduces a try/catch block in store() and parses the error when an exceptional situation takes place. It only deals with FK constraint violations and duplicate IDs. The rest of the DBIC exceptions are rethrown. To test: - Apply this patch - Run: $ kshell k$ prove t/db_dependent/Koha/Object.t => SUCCESS: Tests pass! - Sign off :-D Signed-off-by: Kyle M Hall --- Koha/Exceptions/Object.pm | 10 ++++++++++ Koha/Object.pm | 28 +++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Koha/Exceptions/Object.pm b/Koha/Exceptions/Object.pm index 2ffa1ec..4cad568 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 0956cca..17609f2 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(); -- 2.10.2