From 29c1be49acdb7756b38802d7516b994ffc8391e5 Mon Sep 17 00:00:00 2001 From: Marcel de Rooy Date: Thu, 7 Apr 2011 10:14:08 +0200 Subject: [PATCH] 6094 Fixing ModAuthority problems Content-Type: text/plain; charset="utf-8" Pref MergeAuthoritiesOnUpdate does not exist; should be dontmerge. In: C4/AuthoritiesMarc.pm Instead of folder modified_authorities, now introducing a table for this purpose: need_merge_authorities. This eliminates several permissions and security issues. This change applies to AuthoritiesMarc.pm and merge_authority.pl. POD lines added for ModAuthority. Deprecated parameter $merge removed. Commented the line destroying the Zconn object in merge(). This made the second call to merge crash. July 25, 2011: Adjusted. Test this patch by applying the db revision first from the corresponding dbrev patch. --- C4/AuthoritiesMarc.pm | 37 ++++++++++++++++-------------- misc/migration_tools/merge_authority.pl | 19 ++++++---------- 2 files changed, 27 insertions(+), 29 deletions(-) diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm index fa2ef00..a5a5a6e 100644 --- a/C4/AuthoritiesMarc.pm +++ b/C4/AuthoritiesMarc.pm @@ -734,30 +734,33 @@ sub DelAuthority { $sth->execute($authid); } +=head2 ModAuthority + + $authid= &ModAuthority($authid,$record,$authtypecode) + +Modifies authority record, optionally updates attached biblios. + +=cut + sub ModAuthority { - my ($authid,$record,$authtypecode,$merge)=@_; + my ($authid,$record,$authtypecode)=@_; # deprecated $merge parameter removed + my $dbh=C4::Context->dbh; #Now rewrite the $record to table with an add my $oldrecord=GetAuthority($authid); $authid=AddAuthority($record,$authid,$authtypecode); -### If a library thinks that updating all biblios is a long process and wishes to leave that to a cron job to use merge_authotities.p -### they should have a system preference "dontmerge=1" otherwise by default biblios will be updated -### the $merge flag is now depreceated and will be removed at code cleaning - if (C4::Context->preference('MergeAuthoritiesOnUpdate') ){ + # If a library thinks that updating all biblios is a long process and wishes + # to leave that to a cron job, use misc/migration_tools/merge_authority.pl. + # In that case set system preference "dontmerge" to 1. Otherwise biblios will + # be updated. + unless(C4::Context->preference('dontmerge') eq '1'){ &merge($authid,$oldrecord,$authid,$record); } else { - # save the file in tmp/modified_authorities - my $cgidir = C4::Context->intranetdir ."/cgi-bin"; - unless (opendir(DIR,"$cgidir")) { - $cgidir = C4::Context->intranetdir."/"; - closedir(DIR); - } - - my $filename = $cgidir."/tmp/modified_authorities/$authid.authid"; - open AUTH, "> $filename"; - print AUTH $authid; - close AUTH; + # save a record in need_merge_authorities table + my $sqlinsert="INSERT INTO need_merge_authorities (authid, done) ". + "VALUES (?,?)"; + $dbh->do($sqlinsert,undef,($authid,0)); } logaction( "AUTHORITIES", "MODIFY", $authid, "BEFORE=>" . $oldrecord->as_formatted ) if C4::Context->preference("AuthoritiesLog"); return $authid; @@ -1323,7 +1326,7 @@ sub merge { push @reccache, $marcdata; $z++; } - $oConnection->destroy(); + #$oConnection->destroy(); #see Bugzilla 6094 Uncommenting this line makes that the second subsequent call of merge crashes on the Zconn call line little before this line } #warn scalar(@reccache)." biblios to update"; # Get All candidate Tags for the change diff --git a/misc/migration_tools/merge_authority.pl b/misc/migration_tools/merge_authority.pl index b99591f..9ee0da7 100755 --- a/misc/migration_tools/merge_authority.pl +++ b/misc/migration_tools/merge_authority.pl @@ -44,6 +44,7 @@ SAMPLE : ./merge_authority.pl -f 2457 -t 531 Before doing anything, the script will show both authorities and ask for confirmation. Of course, you can merge only 2 authorities of the same kind. +Make sure that if this script runs in batch mode, the process has sufficient permissions for removing files from /var/tmp/modified_authorities. EOF ;# die; @@ -75,23 +76,17 @@ unless ($noconfirm || $batch) { my $starttime = gettimeofday; print "Merging\n" unless $noconfirm; if ($batch) { - my @authlist; - my $cgidir = C4::Context->intranetdir ."/cgi-bin"; - unless (opendir(DIR, "$cgidir/tmp/modified_authorities")) { - $cgidir = C4::Context->intranetdir; - opendir(DIR, "$cgidir/tmp/modified_authorities") || die "can't opendir $cgidir/tmp/modified_authorities: $!"; - } - while (my $authid = readdir(DIR)) { - if ($authid =~ /\.authid$/) { - $authid =~ s/\.authid$//; + my $authref; + $dbh->do("update need_merge_authorities set done=2 where done=0"); #temporary status 2 means: selected for merge + $authref=$dbh->selectall_arrayref("select distinct authid from need_merge_authorities where done=2"); + foreach(@$authref) { + my $authid=$_->[0]; print "managing $authid\n" if $verbose; my $MARCauth = GetAuthority($authid) ; next unless ($MARCauth); merge($authid,$MARCauth,$authid,$MARCauth) if ($MARCauth); - unlink $cgidir.'/tmp/modified_authorities/'.$authid.'.authid'; - } } - closedir DIR; + $dbh->do("update need_merge_authorities set done=1 where done=2"); #DONE } else { my $MARCfrom = GetAuthority($mergefrom); my $MARCto = GetAuthority($mergeto); -- 1.6.0.6