[Koha-devel] How to resync biblioitem.marc, and (modified) biblioitem.marcxml

pete huerter pete.huerter at gmail.com
Fri Apr 8 16:44:16 CEST 2011


Hi Koha-devel group,

I just ran some SQL queries that changed the biblioitems.marcxml blob,
but did not change the biblioitems.marc blob.  What are the
implications of this, and how can I fix this?

It seems like I should be able to just do this to 'resync' these two fields:

  for each biblio,
     call biblio = GetBiblio
     call ModBiblio (biblio)

Can someone please confirm?  (or is there a better way to do this?)

(Scroll down for more background info)

Thanks,
Pete.


Background:

During the bulk import process some of our biblios were imported with
incorrect 952$8 Collection code (should be in CCODE authorised values
list), and 952$c Shelving Location Code (should be in LOC authorised
values list).  E.g. "military o/s", should be "military o_s" which
maps to "Military oversized" in the CCODE list.  For this discussion
let's assume that both 952$8, and 952$c need to be changed from
"military o/s" to "military o_s".

I thought I was being clever and used SQL directly to replace "miltary
o/s" with "military o_s" in 4 places:
1. items.location
2. biblioitems.marcxml : field 952$c
3. items.ccode
4. biblioitems.marcxml : field 952$8

Sample SQL queries:

# items.location
UPDATE items
SET items.location = REPLACE(items.location, 'o/s', 'o_s')
WHERE items.location LIKE '%o/s%';

# marcxml blob 952$c
UPDATE biblioitems
SET marcxml = REPLACE(marcxml, 'rare/box', 'rare_box')
WHERE extractvalue(biblioitems.marcxml,'//datafield[@tag="952"]/subfield[@code="c"]')
= 'rare/box';

# items.ccode
UPDATE items
SET items.ccode = REPLACE(items.ccode, 'catalog', 'catalogue')
WHERE items.ccode = 'catalog';

# marc blob: 952$8
UPDATE biblioitems
SET marcxml = REPLACE(marcxml, 'catalog', 'catalogue')
WHERE extractvalue(biblioitems.marcxml,'//datafield[@tag="952"]/subfield[@code="8"]')
= 'catalog';

Then I realized that there is a second marc blob (biblioitems.marc) in
addition to the marcxml blob (biblioitems.marcxml) - which looks like
compiled marc? - that I did not change - yikes!

When I look in lib/C4 it looks like GetBiblio (which calls
GetBiblioMarc) uses the $marcxml to compose a Biblio $record.

Biblio.pm at GetBiblioMarc:
    $record = eval { MARC::Record::new_from_xml( $marcxml, "utf8",
C4::Context->preference('marcflavour') ) };

And it seems that ModBiblio (which calls ModBiblioMarc) compiles the
$record into both formats, the marcxml blob, and the us_marc blob
(compiled MARC?).

Biblio.pm at ModBiblioMarc:
    $sth = $dbh->prepare("UPDATE biblioitems SET marc=?,marcxml=?
WHERE biblionumber=?");
    $sth->execute( $record->as_usmarc(),
$record->as_xml_record($encoding), $biblionumber );
    $sth->finish;

There are also the following functions in Record.pm that look promising:

Record.pm@{marc2marcxml,marcxml2marc, changeEncoding}

It seems that generally biblioitems.marcxml is used more than the
biblioitems.marc blob.

It seems like I should be able to just, for each biblio, call
GetBiblio followed by ModBiblio to 'resync' these two fields.

Can someone please confirm?


More information about the Koha-devel mailing list