From 77b1420026329576a76716b0a1bbc18694e9abf1 Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Mon, 3 Mar 2008 10:37:57 -0600 Subject: [PATCH] indexing - explicitly pass previous record to ModZebra Because NoZebra indexing requires having both the old and new versions of a record when processing an updated, I adjusted the ModZebra sub to require that the old version be explicitly passed to it. That way, the zebraqueue row (for Zebra mode) can now be added *after* the biblio and biblioitems updates have been completed. Signed-off-by: Joshua Ferraro --- C4/AuthoritiesMarc.pm | 8 ++++++-- C4/Biblio.pm | 30 ++++++++++++++++++------------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm index c99d332c56..c2c545c069 100644 --- a/C4/AuthoritiesMarc.pm +++ b/C4/AuthoritiesMarc.pm @@ -544,6 +544,7 @@ sub AddAuthority { $record->add_fields($auth_type_tag,'','', $auth_type_subfield=>$authtypecode); } + my $oldRecord; if (!$authid) { my $sth=$dbh->prepare("select max(authid) from auth_header"); $sth->execute; @@ -560,6 +561,9 @@ sub AddAuthority { $sth->execute($authid,$authtypecode,$record->as_usmarc,$record->as_xml_record($format)); $sth->finish; }else{ + if (C4::Context->preference('NoZebra')) { + $oldRecord = GetAuthority($authid); + } $record->add_fields('001',$authid) unless ($record->field('001')); $dbh->do("lock tables auth_header WRITE"); my $sth=$dbh->prepare("update auth_header set marc=?,marcxml=? where authid=?"); @@ -567,7 +571,7 @@ sub AddAuthority { $sth->finish; } $dbh->do("unlock tables"); - ModZebra($authid,'specialUpdate',"authorityserver",$record); + ModZebra($authid,'specialUpdate',"authorityserver",$oldRecord,$record); return ($authid); } @@ -588,7 +592,7 @@ sub DelAuthority { my ($authid) = @_; my $dbh=C4::Context->dbh; - ModZebra($authid,"recordDelete","authorityserver",GetAuthority($authid)); + ModZebra($authid,"recordDelete","authorityserver",GetAuthority($authid),undef); $dbh->do("delete from auth_header where authid=$authid") ; } diff --git a/C4/Biblio.pm b/C4/Biblio.pm index b07073e83a..5a6539bf63 100755 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -362,7 +362,13 @@ sub DelBiblio { # - we need to read the biblio if NoZebra is set (to remove it from the indexes # - if something goes wrong, the biblio may be deleted from Koha but not from zebra # and we would have no way to remove it (except manually in zebra, but I bet it would be very hard to handle the problem) - ModZebra($biblionumber, "recordDelete", "biblioserver", undef); + my $oldRecord; + if (C4::Context->preference("NoZebra")) { + # only NoZebra indexing needs to have + # the previous version of the record + $oldRecord = GetMarcBiblio($biblionumber); + } + ModZebra($biblionumber, "recordDelete", "biblioserver", $oldRecord, undef); # delete biblioitems and items from Koha tables and save in deletedbiblioitems,deleteditems $sth = @@ -2049,7 +2055,7 @@ ModZebra( $biblionumber, $op, $server, $newRecord ); sub ModZebra { ###Accepts a $server variable thus we can use it for biblios authorities or other zebra dbs - my ( $biblionumber, $op, $server, $newRecord ) = @_; + my ( $biblionumber, $op, $server, $oldRecord, $newRecord ) = @_; my $dbh=C4::Context->dbh; # true ModZebra commented until indexdata fixes zebraDB crashes (it seems they occur on multiple updates @@ -2063,24 +2069,18 @@ sub ModZebra { # lock the table to avoid someone else overwriting what we are doing $dbh->do('LOCK TABLES nozebra WRITE,biblio WRITE,biblioitems WRITE, systempreferences WRITE, auth_types WRITE, auth_header WRITE'); my %result; # the result hash that will be builded by deletion / add, and written on mySQL at the end, to improve speed - my $record; - if ($server eq 'biblioserver') { - $record= GetMarcBiblio($biblionumber); - } else { - $record= C4::AuthoritiesMarc::GetAuthority($biblionumber); - } if ($op eq 'specialUpdate') { # OK, we have to add or update the record # 1st delete (virtually, in indexes), if record actually exists - if ($record) { - %result = _DelBiblioNoZebra($biblionumber,$record,$server); + if ($oldRecord) { + %result = _DelBiblioNoZebra($biblionumber,$oldRecord,$server); } # ... add the record %result=_AddBiblioNoZebra($biblionumber,$newRecord, $server, %result); } else { # it's a deletion, delete the record... # warn "DELETE the record $biblionumber on $server".$record->as_formatted; - %result=_DelBiblioNoZebra($biblionumber,$record,$server); + %result=_DelBiblioNoZebra($biblionumber,$oldRecord,$server); } # ok, now update the database... my $sth = $dbh->prepare("UPDATE nozebra SET biblionumbers=? WHERE server=? AND indexname=? AND value=?"); @@ -2947,13 +2947,19 @@ sub ModBiblioMarc { MARC::Field->new( 100, "", "", "a" => $string ) ); } } - ModZebra($biblionumber,"specialUpdate","biblioserver",$record); + my $oldRecord; + if (C4::Context->preference("NoZebra")) { + # only NoZebra indexing needs to have + # the previous version of the record + $oldRecord = GetMarcBiblio($biblionumber); + } $sth = $dbh->prepare( "UPDATE biblioitems SET marc=?,marcxml=? WHERE biblionumber=?"); $sth->execute( $record->as_usmarc(), $record->as_xml_record($encoding), $biblionumber ); $sth->finish; + ModZebra($biblionumber,"specialUpdate","biblioserver",$oldRecord,$record); return $biblionumber; } -- 2.39.5