From 3ca2d8526db73eb2b763be4666f2d26249080fad Mon Sep 17 00:00:00 2001 From: tipaul Date: Tue, 8 Mar 2005 11:08:34 +0000 Subject: [PATCH] updating merge_authority to have a "batch mode" in this mode all .authid files stored in $KOHAROOT/localfiles/modified_authorities are managed : the corresponding biblios are updated with the modified authority content. This script can now be put in crontab. --- misc/merge_authority.pl | 177 +++++++++++++++++++++++++--------------- 1 file changed, 109 insertions(+), 68 deletions(-) diff --git a/misc/merge_authority.pl b/misc/merge_authority.pl index a046d83360..b4ec5d50fb 100755 --- a/misc/merge_authority.pl +++ b/misc/merge_authority.pl @@ -13,16 +13,17 @@ use C4::AuthoritiesMarc; use Time::HiRes qw(gettimeofday); use Getopt::Long; -my ($version, $verbose, $mergefrom,$mergeto,$noconfirm); +my ($version, $verbose, $mergefrom,$mergeto,$noconfirm,$batch); GetOptions( 'h' => \$version, 'f:s' => \$mergefrom, 't:s' => \$mergeto, 'v' => \$verbose, 'n' => \$noconfirm, + 'b' => \$batch, ); -if ($version || ($mergefrom eq '')) { +if ($version || ($mergefrom eq '' && !$batch)) { print <dbh; # my @subf = $subfields =~ /(##\d\d\d##.)/g; $|=1; # flushes output -my $authfrom = AUTHgetauthority($dbh,$mergefrom); -my $authto = AUTHgetauthority($dbh,$mergeto); - -my $authtypecodefrom = AUTHfind_authtypecode($dbh,$mergefrom); -my $authtypecodeto = AUTHfind_authtypecode($dbh,$mergeto); - -unless ($noconfirm) { - print "************\n"; - print "You will merge authority : $mergefrom ($authtypecodefrom)\n".$authfrom->as_formatted; - print "\n*************\n"; - print "Into authority : $mergeto ($authtypecodeto)\n".$authto->as_formatted; - print "\n\nDo you confirm (enter YES)?"; - my $confirm = ; - chop $confirm; - unless (uc($confirm) eq 'YES' and $authtypecodefrom eq $authtypecodeto) { - print "IMPOSSIBLE : authorities are not of the same type ($authtypecodefrom vs $authtypecodeto) !!!\n" if $authtypecodefrom ne $authtypecodeto; - print "Merge cancelled\n"; - exit; - } -} my $starttime = gettimeofday; -print "Merging\n" unless $noconfirm; - -# search the tag to report -my $sth = $dbh->prepare("select auth_tag_to_report from auth_types where authtypecode=?"); -$sth->execute($authtypecodefrom); -my ($auth_tag_to_report) = $sth->fetchrow; -# my $record_to_report = $authto->field($auth_tag_to_report); -print "Reporting authority tag $auth_tag_to_report :\n" if $verbose; -my @record_to = $authto->field($auth_tag_to_report)->subfields(); -my @record_from = $authfrom->field($auth_tag_to_report)->subfields(); - -# search all biblio tags using this authority. -$sth = $dbh->prepare("select distinct tagfield from marc_subfield_structure where authtypecode=?"); -$sth->execute($authtypecodefrom); -my $tags_using_authtype; -while (my ($tagfield) = $sth->fetchrow) { - $tags_using_authtype.= "'".$tagfield."',"; -} -chop $tags_using_authtype; -# now, find every biblio using this authority -my $query = "select bibid,tag,tag_indicator,tagorder,subfieldcode,subfieldorder from marc_subfield_table where tag in ($tags_using_authtype) and subfieldcode='9' and subfieldvalue='$mergefrom'"; -$sth = $dbh->prepare($query); -$sth->execute; -my $nbdone; -# and delete entries before recreating them -while (my ($bibid,$tag,$tag_indicator,$tagorder,$subfieldcode,$subfieldorder) = $sth->fetchrow) { - my $biblio = MARCgetbiblio($dbh,$bibid); - print "BEFORE : ".$biblio->as_formatted."\n" if $verbose; - # now, we know what uses the authority & where. - # delete all subfields that are in the same tag/tagorder and that are in the authority (& that are not in tab ignore in the biblio) - # then recreate them with the new authority. - foreach my $subfield (@record_from) { - &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,$subfield->[0]); +if ($batch) { + my @authlist; + my $cgidir = C4::Context->intranetdir ."/cgi-bin"; + unless (opendir(DIR, "$cgidir/localfile/modified_authorities")) { + $cgidir = C4::Context->intranetdir; + opendir(DIR, "$cgidir/localfile/modified_authorities") || die "can't opendir $cgidir/localfile/modified_authorities: $!"; + } + while (my $authid = readdir(DIR)) { + if ($authid =~ /\.authid$/) { + $authid =~ s/\.authid$//; + print "managing $authid\n" if $verbose; + my $MARCauth = AUTHgetauthority($dbh,$authid); + &merge($dbh,$authid,$MARCauth,$authid,$MARCauth) if ($MARCauth); + unlink $cgidir.'/localfile/modified_authorities/'.$authid.'.authid'; + } } - &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,'9'); - foreach my $subfield (@record_to) { - &MARCaddsubfield($dbh,$bibid,$tag,$tag_indicator,$tagorder,$subfield->[0],$subfieldorder,$subfield->[1]); - } - &MARCaddsubfield($dbh,$bibid,$tag,$tag_indicator,$tagorder,'9',$subfieldorder,$mergeto); - my $biblio = MARCgetbiblio($dbh,$bibid); - print "AFTER : ".$biblio->as_formatted."\n" if $verbose; - $nbdone++; -# &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,$subfieldcode,$subfieldorder); - + closedir DIR; +} else { + my $MARCfrom = AUTHgetauthority($dbh,$mergefrom); + my $MARCto = AUTHgetauthority($dbh,$mergeto); + &merge($dbh,$mergefrom,$MARCfrom,$mergeto,$MARCto); } my $timeneeded = gettimeofday - $starttime; -print "$nbdone authorities done in $timeneeded seconds" unless $noconfirm; \ No newline at end of file +print "Done in $timeneeded seconds" unless $noconfirm; + +sub merge { + my ($dbh,$mergefrom,$MARCfrom,$mergeto,$MARCto) = @_; + my $authtypecodefrom = AUTHfind_authtypecode($dbh,$mergefrom); + my $authtypecodeto = AUTHfind_authtypecode($dbh,$mergeto); + # return if authority does not exist + my @X = $MARCfrom->fields(); + return if $#X == -1; + my @X = $MARCto->fields(); + return if $#X == -1; + unless ($noconfirm) { + print "************\n"; + print "You will merge authority : $mergefrom ($authtypecodefrom)\n".$MARCfrom->as_formatted; + print "\n*************\n"; + print "Into authority : $mergeto ($authtypecodeto)\n".$MARCto->as_formatted; + print "\n\nDo you confirm (enter YES)?"; + my $confirm = ; + chop $confirm; + unless (uc($confirm) eq 'YES' and $authtypecodefrom eq $authtypecodeto) { + print "IMPOSSIBLE : authorities are not of the same type ($authtypecodefrom vs $authtypecodeto) !!!\n" if $authtypecodefrom ne $authtypecodeto; + print "Merge cancelled\n"; + exit; + } + } + print "Merging\n" unless $noconfirm; + + # search the tag to report + my $sth = $dbh->prepare("select auth_tag_to_report from auth_types where authtypecode=?"); + $sth->execute($authtypecodefrom); + my ($auth_tag_to_report) = $sth->fetchrow; + # my $record_to_report = $MARCto->field($auth_tag_to_report); + print "Reporting authority tag $auth_tag_to_report :\n" if $verbose; + my @record_to; + @record_to = $MARCto->field($auth_tag_to_report)->subfields() if $MARCto->field($auth_tag_to_report); + my @record_from; + @record_from = $MARCfrom->field($auth_tag_to_report)->subfields() if $MARCfrom->field($auth_tag_to_report); + + # search all biblio tags using this authority. + $sth = $dbh->prepare("select distinct tagfield from marc_subfield_structure where authtypecode=?"); + $sth->execute($authtypecodefrom); + my $tags_using_authtype; + while (my ($tagfield) = $sth->fetchrow) { + $tags_using_authtype.= "'".$tagfield."',"; + } + chop $tags_using_authtype; + # now, find every biblio using this authority + my $query = "select bibid,tag,tag_indicator,tagorder,subfieldcode,subfieldorder from marc_subfield_table where tag in ($tags_using_authtype) and subfieldcode='9' and subfieldvalue='$mergefrom'"; + $sth = $dbh->prepare($query); + $sth->execute; +# my $nbdone; + # and delete entries before recreating them + while (my ($bibid,$tag,$tag_indicator,$tagorder,$subfieldcode,$subfieldorder) = $sth->fetchrow) { + my $biblio = MARCgetbiblio($dbh,$bibid); + print "BEFORE : ".$biblio->as_formatted."\n" if $verbose; + # now, we know what uses the authority & where. + # delete all subfields that are in the same tag/tagorder and that are in the authority (& that are not in tab ignore in the biblio) + # then recreate them with the new authority. + foreach my $subfield (@record_from) { + &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,$subfield->[0]); + } + &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,'9') unless $mergefrom eq $mergeto; + foreach my $subfield (@record_to) { + &MARCaddsubfield($dbh,$bibid,$tag,$tag_indicator,$tagorder,$subfield->[0],$subfieldorder,$subfield->[1]); + } + &MARCaddsubfield($dbh,$bibid,$tag,$tag_indicator,$tagorder,'9',$subfieldorder,$mergeto) unless $mergefrom eq $mergeto; + my $biblio = MARCgetbiblio($dbh,$bibid); + print "AFTER : ".$biblio->as_formatted."\n" if $verbose; +# $nbdone++; + # &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,$subfieldcode,$subfieldorder); + + } +} \ No newline at end of file