Bug 26518: Use Koha::Biblio[item] in AddBiblio

Bug 26518: Does not return from the catch block

Signed-off-by: Victor Grousset/tuxayo <victor@tuxayo.net>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Jonathan Druart 2020-09-29 13:29:33 +02:00
parent 92720f9b5e
commit a1e9453f1d
2 changed files with 102 additions and 139 deletions

View file

@ -216,26 +216,89 @@ sub AddBiblio {
# transform the data into koha-table style data
SetUTF8Flag($record);
my $olddata = TransformMarcToKoha( $record, $frameworkcode );
( $biblionumber, $error ) = _koha_add_biblio( $dbh, $olddata, $frameworkcode );
$olddata->{'biblionumber'} = $biblionumber;
( $biblioitemnumber, $error ) = _koha_add_biblioitem( $dbh, $olddata );
my $schema = Koha::Database->schema;
try {
$schema->txn_do(sub {
_koha_marc_update_bib_ids( $record, $frameworkcode, $biblionumber, $biblioitemnumber );
my $biblio = Koha::Biblio->new(
{
frameworkcode => $frameworkcode,
author => $olddata->{author},
title => $olddata->{title},
subtitle => $olddata->{subtitle},
medium => $olddata->{medium},
part_number => $olddata->{part_number},
part_name => $olddata->{part_name},
unititle => $olddata->{unititle},
notes => $olddata->{notes},
serial =>
( $olddata->{serial} || $olddata->{seriestitle} ? 1 : 0 ),
seriestitle => $olddata->{seriestitle},
copyrightdate => $olddata->{copyrightdate},
datecreated => \'NOW()',
abstract => $olddata->{abstract},
}
)->store;
$biblionumber = $biblio->biblionumber;
# update MARC subfield that stores biblioitems.cn_sort
_koha_marc_update_biblioitem_cn_sort( $record, $olddata, $frameworkcode );
my ($cn_sort) = GetClassSort( $olddata->{'biblioitems.cn_source'}, $olddata->{'cn_class'}, $olddata->{'cn_item'} );
my $biblioitem = Koha::Biblioitem->new(
{
biblionumber => $biblionumber,
volume => $olddata->{volume},
number => $olddata->{number},
itemtype => $olddata->{itemtype},
isbn => $olddata->{isbn},
issn => $olddata->{issn},
publicationyear => $olddata->{publicationyear},
publishercode => $olddata->{publishercode},
volumedate => $olddata->{volumedate},
volumedesc => $olddata->{volumedesc},
collectiontitle => $olddata->{collectiontitle},
collectionissn => $olddata->{collectionissn},
collectionvolume => $olddata->{collectionvolume},
editionstatement => $olddata->{editionstatement},
editionresponsibility => $olddata->{editionresponsibility},
illus => $olddata->{illus},
pages => $olddata->{pages},
notes => $olddata->{bnotes},
size => $olddata->{size},
place => $olddata->{place},
lccn => $olddata->{lccn},
url => $olddata->{url},
cn_source => $olddata->{'biblioitems.cn_source'},
cn_class => $olddata->{cn_class},
cn_item => $olddata->{cn_item},
cn_suffix => $olddata->{cn_suff},
cn_sort => $cn_sort,
totalissues => $olddata->{totalissues},
ean => $olddata->{ean},
agerestriction => $olddata->{agerestriction},
}
)->store;
$biblioitemnumber = $biblioitem->biblioitemnumber;
# now add the record
ModBiblioMarc( $record, $biblionumber, $frameworkcode ) unless $defer_marc_save;
_koha_marc_update_bib_ids( $record, $frameworkcode, $biblionumber, $biblioitemnumber );
# update OAI-PMH sets
if(C4::Context->preference("OAI-PMH:AutoUpdateSets")) {
C4::OAI::Sets::UpdateOAISetsBiblio($biblionumber, $record);
}
# update MARC subfield that stores biblioitems.cn_sort
_koha_marc_update_biblioitem_cn_sort( $record, $olddata, $frameworkcode );
_after_biblio_action_hooks({ action => 'create', biblio_id => $biblionumber });
# now add the record
ModBiblioMarc( $record, $biblionumber, $frameworkcode ) unless $defer_marc_save;
logaction( "CATALOGUING", "ADD", $biblionumber, "biblio" ) if C4::Context->preference("CataloguingLog");
# update OAI-PMH sets
if(C4::Context->preference("OAI-PMH:AutoUpdateSets")) {
C4::OAI::Sets::UpdateOAISetsBiblio($biblionumber, $record);
}
_after_biblio_action_hooks({ action => 'create', biblio_id => $biblionumber });
logaction( "CATALOGUING", "ADD", $biblionumber, "biblio" ) if C4::Context->preference("CataloguingLog");
});
} catch {
warn $_;
( $biblionumber, $biblioitemnumber ) = ( undef, undef );
};
return ( $biblionumber, $biblioitemnumber );
}
@ -2676,61 +2739,6 @@ sub _koha_marc_update_biblioitem_cn_sort {
}
}
=head2 _koha_add_biblio
my ($biblionumber,$error) = _koha_add_biblio($dbh,$biblioitem);
Internal function to add a biblio ($biblio is a hash with the values)
=cut
sub _koha_add_biblio {
my ( $dbh, $biblio, $frameworkcode ) = @_;
my $error;
# set the series flag
unless (defined $biblio->{'serial'}){
$biblio->{'serial'} = 0;
if ( $biblio->{'seriestitle'} ) { $biblio->{'serial'} = 1 }
}
my $query = "INSERT INTO biblio
SET frameworkcode = ?,
author = ?,
title = ?,
subtitle = ?,
medium = ?,
part_number = ?,
part_name = ?,
unititle =?,
notes = ?,
serial = ?,
seriestitle = ?,
copyrightdate = ?,
datecreated=NOW(),
abstract = ?
";
my $sth = $dbh->prepare($query);
$sth->execute(
$frameworkcode, $biblio->{'author'}, $biblio->{'title'}, $biblio->{'subtitle'},
$biblio->{'medium'}, $biblio->{'part_number'}, $biblio->{'part_name'}, $biblio->{'unititle'},
$biblio->{'notes'}, $biblio->{'serial'}, $biblio->{'seriestitle'}, $biblio->{'copyrightdate'},
$biblio->{'abstract'}
);
my $biblionumber = $dbh->{'mysql_insertid'};
if ( $dbh->errstr ) {
$error .= "ERROR in _koha_add_biblio $query" . $dbh->errstr;
warn $error;
}
$sth->finish();
#warn "LEAVING _koha_add_biblio: ".$biblionumber."\n";
return ( $biblionumber, $error );
}
=head2 _koha_modify_biblio
my ($biblionumber,$error) == _koha_modify_biblio($dbh,$biblio,$frameworkcode);
@ -2841,72 +2849,6 @@ sub _koha_modify_biblioitem_nonmarc {
return ( $biblioitem->{'biblioitemnumber'}, $error );
}
=head2 _koha_add_biblioitem
my ($biblioitemnumber,$error) = _koha_add_biblioitem( $dbh, $biblioitem );
Internal function to add a biblioitem
=cut
sub _koha_add_biblioitem {
my ( $dbh, $biblioitem ) = @_;
my $error;
my ($cn_sort) = GetClassSort( $biblioitem->{'biblioitems.cn_source'}, $biblioitem->{'cn_class'}, $biblioitem->{'cn_item'} );
my $query = "INSERT INTO biblioitems SET
biblionumber = ?,
volume = ?,
number = ?,
itemtype = ?,
isbn = ?,
issn = ?,
publicationyear = ?,
publishercode = ?,
volumedate = ?,
volumedesc = ?,
collectiontitle = ?,
collectionissn = ?,
collectionvolume= ?,
editionstatement= ?,
editionresponsibility = ?,
illus = ?,
pages = ?,
notes = ?,
size = ?,
place = ?,
lccn = ?,
url = ?,
cn_source = ?,
cn_class = ?,
cn_item = ?,
cn_suffix = ?,
cn_sort = ?,
totalissues = ?,
ean = ?,
agerestriction = ?
";
my $sth = $dbh->prepare($query);
$sth->execute(
$biblioitem->{'biblionumber'}, $biblioitem->{'volume'}, $biblioitem->{'number'}, $biblioitem->{'itemtype'},
$biblioitem->{'isbn'}, $biblioitem->{'issn'}, $biblioitem->{'publicationyear'}, $biblioitem->{'publishercode'},
$biblioitem->{'volumedate'}, $biblioitem->{'volumedesc'}, $biblioitem->{'collectiontitle'}, $biblioitem->{'collectionissn'},
$biblioitem->{'collectionvolume'}, $biblioitem->{'editionstatement'}, $biblioitem->{'editionresponsibility'}, $biblioitem->{'illus'},
$biblioitem->{'pages'}, $biblioitem->{'bnotes'}, $biblioitem->{'size'}, $biblioitem->{'place'},
$biblioitem->{'lccn'}, $biblioitem->{'url'}, $biblioitem->{'biblioitems.cn_source'},
$biblioitem->{'cn_class'}, $biblioitem->{'cn_item'}, $biblioitem->{'cn_suffix'}, $cn_sort,
$biblioitem->{'totalissues'}, $biblioitem->{'ean'}, $biblioitem->{'agerestriction'}
);
my $bibitemnum = $dbh->{'mysql_insertid'};
if ( $dbh->errstr ) {
$error .= "ERROR in _koha_add_biblioitem $query" . $dbh->errstr;
warn $error;
}
$sth->finish();
return ( $bibitemnum, $error );
}
=head2 _koha_delete_biblio
$error = _koha_delete_biblio($dbh,$biblionumber);

