Bug 18284: (bug 17196 follow-up) Move biblio metadata when a biblio is deleted
There is a deletedbiblio_metadata table but it is not populated when a biblio is deleted. Since we have a ON DELETE constraint on biblio_metadata.biblionumber, the row is deleted when the biblio entry is deleted => data lost! Test plan: - Create a biblio - Delete it => Without this patch the deletedbiblio_metadata table is not populated with the biblio_metadata row related to the biblio => With this patch applied you should see that the row has been moved. Followed test plan, behaves as expected Signed-off-by: Marc Véron <veron@veron.ch> Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl> Signed-off-by: Brendan A Gallagher <brendan@bywatersolutions.coml>
This commit is contained in:
parent
9d8e83528f
commit
36ee625f08
2 changed files with 53 additions and 7 deletions
30
C4/Biblio.pm
30
C4/Biblio.pm
|
@ -431,6 +431,7 @@ sub DelBiblio {
|
||||||
return $error if $error;
|
return $error if $error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# delete biblio from Koha tables and save in deletedbiblio
|
# delete biblio from Koha tables and save in deletedbiblio
|
||||||
# must do this *after* _koha_delete_biblioitems, otherwise
|
# must do this *after* _koha_delete_biblioitems, otherwise
|
||||||
# delete cascade will prevent deletedbiblioitems rows
|
# delete cascade will prevent deletedbiblioitems rows
|
||||||
|
@ -3360,6 +3361,8 @@ sub _koha_delete_biblio {
|
||||||
my $sth = $dbh->prepare("SELECT * FROM biblio WHERE biblionumber=?");
|
my $sth = $dbh->prepare("SELECT * FROM biblio WHERE biblionumber=?");
|
||||||
$sth->execute($biblionumber);
|
$sth->execute($biblionumber);
|
||||||
|
|
||||||
|
# FIXME There is a transaction in _koha_delete_biblio_metadata
|
||||||
|
# But actually all the following should be done inside a single transaction
|
||||||
if ( my $data = $sth->fetchrow_hashref ) {
|
if ( my $data = $sth->fetchrow_hashref ) {
|
||||||
|
|
||||||
# save the record in deletedbiblio
|
# save the record in deletedbiblio
|
||||||
|
@ -3377,6 +3380,8 @@ sub _koha_delete_biblio {
|
||||||
$bkup_sth->execute(@bind);
|
$bkup_sth->execute(@bind);
|
||||||
$bkup_sth->finish;
|
$bkup_sth->finish;
|
||||||
|
|
||||||
|
_koha_delete_biblio_metadata( $biblionumber );
|
||||||
|
|
||||||
# delete the biblio
|
# delete the biblio
|
||||||
my $sth2 = $dbh->prepare("DELETE FROM biblio WHERE biblionumber=?");
|
my $sth2 = $dbh->prepare("DELETE FROM biblio WHERE biblionumber=?");
|
||||||
$sth2->execute($biblionumber);
|
$sth2->execute($biblionumber);
|
||||||
|
@ -3438,6 +3443,31 @@ sub _koha_delete_biblioitems {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
=head2 _koha_delete_biblio_metadata
|
||||||
|
|
||||||
|
$error = _koha_delete_biblio_metadata($biblionumber);
|
||||||
|
|
||||||
|
C<$biblionumber> - the biblionumber of the biblio metadata to be deleted
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub _koha_delete_biblio_metadata {
|
||||||
|
my ($biblionumber) = @_;
|
||||||
|
|
||||||
|
my $dbh = C4::Context->dbh;
|
||||||
|
my $schema = Koha::Database->new->schema;
|
||||||
|
$schema->txn_do(
|
||||||
|
sub {
|
||||||
|
$dbh->do( q|
|
||||||
|
INSERT INTO deletedbiblio_metadata (biblionumber, format, marcflavour, metadata)
|
||||||
|
SELECT biblionumber, format, marcflavour, metadata FROM biblio_metadata WHERE biblionumber=?
|
||||||
|
|, undef, $biblionumber );
|
||||||
|
$dbh->do( q|DELETE FROM biblio_metadata WHERE biblionumber=?|,
|
||||||
|
undef, $biblionumber );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
=head1 UNEXPORTED FUNCTIONS
|
=head1 UNEXPORTED FUNCTIONS
|
||||||
|
|
||||||
=head2 ModBiblioMarc
|
=head2 ModBiblioMarc
|
||||||
|
|
|
@ -17,21 +17,22 @@
|
||||||
|
|
||||||
use Modern::Perl;
|
use Modern::Perl;
|
||||||
|
|
||||||
use Test::More tests => 6;
|
use Test::More tests => 7;
|
||||||
use Test::MockModule;
|
use Test::MockModule;
|
||||||
|
|
||||||
use List::MoreUtils qw( uniq );
|
use List::MoreUtils qw( uniq );
|
||||||
use MARC::Record;
|
use MARC::Record;
|
||||||
use t::lib::Mocks qw( mock_preference );
|
use t::lib::Mocks qw( mock_preference );
|
||||||
|
|
||||||
|
use Koha::Database;
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
use_ok('C4::Biblio');
|
use_ok('C4::Biblio');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
my $schema = Koha::Database->new->schema;
|
||||||
|
$schema->storage->txn_begin;
|
||||||
my $dbh = C4::Context->dbh;
|
my $dbh = C4::Context->dbh;
|
||||||
# Start transaction
|
|
||||||
$dbh->{AutoCommit} = 0;
|
|
||||||
$dbh->{RaiseError} = 1;
|
|
||||||
|
|
||||||
subtest 'GetMarcSubfieldStructureFromKohaField' => sub {
|
subtest 'GetMarcSubfieldStructureFromKohaField' => sub {
|
||||||
plan tests => 23;
|
plan tests => 23;
|
||||||
|
@ -328,19 +329,22 @@ sub create_issn_field {
|
||||||
subtest 'MARC21' => sub {
|
subtest 'MARC21' => sub {
|
||||||
plan tests => 31;
|
plan tests => 31;
|
||||||
run_tests('MARC21');
|
run_tests('MARC21');
|
||||||
$dbh->rollback;
|
$schema->storage->txn_rollback;
|
||||||
|
$schema->storage->txn_begin;
|
||||||
};
|
};
|
||||||
|
|
||||||
subtest 'UNIMARC' => sub {
|
subtest 'UNIMARC' => sub {
|
||||||
plan tests => 31;
|
plan tests => 31;
|
||||||
run_tests('UNIMARC');
|
run_tests('UNIMARC');
|
||||||
$dbh->rollback;
|
$schema->storage->txn_rollback;
|
||||||
|
$schema->storage->txn_begin;
|
||||||
};
|
};
|
||||||
|
|
||||||
subtest 'NORMARC' => sub {
|
subtest 'NORMARC' => sub {
|
||||||
plan tests => 31;
|
plan tests => 31;
|
||||||
run_tests('NORMARC');
|
run_tests('NORMARC');
|
||||||
$dbh->rollback;
|
$schema->storage->txn_rollback;
|
||||||
|
$schema->storage->txn_begin;
|
||||||
};
|
};
|
||||||
|
|
||||||
subtest 'IsMarcStructureInternal' => sub {
|
subtest 'IsMarcStructureInternal' => sub {
|
||||||
|
@ -362,4 +366,16 @@ subtest 'IsMarcStructureInternal' => sub {
|
||||||
is( grep( /^a$/, @internals ), 0, 'no subfield a' );
|
is( grep( /^a$/, @internals ), 0, 'no subfield a' );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
subtest 'deletedbiblio_metadata' => sub {
|
||||||
|
plan tests => 2;
|
||||||
|
|
||||||
|
my ($biblionumber, $biblioitemnumber) = AddBiblio(MARC::Record->new, '');
|
||||||
|
my $biblio_metadata = C4::Biblio::GetXmlBiblio( $biblionumber );
|
||||||
|
C4::Biblio::DelBiblio( $biblionumber );
|
||||||
|
my ( $moved ) = $dbh->selectrow_array(q|SELECT biblionumber FROM deletedbiblio WHERE biblionumber=?|, undef, $biblionumber);
|
||||||
|
is( $moved, $biblionumber );
|
||||||
|
( $moved ) = $dbh->selectrow_array(q|SELECT biblionumber FROM deletedbiblio_metadata WHERE biblionumber=?|, undef, $biblionumber);
|
||||||
|
is( $moved, $biblionumber );
|
||||||
|
};
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
Loading…
Reference in a new issue