[Koha-patches] [PATCH] Bug 6851 - script to set the MARC leader for resources with analytics
Robin Sheat
robin at catalyst.net.nz
Wed Sep 7 08:10:17 CEST 2011
This will find records that have a 773$w record that points to something
else. For these, it will set the MARC leader position 19 value to 'c'.
It will also find records that have a 001 value that is pointed to by
another record's 773$w. For these, it sets the leader position 7 to 's'.
With these set, Koha knows to present the links in the details views to
connect the resources.
Note: this is intended to be a post-migration script, in case your
imported records had incomplete headers.
---
misc/migration_tools/set_analytics_header | 146 +++++++++++++++++++++++++++++
1 files changed, 146 insertions(+), 0 deletions(-)
create mode 100755 misc/migration_tools/set_analytics_header
diff --git a/misc/migration_tools/set_analytics_header b/misc/migration_tools/set_analytics_header
new file mode 100755
index 0000000..849a9ae
--- /dev/null
+++ b/misc/migration_tools/set_analytics_header
@@ -0,0 +1,146 @@
+#!/usr/bin/perl
+
+# Copyright 2011 Catalyst IT
+
+# This file is part of Koha.
+#
+# Koha is free software; you can redistribute it and/or modify it under the
+# terms of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+#
+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with Koha; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# This will run through the biblios and save the 001 field for every
+# record, linking it to the biblionumber. It will then go through again, and
+# for every record that has a 773$w field, it will look up the corresponding
+# parent record (using the saved 001 map) and set its header to indicate it's
+# the parent of a set. It will then set the header of the one with 773$w to
+# show that it's a member of a set. Then Koha will know to link them up.
+
+# This is done by setting position 7 in the leader to 's' for the "parent"
+# records, and setting position 19 to 'c'. This causes Koha to create links
+# between them.
+
+use strict;
+use warnings;
+
+use C4::Context;
+use C4::Biblio qw/ ModBiblioMarc /;
+
+use MARC::Record;
+use MARC::Field;
+use MARC::File::XML;
+
+my $dbh = C4::Context->dbh;
+
+my $all_bibs_marc_sth = $dbh->prepare("SELECT biblionumber,marc FROM biblioitems");
+$all_bibs_marc_sth->execute();
+
+# First pass catches all the 001s and maps them to biblionumbers
+my %ctrl_to_bib;
+my $count = 0;
+while (my $row = $all_bibs_marc_sth->fetchrow_arrayref) {
+ display(\$count);
+ my $bib = $row->[0];
+ my $marcval = $row->[1];
+ die "No marcval!" if (!$marcval);
+
+ my $marc = eval { MARC::Record->new_from_usmarc($marcval) };
+ if ($@) {
+ warn "Error parsing MARC for bib $bib: $@\n";
+ next;
+ }
+
+ my $field = $marc->field('001');
+ if (!$field) {
+ warn "No 001 field for bib $bib";
+ next;
+ }
+ my $data = $field->data;
+ if (!$data) {
+ warn "No 001 data for bib $bib";
+ next;
+ }
+ $ctrl_to_bib{$data} = $bib;
+}
+
+# Now do much the same thing, but check out the 773$w field, and for each one
+# we find, update the appropriate records.
+print "Part duex\n";
+$count = 0;
+
+$all_bibs_marc_sth->execute();
+while (my $row = $all_bibs_marc_sth->fetchrow_arrayref) {
+ display(\$count);
+ my ($bib, $marcval) = @$row;
+
+ my $marc = eval { MARC::Record->new_from_usmarc($marcval) };
+ if ($@) {
+ warn "Error parsing MARC for bib $bib: $@\n";
+ next;
+ }
+ my $field = $marc->field('773');
+ next if !$field;
+
+ my $subfield = $field->subfield('w');
+ next if !$subfield;
+
+ if (my $parent_bib = $ctrl_to_bib{$subfield}) {
+ update_parent($parent_bib);
+ delete $ctrl_to_bib{$subfield};
+ }
+ update_child($bib, $marc);
+}
+
+print "\n";
+
+my $get_marc_sth;
+sub update_parent {
+ my ($bib) = @_;
+
+ $get_marc_sth ||= $dbh->prepare("SELECT marc FROM biblioitems WHERE biblionumber=?");
+ $get_marc_sth->execute($bib);
+ my $row = $get_marc_sth->fetchrow_arrayref;
+ if (!$row) {
+ die "Failed to look up parent for bib $bib";
+ }
+ my $marcval = $row->[0];
+ die "No marc value for bib $bib" if !$marcval;
+ my $marc = MARC::Record->new_from_usmarc($marcval);
+ my $leader = $marc->leader;
+
+ substr($leader, 7, 1) = 's';
+ $marc->leader($leader);
+ # Using this function isn't recommended, but as all we're doing is
+ # re-writing the leader, it should be OK here.
+ ModBiblioMarc($marc, $bib, '');
+ warn "Updating parent: $bib\n";
+}
+
+sub update_child {
+ my ($bib, $marc) = @_;
+
+ my $leader = $marc->leader;
+ substr($leader, 19, 1) = 'c';
+ $marc->leader($leader);
+ ModBiblioMarc($marc, $bib, '');
+ warn "Updating child: $bib\n";
+}
+
+sub display {
+ my $count = shift;
+
+ if ($$count % 70 == 0) {
+ print "\n$$count ";
+ } else {
+ print ".";
+ }
+ $$count++;
+}
--
1.7.4.1
More information about the Koha-patches
mailing list