From 84a8f09ec2b4288092f6035555fa91b400a015ef 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 Signed-off-by: Josef Moravec Signed-off-by: Jonathan Druart --- 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 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(); -- 2.39.5