View file

@ -17,7 +17,7 @@
use Modern::Perl;
use Test::More tests => 14;
use Test::More tests => 15;
use Test::MockModule;
use List::MoreUtils qw( uniq );
use MARC::Record;
@ -42,6 +42,30 @@ Koha::Caches->get_instance->clear_from_cache( "MarcSubfieldStructure-" );
my $builder = t::lib::TestBuilder->new;
subtest 'AddBiblio' => sub {
plan tests => 3;
my $marcflavour = 'MARC21';
t::lib::Mocks::mock_preference( 'marcflavour', $marcflavour );
my $record = MARC::Record->new();
my ( $f, $sf ) = GetMarcFromKohaField('biblioitems.lccn');
my $lccn_field = MARC::Field->new( $f, ' ', ' ',
$sf => 'ThisisgoingtobetoomanycharactersfortheLCCNfield' );
$record->append_fields($lccn_field);
my $nb_biblios = Koha::Biblios->count;
my ( $biblionumber, $biblioitemnumber ) =
C4::Biblio::AddBiblio( $record, '' );
is( $biblionumber, undef,
'AddBiblio returns undef for biblionumber if something went wrong' );
is( $biblioitemnumber, undef,
'AddBiblio returns undef for biblioitemnumber if something went wrong'
);
is( Koha::Biblios->count, $nb_biblios,
'No biblio should have been added if something went wrong' );
};
subtest 'GetMarcSubfieldStructureFromKohaField' => sub {
plan tests => 25;
@ -758,9 +782,6 @@ subtest "LinkBibHeadingsToAuthorities record generation tests" => sub {
"Tolkien, J. R. R. (John Ronald Reuel), 1892-1973. Lord of the rings",
"The generated record contains the correct subfields"
);
};
# Cleanup