X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;ds=sidebyside;f=C4%2FAuthoritiesMarc.pm;h=aef8b6c60e7481cd069495e183978d73d3c31096;hb=198bae17b1ebd42f4c1ce3b21e13b7ad7b844b64;hp=2975a384757653165315e7dd9c449651ca040864;hpb=df5492f1673f6b31d4eebd2e30bf601298f81847;p=koha.git diff --git a/C4/AuthoritiesMarc.pm b/C4/AuthoritiesMarc.pm index 2975a38475..aef8b6c60e 100644 --- a/C4/AuthoritiesMarc.pm +++ b/C4/AuthoritiesMarc.pm @@ -17,278 +17,476 @@ package C4::AuthoritiesMarc; # Suite 330, Boston, MA 02111-1307 USA use strict; -require Exporter; use C4::Context; use C4::Koha; -use Encode; +use MARC::Record; use C4::Biblio; +use C4::Search; +use C4::AuthoritiesMarc::MARC21; +use C4::AuthoritiesMarc::UNIMARC; +use C4::Charset; +use C4::Debug; use vars qw($VERSION @ISA @EXPORT); -# set the version for version checking -$VERSION = 0.01; - -@ISA = qw(Exporter); -@EXPORT = qw( - &AUTHgettagslib - &AUTHfindsubfield - &AUTHfind_authtypecode - &AUTHaddauthority - &AUTHmodauthority - &AUTHdelauthority - &AUTHaddsubfield - - &AUTHfind_marc_from_kohafield - &AUTHgetauth_type - &AUTHcount_usage - &getsummary - &authoritysearch - &XMLgetauthority - &XMLgetauthorityhash - &XML_readline_withtags - &merge - &FindDuplicateauth - &ZEBRAdelauthority - ); - -sub AUTHfind_marc_from_kohafield { - my ( $dbh, $kohafield,$authtypecode ) = @_; - return 0, 0 unless $kohafield; -$authtypecode="" unless $authtypecode; -my $marcfromkohafield; - my $sth = $dbh->prepare("select tagfield,tagsubfield from auth_subfield_structure where kohafield= ? and authtypecode=? "); - $sth->execute($kohafield,$authtypecode); - my ($tagfield,$tagsubfield) = $sth->fetchrow; - return ($tagfield,$tagsubfield); +BEGIN { + # set the version for version checking + $VERSION = 3.01; + + require Exporter; + @ISA = qw(Exporter); + @EXPORT = qw( + &GetTagsLabels + &GetAuthType + &GetAuthTypeCode + &GetAuthMARCFromKohaField + &AUTHhtml2marc + + &AddAuthority + &ModAuthority + &DelAuthority + &GetAuthority + &GetAuthorityXML + + &CountUsage + &CountUsageChildren + &SearchAuthorities + + &BuildSummary + &BuildUnimarcHierarchies + &BuildUnimarcHierarchy + + &merge + &FindDuplicateAuthority + ); } -sub authoritysearch { -## This routine requires rewrite--TG - my ($dbh, $tags, $operator, $value, $offset,$length,$authtypecode,$dictionary) = @_; -###Dictionary flag used to set what to show in summary; - my $query; - my $attr; - my $server; - my $mainentrytag; - ##first set the authtype search and may be multiple authorities( linked authorities) - my $n=0; - my @authtypecode; - my @auths=split / /,$authtypecode ; - my ($attrfield)=MARCfind_attr_from_kohafield("authtypecode"); - foreach my $auth (@auths){ - $query .=$attrfield." ".$auth." "; ##No truncation on authtype - push @authtypecode ,$auth; - $n++; - } - if ($n>1){ - $query= "\@or ".$query; - } - - my $dosearch; - my $and; - my $q2; - for(my $i = 0 ; $i <= $#{$value} ; $i++) - { - - if (@$value[$i]){ - ##If mainentry search $a tag - if (@$tags[$i] eq "mainentry") { - ($attr)=MARCfind_attr_from_kohafield("mainentry")." "; - }else{ - ($attr) =MARCfind_attr_from_kohafield("allentry")." "; - } - if (@$operator[$i] eq 'phrase') { - $attr.=" \@attr 4=1 \@attr 5=100 \@attr 6=3 ";##Phrase, No truncation,all of subfield field must match - - } else { - - $attr .=" \@attr 4=6 \@attr 5=1 ";## Word list, right truncated, anywhere - } - - - $and .=" \@and " ; - $attr =$attr."\"".@$value[$i]."\""; - $q2 .=$attr; - $dosearch=1; - }#if value - - }## value loop -##Add how many queries generated -$query= $and.$query.$q2; -#warn $query; - -$offset=0 unless $offset; -my $counter = $offset; -$length=10 unless $length; -my @oAuth; -my $i; - $oAuth[0]=C4::Context->Zconnauth("authorityserver"); -my ($mainentry)=MARCfind_attr_from_kohafield("mainentry"); -my ($allentry)=MARCfind_attr_from_kohafield("allentry"); - -$query="\@attr 2=102 \@or \@or ".$query." \@attr 7=1 ".$mainentry." 0 \@attr 7=1 ".$allentry." 1"; ## sort on mainfield and subfields - - -my $oAResult; - $oAResult= $oAuth[0]->search_pqf($query) ; -while (($i = ZOOM::event(\@oAuth)) != 0) { - my $ev = $oAuth[$i-1]->last_event(); -# warn("Authority ", $i-1, ": event $ev (", ZOOM::event_str($ev), ")\n"); - last if $ev == ZOOM::Event::ZEND; + +=head2 GetAuthMARCFromKohaField + +=over 4 + +( $tag, $subfield ) = &GetAuthMARCFromKohaField ($kohafield,$authtypecode); +returns tag and subfield linked to kohafield + +Comment : +Suppose Kohafield is only linked to ONE subfield + +=back + +=cut + +sub GetAuthMARCFromKohaField { +#AUTHfind_marc_from_kohafield + my ( $kohafield,$authtypecode ) = @_; + my $dbh=C4::Context->dbh; + return 0, 0 unless $kohafield; + $authtypecode="" unless $authtypecode; + my $marcfromkohafield; + my $sth = $dbh->prepare("select tagfield,tagsubfield from auth_subfield_structure where kohafield= ? and authtypecode=? "); + $sth->execute($kohafield,$authtypecode); + my ($tagfield,$tagsubfield) = $sth->fetchrow; + + return ($tagfield,$tagsubfield); } - my($error, $errmsg, $addinfo, $diagset) = $oAuth[0]->error_x(); - if ($error) { - warn "oAuth error: $errmsg ($error) $addinfo $diagset\n"; - goto NOLUCK; - } +=head2 SearchAuthorities -my $nbresults; - $nbresults=$oAResult->size(); -my $nremains=$nbresults; - my @result = (); - my @finalresult = (); - -if ($nbresults>0){ - -##Find authid and linkid fields - - -while (($counter < $nbresults) && ($counter < ($offset + $length))) { -##Here we have to extract MARC record and $authid from ZEBRA AUTHORITIES -my $rec=$oAResult->record($counter); -my $marcdata=$rec->raw(); -my $authrecord=Encode::decode("utf8",$marcdata); -$authrecord=XML_xml2hash_onerecord($authrecord); -my @linkids; -my $separator=C4::Context->preference('authoritysep'); -my $linksummary=" ".$separator; -my $authid=XML_readline_onerecord($authrecord,"authid","authorities"); -my @linkid=XML_readline_asarray($authrecord,"linkid","authorities");##May have many linked records - - foreach my $linkid (@linkid){ - my $linktype=AUTHfind_authtypecode($dbh,$linkid); - my $linkrecord=XMLgetauthorityhash($dbh,$linkid); - $linksummary.="
    ".getsummary($dbh,$linkrecord,$linkid,$linktype).".".$separator; - - } -my $summary; -unless ($dictionary){ - $summary=getsummary($dbh,$authrecord,$authid,$authtypecode); -$summary="".$summary."."; - if ( $linksummary ne " ".$separator){ - $summary="".$summary."".$linksummary; - } -}else{ - $summary=getdictsummary($dbh,$authrecord,$authid,$authtypecode); +=over 4 + +(\@finalresult, $nbresults)= &SearchAuthorities($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby) +returns ref to array result and count of results returned + +=back + +=cut + +sub SearchAuthorities { + my ($tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby) = @_; +# warn "CALL : $tags, $and_or, $excluding, $operator, $value, $offset,$length,$authtypecode,$sortby"; + my $dbh=C4::Context->dbh; + if (C4::Context->preference('NoZebra')) { + + # + # build the query + # + my $query; + my @auths=split / /,$authtypecode ; + foreach my $auth (@auths){ + $query .="AND auth_type= $auth "; + } + $query =~ s/^AND //; + my $dosearch; + for(my $i = 0 ; $i <= $#{$value} ; $i++) + { + if (@$value[$i]){ + if (@$tags[$i] =~/mainentry|mainmainentry/) { + $query .= qq( AND @$tags[$i] ); + } else { + $query .=" AND "; + } + if (@$operator[$i] eq 'is') { + $query.=(@$tags[$i]?"=":""). '"'.@$value[$i].'"'; + }elsif (@$operator[$i] eq "="){ + $query.=(@$tags[$i]?"=":""). '"'.@$value[$i].'"'; + }elsif (@$operator[$i] eq "start"){ + $query.=(@$tags[$i]?"=":"").'"'.@$value[$i].'%"'; + } else { + $query.=(@$tags[$i]?"=":"").'"'.@$value[$i].'%"'; + } + $dosearch=1; + }#if value + } + # + # do the query (if we had some search term + # + if ($dosearch) { +# warn "QUERY : $query"; + my $result = C4::Search::NZanalyse($query,'authorityserver'); +# warn "result : $result"; + my %result; + foreach (split /;/,$result) { + my ($authid,$title) = split /,/,$_; + # hint : the result is sorted by title.biblionumber because we can have X biblios with the same title + # and we don't want to get only 1 result for each of them !!! + # hint & speed improvement : we can order without reading the record + # so order, and read records only for the requested page ! + $result{$title.$authid}=$authid; + } + # sort the hash and return the same structure as GetRecords (Zebra querying) + my @listresult = (); + my $numbers=0; + if ($sortby eq 'HeadingDsc') { # sort by mainmainentry desc + foreach my $key (sort {$b cmp $a} (keys %result)) { + push @listresult, $result{$key}; +# warn "push..."$#finalresult; + $numbers++; + } + } else { # sort by mainmainentry ASC + foreach my $key (sort (keys %result)) { + push @listresult, $result{$key}; +# warn "push..."$#finalresult; + $numbers++; + } + } + # limit the $results_per_page to result size if it's more + $length = $numbers-$offset if $numbers < ($offset+$length); + # for the requested page, replace authid by the complete record + # speed improvement : avoid reading too much things + my @finalresult; + for (my $counter=$offset;$counter<=$offset+$length-1;$counter++) { +# $finalresult[$counter] = GetAuthority($finalresult[$counter])->as_usmarc; + my $separator=C4::Context->preference('authoritysep'); + my $authrecord =GetAuthority($listresult[$counter]); + my $authid=$listresult[$counter]; + my $summary=BuildSummary($authrecord,$authid,$authtypecode); + my $query_auth_tag = "SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?"; + my $sth = $dbh->prepare($query_auth_tag); + $sth->execute($authtypecode); + my $auth_tag_to_report = $sth->fetchrow; + my %newline; + $newline{used}=CountUsage($authid); + $newline{summary} = $summary; + $newline{authid} = $authid; + $newline{even} = $counter % 2; + push @finalresult, \%newline; + } + return (\@finalresult, $numbers); + } else { + return; + } + } else { + my $query; + my $attr; + # the marclist may contain "mainentry". In this case, search the tag_to_report, that depends on + # the authtypecode. Then, search on $a of this tag_to_report + # also store main entry MARC tag, to extract it at end of search + my $mainentrytag; + ##first set the authtype search and may be multiple authorities + my $n=0; + my @authtypecode; + my @auths=split / /,$authtypecode ; + my @queries; + foreach my $auth (@auths){ + push @queries, " \@attr 1=authtype \@attr 5=100 ".$auth; ##No truncation on authtype + push @authtypecode ,$auth; + $n++; + } + if ($n>1){ + while ($n>1){$query= "\@or ".$query;$n--;} + } + + my $dosearch; + my $and=" \@and " ; + for(my $i = 0 ; $i <= $#{$value} ; $i++) + { + if (@$value[$i]){ + ##If mainentry search $a tag + if (@$tags[$i] eq "mainmainentry") { + + $attr =" \@attr 1=Heading-Main "; +# $attr =" \@attr 1=Heading "; + + }elsif (@$tags[$i] eq "mainentry") { + $attr =" \@attr 1=Heading "; + }else{ + $attr =" \@attr 1=Any "; + } + if (@$operator[$i] eq 'is') { + $attr.=" \@attr 4=1 \@attr 5=100 ";##Phrase, No truncation,all of subfield field must match + }elsif (@$operator[$i] eq "="){ + $attr.=" \@attr 4=107 "; #Number Exact match + }elsif (@$operator[$i] eq "start"){ + $attr.=" \@attr 3=2 \@attr 4=1 \@attr 5=1 ";#Firstinfield Phrase, Right truncated + } else { + $attr .=" \@attr 5=1 \@attr 4=6 ";## Word list, right truncated, anywhere + } + $attr =$attr."\"".@$value[$i]."\""; + push @queries, "$attr"; + $dosearch=1; + }#if value + } + ##Add how many queries generated + my $query; + foreach my $query_part (@queries){ + $query=($query?$and.$query_part.$query:$query_part); + } + ## Adding order + #$query=' @or @attr 7=2 @attr 1=Heading 0 @or @attr 7=1 @attr 1=Heading 1'.$query if ($sortby eq "HeadingDsc"); + my $orderstring= ($sortby eq "HeadingAsc"? + '@attr 7=1 @attr 1=Heading 0' + : + $sortby eq "HeadingDsc"? + '@attr 7=2 @attr 1=Heading 0' + :'' + ); + $query=($dosearch?"\@or $orderstring $query":"\@or ".($query?"$and $query":"")." \@attr 1=_ALLRECORDS \@attr 2=103 '' $orderstring "); + $debug && warn $query; + + $offset=0 unless $offset; + my $counter = $offset; + $length=10 unless $length; + my @oAuth; + my $i; + $oAuth[0]=C4::Context->Zconn("authorityserver" , 1); + my $Anewq= new ZOOM::Query::PQF($query,$oAuth[0]); + my $oAResult; + $oAResult= $oAuth[0]->search($Anewq) ; + while (($i = ZOOM::event(\@oAuth)) != 0) { + my $ev = $oAuth[$i-1]->last_event(); + last if $ev == ZOOM::Event::ZEND; + } + my($error, $errmsg, $addinfo, $diagset) = $oAuth[0]->error_x(); + if ($error) { + warn "oAuth error: $errmsg ($error) $addinfo $diagset\n"; + goto NOLUCK; + } + + my $nbresults; + $nbresults=$oAResult->size(); + my $nremains=$nbresults; + my @result = (); + my @finalresult = (); + + if ($nbresults>0){ + + ##Find authid and linkid fields + ##we may be searching multiple authoritytypes. + ## FIXME this assumes that all authid and linkid fields are the same for all authority types + # my ($authidfield,$authidsubfield)=GetAuthMARCFromKohaField($dbh,"auth_header.authid",$authtypecode[0]); + # my ($linkidfield,$linkidsubfield)=GetAuthMARCFromKohaField($dbh,"auth_header.linkid",$authtypecode[0]); + while (($counter < $nbresults) && ($counter < ($offset + $length))) { + + ##Here we have to extract MARC record and $authid from ZEBRA AUTHORITIES + my $rec=$oAResult->record($counter); + my $marcdata=$rec->raw(); + my $authrecord; + my $separator=C4::Context->preference('authoritysep'); + $authrecord = MARC::File::USMARC::decode($marcdata); + my $authid=$authrecord->field('001')->data(); + my $summary=BuildSummary($authrecord,$authid,$authtypecode); + my $query_auth_tag = "SELECT auth_tag_to_report FROM auth_types WHERE authtypecode=?"; + my $sth = $dbh->prepare($query_auth_tag); + $sth->execute($authtypecode); + my $auth_tag_to_report = $sth->fetchrow; + my $reported_tag; + my $mainentry = $authrecord->field($auth_tag_to_report); + if ($mainentry) { + foreach ($mainentry->subfields()) { + $reported_tag .='$'.$_->[0].$_->[1]; + } + } + my %newline; + $newline{summary} = $summary; + $newline{authid} = $authid; + $newline{even} = $counter % 2; + $newline{reported_tag} = $reported_tag; + $counter++; + push @finalresult, \%newline; + }## while counter + ### + for (my $z=0; $z<@finalresult; $z++){ + my $count=CountUsage($finalresult[$z]{authid}); + $finalresult[$z]{used}=$count; + }# all $z's + + }## if nbresult + NOLUCK: + # $oAResult->destroy(); + # $oAuth[0]->destroy(); + + return (\@finalresult, $nbresults); + } } -my $toggle; - if ($counter % 2) { - $toggle="#ffffcc"; - } else { - $toggle="white"; - } -my %newline; - $newline{'toggle'}=$toggle; - $newline{summary} = $summary; - $newline{authid} = $authid; - $newline{linkid} = $linkid[0]; - $newline{even} = $counter % 2; - $counter++; - push @finalresult, \%newline; - }## while counter +=head2 CountUsage -for (my $z=0; $z<$length; $z++){ - $finalresult[$z]{used}=AUTHcount_usage($finalresult[$z]{authid}); - - }# all $z's +=over 4 +$count= &CountUsage($authid) +counts Usage of Authid in bibliorecords. -}## if nbresult -NOLUCK: -$oAResult->destroy(); -$oAuth[0]->destroy(); +=back + +=cut - return (\@finalresult, $nbresults); +sub CountUsage { + my ($authid) = @_; + if (C4::Context->preference('NoZebra')) { + # Read the index Koha-Auth-Number for this authid and count the lines + my $result = C4::Search::NZanalyse("an=$authid"); + my @tab = split /;/,$result; + return scalar @tab; + } else { + ### ZOOM search here + my $oConnection=C4::Context->Zconn("biblioserver",1); + my $query; + $query= "an=".$authid; + my $oResult = $oConnection->search(new ZOOM::Query::CCL2RPN( $query, $oConnection )); + my $result; + while ((my $i = ZOOM::event([ $oConnection ])) != 0) { + my $ev = $oConnection->last_event(); + if ($ev == ZOOM::Event::ZEND) { + $result = $oResult->size(); + } + } + return ($result); + } } +=head2 CountUsageChildren + +=over 4 + +$count= &CountUsageChildren($authid) +counts Usage of narrower terms of Authid in bibliorecords. +=back + +=cut -sub AUTHcount_usage { - my ($authid) = @_; -### try ZOOM search here -my @oConnection; -$oConnection[0]=C4::Context->Zconn("biblioserver"); -my $query; -my ($attrfield)=MARCfind_attr_from_kohafield("authid"); -$query= $attrfield." ".$authid; - -my $oResult = $oConnection[0]->search_pqf($query); -my $event; -my $i; - while (($i = ZOOM::event(\@oConnection)) != 0) { - $event = $oConnection[$i-1]->last_event(); - last if $event == ZOOM::Event::ZEND; - }# while -my $result=$oResult->size() ; - return ($result); +sub CountUsageChildren { + my ($authid) = @_; } +=head2 GetAuthTypeCode +=over 4 -sub AUTHfind_authtypecode { - my ($dbh,$authid) = @_; - my $sth = $dbh->prepare("select authtypecode from auth_header where authid=?"); - $sth->execute($authid); - my ($authtypecode) = $sth->fetchrow; - return $authtypecode; +$authtypecode= &GetAuthTypeCode($authid) +returns authtypecode of an authid + +=back + +=cut + +sub GetAuthTypeCode { +#AUTHfind_authtypecode + my ($authid) = @_; + my $dbh=C4::Context->dbh; + my $sth = $dbh->prepare("select authtypecode from auth_header where authid=?"); + $sth->execute($authid); + my $authtypecode = $sth->fetchrow; + return $authtypecode; } +=head2 GetTagsLabels + +=over 4 + +$tagslabel= &GetTagsLabels($forlibrarian,$authtypecode) +returns a ref to hashref of authorities tag and subfield structure. + +tagslabel usage : +$tagslabel->{$tag}->{$subfield}->{'attribute'} +where attribute takes values in : + lib + tab + mandatory + repeatable + authorised_value + authtypecode + value_builder + kohafield + seealso + hidden + isurl + link -sub AUTHgettagslib { - my ($dbh,$forlibrarian,$authtypecode)= @_; - $authtypecode="" unless $authtypecode; - my $sth; - my $libfield = ($forlibrarian eq 1)? 'liblibrarian' : 'libopac'; +=back +=cut - # check that authority exists - $sth=$dbh->prepare("select count(*) from auth_tag_structure where authtypecode=?"); - $sth->execute($authtypecode); - my ($total) = $sth->fetchrow; - $authtypecode="" unless ($total >0); - $sth= $dbh->prepare( -"select tagfield,liblibrarian,libopac,mandatory,repeatable from auth_tag_structure where authtypecode=? order by tagfield" +sub GetTagsLabels { + my ($forlibrarian,$authtypecode)= @_; + my $dbh=C4::Context->dbh; + $authtypecode="" unless $authtypecode; + my $sth; + my $libfield = ($forlibrarian eq 1)? 'liblibrarian' : 'libopac'; + + + # check that authority exists + $sth=$dbh->prepare("SELECT count(*) FROM auth_tag_structure WHERE authtypecode=?"); + $sth->execute($authtypecode); + my ($total) = $sth->fetchrow; + $authtypecode="" unless ($total >0); + $sth= $dbh->prepare( +"SELECT auth_tag_structure.tagfield,auth_tag_structure.liblibrarian,auth_tag_structure.libopac,auth_tag_structure.mandatory,auth_tag_structure.repeatable + FROM auth_tag_structure + WHERE authtypecode=? + ORDER BY tagfield" ); -$sth->execute($authtypecode); - my ( $liblibrarian, $libopac, $tag, $res, $tab, $mandatory, $repeatable ); + $sth->execute($authtypecode); + my ( $liblibrarian, $libopac, $tag, $res, $tab, $mandatory, $repeatable ); - while ( ( $tag, $liblibrarian, $libopac, $mandatory, $repeatable ) = $sth->fetchrow ) { + while ( ( $tag, $liblibrarian, $libopac, $mandatory, $repeatable ) = $sth->fetchrow ) { $res->{$tag}->{lib} = ($forlibrarian or !$libopac)?$liblibrarian:$libopac; - $res->{$tab}->{tab} = ""; # XXX + $res->{$tag}->{tab} = " "; # XXX $res->{$tag}->{mandatory} = $mandatory; $res->{$tag}->{repeatable} = $repeatable; - } - $sth= $dbh->prepare("select tagfield,tagsubfield,liblibrarian,libopac,tab, mandatory, repeatable,authorised_value,authtypecode,value_builder,seealso,hidden,isurl,link from auth_subfield_structure where authtypecode=? order by tagfield,tagsubfield" + } + $sth= $dbh->prepare( +"SELECT tagfield,tagsubfield,liblibrarian,libopac,tab, mandatory, repeatable,authorised_value,frameworkcode as authtypecode,value_builder,kohafield,seealso,hidden,isurl +FROM auth_subfield_structure +WHERE authtypecode=? +ORDER BY tagfield,tagsubfield" ); - $sth->execute($authtypecode); + $sth->execute($authtypecode); - my $subfield; + my $subfield; my $authorised_value; - my $authtypecode; my $value_builder; my $kohafield; my $seealso; my $hidden; my $isurl; - my $link; + my $link; while ( ( $tag, $subfield, $liblibrarian, , $libopac, $tab, $mandatory, $repeatable, $authorised_value, $authtypecode, - $value_builder, $seealso, $hidden, - $isurl, $link ) + $value_builder, $kohafield, $seealso, $hidden, + $isurl, $link ) = $sth->fetchrow ) { @@ -299,6 +497,7 @@ $sth->execute($authtypecode); $res->{$tag}->{$subfield}->{authorised_value} = $authorised_value; $res->{$tag}->{$subfield}->{authtypecode} = $authtypecode; $res->{$tag}->{$subfield}->{value_builder} = $value_builder; + $res->{$tag}->{$subfield}->{kohafield} = $kohafield; $res->{$tag}->{$subfield}->{seealso} = $seealso; $res->{$tag}->{$subfield}->{hidden} = $hidden; $res->{$tag}->{$subfield}->{isurl} = $isurl; @@ -307,537 +506,893 @@ $sth->execute($authtypecode); return $res; } -sub AUTHaddauthority { -# pass the XML hash to this function, and it will create the records in the authority table - my ($dbh,$record,$authid,$authtypecode) = @_; +=head2 AddAuthority + +=over 4 + +$authid= &AddAuthority($record, $authid,$authtypecode) +returns authid of the newly created authority + +Either Create Or Modify existing authority. + +=back + +=cut + +sub AddAuthority { +# pass the MARC::Record to this function, and it will create the records in the authority table + my ($record,$authid,$authtypecode) = @_; + my $dbh=C4::Context->dbh; + my $leader=' nz a22 o 4500';#Leader for incomplete MARC21 record + # if authid empty => true add, find a new authid number - if (!$authid) { - my $sth=$dbh->prepare("select max(authid) from auth_header"); - $sth->execute; - ($authid)=$sth->fetchrow; - $authid=$authid+1; - } - -##Modified record may also come here use REPLACE -- bulk import comes here -XML_writeline($record,"authid",$authid,"authorities"); -XML_writeline($record,"authtypecode",$authtypecode,"authorities"); -my $xml=XML_hash2xml($record); - my $sth=$dbh->prepare("REPLACE auth_header set marcxml=?, authid=?,authtypecode=?,datecreated=now()"); - $sth->execute($xml,$authid,$authtypecode); - $sth->finish; - ZEBRAop($dbh,$authid,'specialUpdate',"authorityserver"); -## If the record is linked to another update the linked authorities with new authid -my @linkids=XML_readline_asarray($record,"linkid","authorities"); - foreach my $linkid (@linkids){ - ##Modify the record of linked - AUTHaddlink($dbh,$linkid,$authid); + my $format= 'UNIMARCAUTH' if (uc(C4::Context->preference('marcflavour')) eq 'UNIMARC'); + $format= 'MARC21' if (uc(C4::Context->preference('marcflavour')) ne 'UNIMARC'); + + if ($format eq "MARC21") { + if (!$record->leader) { + $record->leader($leader); + } + if (!$record->field('003')) { + $record->insert_fields_ordered( + MARC::Field->new('003',C4::Context->preference('MARCOrgCode')) + ); + } + my $time=POSIX::strftime("%Y%m%d%H%M%S",localtime); + if (!$record->field('005')) { + $record->insert_fields_ordered( + MARC::Field->new('005',$time.".0") + ); + } + my $date=POSIX::strftime("%y%m%d",localtime); + if (!$record->field('008')) { + $record->insert_fields_ordered( + MARC::Field->new('008',$date."|||a|||||| | ||| d") + ); + } + if (!$record->field('040')) { + $record->insert_fields_ordered( + MARC::Field->new('040','','', + 'a' => C4::Context->preference('MARCOrgCode'), + 'c' => C4::Context->preference('MARCOrgCode') + ) + ); + } } -return ($authid); -} -sub AUTHaddlink{ -my ($dbh,$linkid,$authid)=@_; -my $record=XMLgetauthorityhash($dbh,$linkid); -my $authtypecode=AUTHfind_authtypecode($dbh,$linkid); -#warn "adding l:$linkid,a:$authid,auth:$authtypecode"; -XML_writeline($record,"linkid",$authid,"authorities"); -my $xml=XML_hash2xml($record); -$dbh->do("lock tables header WRITE"); - my $sth=$dbh->prepare("update auth_header set marcxml=? where authid=?"); - $sth->execute($xml,$linkid); - $sth->finish; - $dbh->do("unlock tables"); - ZEBRAop($dbh,$linkid,'specialUpdate',"authorityserver"); + if (($format eq "UNIMARCAUTH") && (!$record->subfield('100','a'))){ + $record->leader(" nx j22 "); + my $date=POSIX::strftime("%Y%m%d",localtime); + if ($record->field('100')){ + $record->field('100')->update('a'=>$date."afrey50 ba0"); + } else { + $record->append_fields( + MARC::Field->new('100',' ',' ' + ,'a'=>$date."afrey50 ba0") + ); + } + } + my ($auth_type_tag, $auth_type_subfield) = get_auth_type_location($authtypecode); + if (!$authid and $format eq "MARC21") { + # only need to do this fix when modifying an existing authority + C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield); + } + if (my $field=$record->field($auth_type_tag)){ + $field->update($auth_type_subfield=>$authtypecode); + } + else { + $record->add_fields($auth_type_tag,'','', $auth_type_subfield=>$authtypecode); + } + + my $auth_exists=0; + my $oldRecord; + if (!$authid) { + my $sth=$dbh->prepare("select max(authid) from auth_header"); + $sth->execute; + ($authid)=$sth->fetchrow; + $authid=$authid+1; + ##Insert the recordID in MARC record + unless ($record->field('001') && $record->field('001')->data() eq $authid){ + $record->delete_field($record->field('001')); + $record->insert_fields_ordered(MARC::Field->new('001',$authid)); + } + } else { + $auth_exists=$dbh->do(qq(select authid from auth_header where authid=?),undef,$authid); +# warn "auth_exists = $auth_exists"; + } + if ($auth_exists>0){ + $oldRecord=GetAuthority($authid); + $record->add_fields('001',$authid) unless ($record->field('001')); +# warn "\n\n\n enregistrement".$record->as_formatted; + my $sth=$dbh->prepare("update auth_header set authtypecode=?,marc=?,marcxml=? where authid=?"); + $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$authid) or die $sth->errstr; + $sth->finish; + } + else { + my $sth=$dbh->prepare("insert into auth_header (authid,datecreated,authtypecode,marc,marcxml) values (?,now(),?,?,?)"); + $sth->execute($authid,$authtypecode,$record->as_usmarc,$record->as_xml_record($format)); + $sth->finish; + } + ModZebra($authid,'specialUpdate',"authorityserver",$oldRecord,$record); + return ($authid); } +=head2 DelAuthority + +=over 4 + +$authid= &DelAuthority($authid) +Deletes $authid + +=back + +=cut + + +sub DelAuthority { + my ($authid) = @_; + my $dbh=C4::Context->dbh; + + ModZebra($authid,"recordDelete","authorityserver",GetAuthority($authid),undef); + $dbh->do("delete from auth_header where authid=$authid") ; -sub XMLgetauthority { - # Returns MARC::XML of the authority passed in parameter. - my ( $dbh, $authid ) = @_; - my $sth = $dbh->prepare("select marcxml from auth_header where authid=? " ); - $sth->execute($authid); - my ($marcxml)=$sth->fetchrow; - $marcxml=Encode::decode('utf8',$marcxml); - return ($marcxml); } -sub XMLgetauthorityhash { -## Utility to return hashed MARCXML -my ($dbh,$authid)=@_; -my $xml=XMLgetauthority($dbh,$authid); -my $xmlhash=XML_xml2hash_onerecord($xml); -return $xmlhash; +sub ModAuthority { + my ($authid,$record,$authtypecode,$merge)=@_; + 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') ){ + &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; + } + return $authid; } +=head2 GetAuthorityXML + +=over 4 + +$marcxml= &GetAuthorityXML( $authid) +returns xml form of record $authid +=back +=cut -sub AUTHgetauth_type { - my ($authtypecode) = @_; - my $dbh=C4::Context->dbh; - my $sth=$dbh->prepare("select * from auth_types where authtypecode=?"); - $sth->execute($authtypecode); - return $sth->fetchrow_hashref; +sub GetAuthorityXML { + # Returns MARC::XML of the authority passed in parameter. + my ( $authid ) = @_; + if (uc(C4::Context->preference('marcflavour')) eq 'UNIMARC') { + my $dbh=C4::Context->dbh; + my $sth = $dbh->prepare("select marcxml from auth_header where authid=? " ); + $sth->execute($authid); + my ($marcxml)=$sth->fetchrow; + return $marcxml; + } + else { + # for MARC21, call GetAuthority instead of + # getting the XML directly since we may + # need to fix up the location of the authority + # code -- note that this is reasonably safe + # because GetAuthorityXML is used only by the + # indexing processes like zebraqueue_start.pl + my $record = GetAuthority($authid); + return $record->as_xml_record('MARC21'); + } } +=head2 GetAuthority -sub AUTHmodauthority { -## $record is expected to be an xmlhash - my ($dbh,$authid,$record,$authtypecode)=@_; - my ($oldrecord)=&XMLgetauthorityhash($dbh,$authid); -### This equality is very dodgy ,It porobaby wont work - if ($oldrecord eq $record) { - return $authid; - } -## -my $sth=$dbh->prepare("update auth_header set marcxml=? where authid=?"); -# find if linked records exist and delete the link in them -my @linkids=XML_readline_asarray($oldrecord,"linkid","authorities"); - - foreach my $linkid (@linkids){ - ##Modify the record of linked - my $linkrecord=XMLgetauthorityhash($dbh,$linkid); - my $linktypecode=AUTHfind_authtypecode($dbh,$linkid); - my @linkfields=XML_readline_asarray($linkrecord,"linkid","authorities"); - my $updated; - foreach my $linkfield (@linkfields){ - if ($linkfield eq $authid){ - XML_writeline_id($linkrecord,"linkid",$linkfield,"","authorities"); - $updated=1; - } - }#foreach linkfield - my $linkedxml=XML_hash2xml($linkrecord); - if ($updated==1){ - $sth->execute($linkedxml,$linkid); - ZEBRAop($dbh,$linkid,'specialUpdate',"authorityserver"); - } - - }#foreach linkid - -#Now rewrite the $record to table with an add -$authid=AUTHaddauthority($dbh,$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.pl -### they should have a system preference "dontmerge=1" otherwise by default biblios will be updated +=over 4 + +$record= &GetAuthority( $authid) +Returns MARC::Record of the authority passed in parameter. + +=back + +=cut -if (C4::Context->preference('dontmerge') ){ -# save the file in localfile/modified_authorities - my $cgidir = C4::Context->intranetdir ."/cgi-bin"; - unless (opendir(DIR, "$cgidir")) { - $cgidir = C4::Context->intranetdir."/"; - } - - my $filename = $cgidir."/localfile/modified_authorities/$authid.authid"; - open AUTH, "> $filename"; - print AUTH $authid; - close AUTH; -}else{ - &merge($dbh,$authid,$record,$authid,$record); +sub GetAuthority { + my ($authid)=@_; + my $dbh=C4::Context->dbh; + my $sth=$dbh->prepare("select authtypecode, marcxml from auth_header where authid=?"); + $sth->execute($authid); + my ($authtypecode, $marcxml) = $sth->fetchrow; + my $record=eval {MARC::Record->new_from_xml(StripNonXmlChars($marcxml),'UTF-8', + (C4::Context->preference("marcflavour") eq "UNIMARC"?"UNIMARCAUTH":C4::Context->preference("marcflavour")))}; + return undef if ($@); + $record->encoding('UTF-8'); + if (C4::Context->preference("marcflavour") eq "MARC21") { + my ($auth_type_tag, $auth_type_subfield) = get_auth_type_location($authtypecode); + C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield); + } + return ($record); } -return $authid; + +=head2 GetAuthType + +=over 4 + +$result = &GetAuthType($authtypecode) + +=back + +If the authority type specified by C<$authtypecode> exists, +returns a hashref of the type's fields. If the type +does not exist, returns undef. + +=cut + +sub GetAuthType { + my ($authtypecode) = @_; + my $dbh=C4::Context->dbh; + my $sth; + if (defined $authtypecode){ # NOTE - in MARC21 framework, '' is a valid authority + # type (FIXME but why?) + $sth=$dbh->prepare("select * from auth_types where authtypecode=?"); + $sth->execute($authtypecode); + if (my $res = $sth->fetchrow_hashref) { + return $res; + } + } + return; } -sub AUTHdelauthority { - my ($dbh,$authid,$keep_biblio) = @_; -# if the keep_biblio is set to 1, then authority entries in biblio are preserved. -# FIXME : delete or not in biblio tables (depending on $keep_biblio flag) is not implemented -ZEBRAop($dbh,$authid,"recordDelete","authorityserver"); +sub AUTHhtml2marc { + my ($rtags,$rsubfields,$rvalues,%indicators) = @_; + my $dbh=C4::Context->dbh; + my $prevtag = -1; + my $record = MARC::Record->new(); +#---- TODO : the leader is missing + +# my %subfieldlist=(); + my $prevvalue; # if tag <10 + my $field; # if tag >=10 + for (my $i=0; $i< @$rtags; $i++) { + # rebuild MARC::Record + if (@$rtags[$i] ne $prevtag) { + if ($prevtag < 10) { + if ($prevvalue) { + $record->add_fields((sprintf "%03s",$prevtag),$prevvalue); + } + } else { + if ($field) { + $record->add_fields($field); + } + } + $indicators{@$rtags[$i]}.=' '; + if (@$rtags[$i] <10) { + $prevvalue= @$rvalues[$i]; + undef $field; + } else { + undef $prevvalue; + $field = MARC::Field->new( (sprintf "%03s",@$rtags[$i]), substr($indicators{@$rtags[$i]},0,1),substr($indicators{@$rtags[$i]},1,1), @$rsubfields[$i] => @$rvalues[$i]); + } + $prevtag = @$rtags[$i]; + } else { + if (@$rtags[$i] <10) { + $prevvalue=@$rvalues[$i]; + } else { + if (length(@$rvalues[$i])>0) { + $field->add_subfields(@$rsubfields[$i] => @$rvalues[$i]); + } + } + $prevtag= @$rtags[$i]; + } + } + # the last has not been included inside the loop... do it now ! + $record->add_fields($field) if $field; + return $record; } -sub ZEBRAdelauthority { -my ($dbh,$authid)=@_; - $dbh->do("delete from auth_header where authid=$authid") ; +=head2 FindDuplicateAuthority + +=over 4 + +$record= &FindDuplicateAuthority( $record, $authtypecode) +return $authid,Summary if duplicate is found. + +Comments : an improvement would be to return All the records that match. + +=back + +=cut + +sub FindDuplicateAuthority { + + my ($record,$authtypecode)=@_; +# warn "IN for ".$record->as_formatted; + my $dbh = C4::Context->dbh; +# warn "".$record->as_formatted; + my $sth = $dbh->prepare("select auth_tag_to_report from auth_types where authtypecode=?"); + $sth->execute($authtypecode); + my ($auth_tag_to_report) = $sth->fetchrow; + $sth->finish; +# warn "record :".$record->as_formatted." auth_tag_to_report :$auth_tag_to_report"; + # build a request for SearchAuthorities + my $query='at='.$authtypecode.' '; + my $filtervalues=qr([\001-\040\!\'\"\`\#\$\%\&\*\+,\-\./:;<=>\?\@\(\)\{\[\]\}_\|\~]); + if ($record->field($auth_tag_to_report)) { + foreach ($record->field($auth_tag_to_report)->subfields()) { + $_->[1]=~s/$filtervalues/ /g; $query.= " and he,wrdl=\"".$_->[1]."\"" if ($_->[0]=~/[A-z]/); + } + } + my ($error, $results, $total_hits)=SimpleSearch( $query, 0, 1, [ "authorityserver" ] ); + # there is at least 1 result => return the 1st one + if (@$results>0) { + my $marcrecord = MARC::File::USMARC::decode($results->[0]); + return $marcrecord->field('001')->data,BuildSummary($marcrecord,$marcrecord->field('001')->data,$authtypecode); + } + # no result, returns nothing + return; } -sub AUTHfind_authtypecode { - my ($dbh,$authid) = @_; - my $sth = $dbh->prepare("select authtypecode from auth_header where authid=?"); - $sth->execute($authid); - my ($authtypecode) = $sth->fetchrow; - return $authtypecode; +=head2 BuildSummary + +=over 4 + +$text= &BuildSummary( $record, $authid, $authtypecode) +return HTML encoded Summary + +Comment : authtypecode can be infered from both record and authid. +Moreover, authid can also be inferred from $record. +Would it be interesting to delete those things. + +=back + +=cut + +sub BuildSummary{ +## give this a Marc record to return summary + my ($record,$authid,$authtypecode)=@_; + my $dbh=C4::Context->dbh; + my $summary; + # handle $authtypecode is NULL or eq "" + if ($authtypecode) { + my $authref = GetAuthType($authtypecode); + $summary = $authref->{summary}; + } + # FIXME: should use I18N.pm + my %language; + $language{'fre'}="Français"; + $language{'eng'}="Anglais"; + $language{'ger'}="Allemand"; + $language{'ita'}="Italien"; + $language{'spa'}="Espagnol"; + my %thesaurus; + $thesaurus{'1'}="Peuples"; + $thesaurus{'2'}="Anthroponymes"; + $thesaurus{'3'}="Oeuvres"; + $thesaurus{'4'}="Chronologie"; + $thesaurus{'5'}="Lieux"; + $thesaurus{'6'}="Sujets"; + #thesaurus a remplir + my @fields = $record->fields(); + my $reported_tag; + # if the library has a summary defined, use it. Otherwise, build a standard one + # FIXME - it appears that the summary field in the authority frameworks + # can work as a display template. However, this doesn't + # suit the MARC21 version, so for now the "templating" + # feature will be enabled only for UNIMARC for backwards + # compatibility. + if ($summary and C4::Context->preference('marcflavour') eq 'UNIMARC') { + my @fields = $record->fields(); + # $reported_tag = '$9'.$result[$counter]; + foreach my $field (@fields) { + my $tag = $field->tag(); + my $tagvalue = $field->as_string(); + $summary =~ s/\[(.?.?.?.?)$tag\*(.*?)]/$1$tagvalue$2\[$1$tag$2]/g; + if ($tag<10) { + if ($tag eq '001') { + $reported_tag.='$3'.$field->data(); + } + } else { + my @subf = $field->subfields; + for my $i (0..$#subf) { + my $subfieldcode = $subf[$i][0]; + my $subfieldvalue = $subf[$i][1]; + my $tagsubf = $tag.$subfieldcode; + $summary =~ s/\[(.?.?.?.?)$tagsubf(.*?)]/$1$subfieldvalue$2\[$1$tagsubf$2]/g; + } + } + } + $summary =~ s/\[(.*?)]//g; + $summary =~ s/\n/
/g; + } else { + my $heading; + my $authid; + my $altheading; + my $seealso; + my $broaderterms; + my $narrowerterms; + my $see; + my $seeheading; + my $notes; + my @fields = $record->fields(); + if (C4::Context->preference('marcflavour') eq 'UNIMARC') { + # construct UNIMARC summary, that is quite different from MARC21 one + # accepted form + foreach my $field ($record->field('2..')) { + $heading.= $field->subfield('a'); + $authid=$field->subfield('3'); + } + # rejected form(s) + foreach my $field ($record->field('3..')) { + $notes.= ''.$field->subfield('a')."\n"; + } + foreach my $field ($record->field('4..')) { + if ($field->subfield('2')) { + my $thesaurus = "thes. : ".$thesaurus{"$field->subfield('2')"}." : "; + $see.= ''.$thesaurus.$field->subfield('a')." -- \n"; + } + } + # see : + foreach my $field ($record->field('5..')) { + + if (($field->subfield('5')) && ($field->subfield('a')) && ($field->subfield('5') eq 'g')) { + $broaderterms.= ' '.$field->subfield('a')." -- \n"; + } elsif (($field->subfield('5')) && ($field->subfield('a')) && ($field->subfield('5') eq 'h')){ + $narrowerterms.= ''.$field->subfield('a')." -- \n"; + } elsif ($field->subfield('a')) { + $seealso.= ''.$field->subfield('a')." -- \n"; + } + } + # // form + foreach my $field ($record->field('7..')) { + my $lang = substr($field->subfield('8'),3,3); + $seeheading.= ' En '.$language{$lang}.' : '.$field->subfield('a')."
\n"; + } + $broaderterms =~s/-- \n$//; + $narrowerterms =~s/-- \n$//; + $seealso =~s/-- \n$//; + $see =~s/-- \n$//; + $summary = "".$heading."
".($notes?"$notes
":""); + $summary.= '

TG : '.$broaderterms.'

' if ($broaderterms); + $summary.= '

TS : '.$narrowerterms.'

' if ($narrowerterms); + $summary.= '

TA : '.$seealso.'

' if ($seealso); + $summary.= '

EP : '.$see.'

' if ($see); + $summary.= '

'.$seeheading.'

' if ($seeheading); + } else { + # construct MARC21 summary + # FIXME - looping over 1XX is questionable + # since MARC21 authority should have only one 1XX + foreach my $field ($record->field('1..')) { + next if "152" eq $field->tag(); # FIXME - 152 is not a good tag to use + # in MARC21 -- purely local tags really ought to be + # 9XX + if ($record->field('100')) { + $heading.= $field->as_string('abcdefghjklmnopqrstvxyz68'); + } elsif ($record->field('110')) { + $heading.= $field->as_string('abcdefghklmnoprstvxyz68'); + } elsif ($record->field('111')) { + $heading.= $field->as_string('acdefghklnpqstvxyz68'); + } elsif ($record->field('130')) { + $heading.= $field->as_string('adfghklmnoprstvxyz68'); + } elsif ($record->field('148')) { + $heading.= $field->as_string('abvxyz68'); + } elsif ($record->field('150')) { + # $heading.= $field->as_string('abvxyz68'); + $heading.= $field->as_formatted(); + my $tag=$field->tag(); + $heading=~s /^$tag//g; + $heading =~s /\_/\$/g; + } elsif ($record->field('151')) { + $heading.= $field->as_string('avxyz68'); + } elsif ($record->field('155')) { + $heading.= $field->as_string('abvxyz68'); + } elsif ($record->field('180')) { + $heading.= $field->as_string('vxyz68'); + } elsif ($record->field('181')) { + $heading.= $field->as_string('vxyz68'); + } elsif ($record->field('182')) { + $heading.= $field->as_string('vxyz68'); + } elsif ($record->field('185')) { + $heading.= $field->as_string('vxyz68'); + } else { + $heading.= $field->as_string(); + } + } #See From + foreach my $field ($record->field('4..')) { + $seeheading.= "
      used for/see from: ".$field->as_string(); + } #See Also + foreach my $field ($record->field('5..')) { + $altheading.= "
      see also: ".$field->as_string(); + } + $summary .= ": " if $summary; + $summary.=$heading.$seeheading.$altheading; + } + } + return $summary; } +=head2 BuildUnimarcHierarchies -sub FindDuplicateauth { -### Should receive an xmlhash - my ($record,$authtypecode)=@_; - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("select auth_tag_to_report from auth_types where authtypecode=?"); - $sth->execute($authtypecode); - my ($auth_tag_to_report) = $sth->fetchrow; - $sth->finish; - # build a request for authoritysearch - my (@tags, @and_or, @excluding, @operator, @value, $offset, $length); - -# if ($record->field($auth_tag_to_report)) { - push @tags, $auth_tag_to_report; - push @operator, "all"; - @value, XML_readline_asarray($record,"","",$auth_tag_to_report); -# } - - my ($finalresult,$nbresult) = authoritysearch($dbh,\@tags,\@and_or,\@excluding,\@operator,\@value,0,10,$authtypecode); - # there is at least 1 result => return the 1st one - if ($nbresult>0) { - return @$finalresult[0]->{authid},@$finalresult[0]->{summary}; - } - # no result, returns nothing - return; +=over 4 + +$text= &BuildUnimarcHierarchies( $authid, $force) +return text containing trees for hierarchies +for them to be stored in auth_header + +Example of text: +122,1314,2452;1324,2342,3,2452 + +=back + +=cut + +sub BuildUnimarcHierarchies{ + my $authid = shift @_; +# warn "authid : $authid"; + my $force = shift @_; + my @globalresult; + my $dbh=C4::Context->dbh; + my $hierarchies; + my $data = GetHeaderAuthority($authid); + if ($data->{'authtrees'} and not $force){ + return $data->{'authtrees'}; + } elsif ($data->{'authtrees'}){ + $hierarchies=$data->{'authtrees'}; + } else { + my $record = GetAuthority($authid); + my $found; + foreach my $field ($record->field('550')){ + if ($field->subfield('5') && $field->subfield('5') eq 'g'){ + my $parentrecord = GetAuthority($field->subfield('3')); + my $localresult=$hierarchies; + my $trees; + $trees = BuildUnimarcHierarchies($field->subfield('3')); + my @trees; + if ($trees=~/;/){ + @trees = split(/;/,$trees); + } else { + push @trees, $trees; + } + foreach (@trees){ + $_.= ",$authid"; + } + @globalresult = (@globalresult,@trees); + $found=1; + } + $hierarchies=join(";",@globalresult); + } + #Unless there is no ancestor, I am alone. + $hierarchies="$authid" unless ($hierarchies); + } + AddAuthorityTrees($authid,$hierarchies); + return $hierarchies; } -sub getsummary{ -## give this an XMLhash record to return summary -my ($dbh,$record,$authid,$authtypecode)=@_; - my $authref = getauthtype($authtypecode); - my $summary = $authref->{summary}; - # if the library has a summary defined, use it. Otherwise, build a standard one - if ($summary) { - my $fields = $record->{'datafield'}; - foreach my $field (@$fields) { - my $tag = $field->{'tag'}; - if ($tag<10) { - my $tagvalue = XML_readline_onerecord($record,"","",$field->{tag}); - $summary =~ s/\[(.?.?.?.?)$tag\*(.*?)]/$1$tagvalue$2\[$1$tag$2]/g; - } else { - my @subf = XML_readline_withtags($record,"","",$tag); - for my $i (0..$#subf) { - my $subfieldcode = $subf[$i][0]; - my $subfieldvalue = $subf[$i][1]; - my $tagsubf = $tag.$subfieldcode; - $summary =~ s/\[(.?.?.?.?)$tagsubf(.*?)]/$1$subfieldvalue$2\[$1$tagsubf$2]/g; - }## each subf - }#tag >10 - }##each field - $summary =~ s/\[(.*?)]//g; - $summary =~ s/\n/
/g; - } else { -## $summary did not exist create a standard summary - my $heading; # = $authref->{summary}; - my $altheading; - my $seeheading; - my $see; - my $fields = $record->{datafield}; - if (C4::Context->preference('marcflavour') eq 'UNIMARC') { - # construct UNIMARC summary, that is quite different from MARC21 one - foreach my $field (@$fields) { - # accepted form - if ($field->{tag} = ~/'2..'/) { - foreach my $subfield ("a".."z"){ - ## Fixme-- if UNICODE uses numeric subfields as well add them - $heading.=XML_readline_onerecord($record,"","",$field->{tag},$subfield); - } - }##tag 2.. - # rejected form(s) - if ($field->{tag} = ~/'4..'/) { - my $value; - foreach my $subfield ("a".."z"){ - ## Fixme-- if UNICODE uses numeric subfields as well add them - $value.=XML_readline_onerecord($record,"","",$field->{tag},$subfield); - } - $summary.= "   ".$value."
"; - $summary.= "      see: ".$heading."
"; - }##tag 4.. - # see : - if ($field->{tag} = ~/'5..'/) { - my $value; - foreach my $subfield ("a".."z"){ - ## Fixme-- if UNICODE uses numeric subfields as well add them - $value.=XML_readline_onerecord($record,"","",$field->{tag},$subfield); - } - $summary.= "   ".$value."
"; - $summary.= "      see: ".$heading."
"; - }# tag 5.. - # // form - if ($field->{tag} = ~/'7..'/) { - my $value; - foreach my $subfield ("a".."z"){ - ## Fixme-- if UNICODE uses numeric subfields as well add them - $value.=XML_readline_onerecord($record,"","",$field->{tag},$subfield); - } - $seeheading.= "      see also: ".$value."
"; - $altheading.= "   ".$value."
"; - $altheading.= "      see also: ".$heading."
"; - }# tag 7.. - }## Foreach fields - $summary = "".$heading."
".$seeheading.$altheading.$summary; - } else { - # construct MARC21 summary - foreach my $field (@$fields) { - my $tag="1.."; - if($field->{tag} =~ /^$tag/) { - if ($field->{tag} eq '150') { - my $value; - foreach my $subfield ("a".."z"){ - $value=XML_readline_onerecord($record,"","","150",$subfield); - $heading.="\$".$subfield.$value if $value; - } - }else{ - foreach my $subfield ("a".."z"){ - $heading.=XML_readline_onerecord($record,"","",$field->{tag},$subfield); - } - }### tag 150 or else - }##tag 1.. - my $tag="4.."; - if($field->{tag} =~ /^$tag/) { - foreach my $subfield ("a".."z"){ - $seeheading.=XML_readline_onerecord($record,"","",$field->{tag},$subfield); - } - $seeheading.= "   ".$seeheading."
"; - $seeheading.= "      see: ".$seeheading."
"; - } #tag 4.. - my $tag="5.."; - if($field->{tag} =~ /^$tag/) { - my $value; - foreach my $subfield ("a".."z"){ - $value.=XML_readline_onerecord($record,"","",$field->{tag},$subfield); - } - $seeheading.= "      see also: ".$value."
"; - $altheading.= "   ".$value."
"; - $altheading.= "      see also: ".$altheading."
"; - }#tag 5.. - - }##for each field - $summary.=$heading.$seeheading.$altheading; - }##USMARC vs UNIMARC - }###Summary exists or not -return $summary; +=head2 BuildUnimarcHierarchy + +=over 4 + +$ref= &BuildUnimarcHierarchy( $record, $class,$authid) +return a hashref in order to display hierarchy for record and final Authid $authid + +"loopparents" +"loopchildren" +"class" +"loopauthid" +"current_value" +"value" + +"ifparents" +"ifchildren" +Those two latest ones should disappear soon. + +=back + +=cut + +sub BuildUnimarcHierarchy{ + my $record = shift @_; + my $class = shift @_; + my $authid_constructed = shift @_; + my $authid=$record->field('001')->data(); + my %cell; + my $parents=""; my $children=""; + my (@loopparents,@loopchildren); + foreach my $field ($record->field('550')){ + if ($field->subfield('5') && $field->subfield('a')){ + if ($field->subfield('5') eq 'h'){ + push @loopchildren, { "childauthid"=>$field->subfield('3'),"childvalue"=>$field->subfield('a')}; + }elsif ($field->subfield('5') eq 'g'){ + push @loopparents, { "parentauthid"=>$field->subfield('3'),"parentvalue"=>$field->subfield('a')}; + } + # brothers could get in there with an else + } + } + $cell{"ifparents"}=1 if (scalar(@loopparents)>0); + $cell{"ifchildren"}=1 if (scalar(@loopchildren)>0); + $cell{"loopparents"}=\@loopparents if (scalar(@loopparents)>0); + $cell{"loopchildren"}=\@loopchildren if (scalar(@loopchildren)>0); + $cell{"class"}=$class; + $cell{"loopauthid"}=$authid; + $cell{"current_value"} =1 if $authid eq $authid_constructed; + $cell{"value"}=$record->subfield('2..',"a"); + return \%cell; } -sub getdictsummary{ -## give this a XML record to return a brief summary -my ($dbh,$record,$authid,$authtypecode)=@_; - my $authref = getauthtype($authtypecode); - my $summary = $authref->{summary}; - my $fields = $record->{'datafield'}; - # if the library has a summary defined, use it. Otherwise, build a standard one - if ($summary) { - foreach my $field (@$fields) { - my $tag = $field->{'tag'}; - if ($tag<10) { - my $tagvalue = XML_readline_onerecord($record,"","",$field->{tag}); - $summary =~ s/\[(.?.?.?.?)$tag\*(.*?)]/$1$tagvalue$2\[$1$tag$2]/g; - } else { - my @subf = XML_readline_withtags($record,"","",$tag); - for my $i (0..$#subf) { - my $subfieldcode = $subf[$i][0]; - my $subfieldvalue = $subf[$i][1]; - my $tagsubf = $tag.$subfieldcode; - $summary =~ s/\[(.?.?.?.?)$tagsubf(.*?)]/$1$subfieldvalue$2\[$1$tagsubf$2]/g; - }## each subf - }#tag >10 - }##each field - $summary =~ s/\[(.*?)]//g; - $summary =~ s/\n/
/g; - } else { - my $heading; # = $authref->{summary}; - my $altheading; - my $seeheading; - my $see; - my @fields = $record->{datafields}; - if (C4::Context->preference('marcflavour') eq 'UNIMARC') { - # construct UNIMARC summary, that is quite different from MARC21 one - foreach my $field (@$fields) { - # accepted form - if ($field->{tag} = ~/'2..'/) { - foreach my $subfield ("a".."z"){ - ## Fixme-- if UNICODE uses numeric subfields as well add them - $heading.=XML_readline_onerecord($record,"","",$field->{tag},$subfield); - } - }##tag 2.. - } - $summary = $heading; - } else { - # construct MARC21 summary - foreach my $field (@fields) { - if ($field->{tag}=~/'1..'/){ - $heading.= XML_readline_onerecord($record,"","",$field->{tag},"a"); - } - } #each fieldd - - $summary=$heading; - }# USMARC vs UNIMARC - }### Summary exists -return $summary; + +=head2 GetHeaderAuthority + +=over 4 + +$ref= &GetHeaderAuthority( $authid) +return a hashref in order auth_header table data + +=back + +=cut + +sub GetHeaderAuthority{ + my $authid = shift @_; + my $sql= "SELECT * from auth_header WHERE authid = ?"; + my $dbh=C4::Context->dbh; + my $rq= $dbh->prepare($sql); + $rq->execute($authid); + my $data= $rq->fetchrow_hashref; + return $data; } +=head2 AddAuthorityTrees -sub merge { -##mergefrom is authid MARCfrom is marcxml hash of authority -### mergeto ditto - my ($dbh,$mergefrom,$MARCfrom,$mergeto,$MARCto) = @_; - return unless (defined $MARCfrom); - return unless (defined $MARCto); - my $authtypecodefrom = AUTHfind_authtypecode($dbh,$mergefrom); - my $authtypecodeto = AUTHfind_authtypecode($dbh,$mergeto); - # return if authority does not exist - - # 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; - # search all biblio tags using this authority. - $sth = $dbh->prepare("select distinct tagfield from biblios_subfield_structure where authtypecode=? "); - $sth->execute($authtypecodefrom); -my @tags_using_authtype; - while (my ($tagfield) = $sth->fetchrow) { - push @tags_using_authtype,$tagfield ; - } -## The subfield for linking authorities is stored in koha_attr named auth_biblio_link_subf -## This way we may use whichever subfield we want without harcoding 9 in -my ($dummyfield,$tagsubfield)=MARCfind_marc_from_kohafield("auth_biblio_link_subf","biblios"); - # now, find every biblio using this authority -### try ZOOM search here -my @oConnection; - $oConnection[0]=C4::Context->Zconn("biblioserver"); -##$oConnection[0]->option(elementSetName=>"biblios"); ## Needs a fix -my $query; -my ($attr2)=MARCfind_attr_from_kohafield("authid"); -my $attrfield.=$attr2; -$query= $attrfield." ".$mergefrom; -my ($event,$i); -my $oResult = $oConnection[0]->search_pqf($query); - while (($i = ZOOM::event(\@oConnection)) != 0) { - $event = $oConnection[$i-1]->last_event(); - last if $event == ZOOM::Event::ZEND; - }# while event -my $count=$oResult->size(); -my @reccache; -my $z=0; -while ( $z<$count ) { -my $rec; - $rec=$oResult->record($z); - my $marcdata = $rec->raw(); -my $koharecord=Encode::decode("utf8",$marcdata); -$koharecord=XML_xml2hash($koharecord); - my ( $xmlrecord, @itemsrecord) = XML_separate($koharecord); - -push @reccache, $xmlrecord; -$z++; +=over 4 + +$ref= &AddAuthorityTrees( $authid, $trees) +return success or failure + +=back + +=cut + +sub AddAuthorityTrees{ + my $authid = shift @_; + my $trees = shift @_; + my $sql= "UPDATE IGNORE auth_header set authtrees=? WHERE authid = ?"; + my $dbh=C4::Context->dbh; + my $rq= $dbh->prepare($sql); + return $rq->execute($trees,$authid); } -$oResult->destroy(); -$oConnection[0]->destroy(); - foreach my $xmlhash (@reccache){ - my $update; - foreach my $tagfield (@tags_using_authtype){ - - ###Change the authid in biblio - $xmlhash=XML_writeline_id($xmlhash,$mergefrom,$mergeto,$tagfield,$tagsubfield); - ### delete all subfields of bibliorecord - $xmlhash=XML_delete_withid($xmlhash,$mergeto,$tagfield,$tagsubfield); - ####Read all the data in from authrecord - my @record_to=XML_readline_withtags($MARCto,"","",$auth_tag_to_report); - ##Write the data to biblio - foreach my $subfield (@record_to) { - ## Replace the data in MARCXML with the new matching authid - XML_writeline_withid($xmlhash,$tagsubfield,$mergeto,$subfield->[1],$tagfield,$subfield->[0]); - $update=1; - }#foreach $subfield - }#foreach tagfield - if ($update==1){ - my $biblionumber=XML_readline_onerecord($xmlhash,"biblionumber","biblios"); - my $frameworkcode=MARCfind_frameworkcode($dbh,$biblionumber); - NEWmodbiblio($dbh,$biblionumber,$xmlhash,$frameworkcode) ; - } - - }#foreach $xmlhash + +=head2 merge + +=over 4 + +$ref= &merge(mergefrom,$MARCfrom,$mergeto,$MARCto) + + +Could add some feature : Migrating from a typecode to an other for instance. +Then we should add some new parameter : bibliotargettag, authtargettag + +=back + +=cut + +sub merge { + my ($mergefrom,$MARCfrom,$mergeto,$MARCto) = @_; + my ($counteditedbiblio,$countunmodifiedbiblio,$counterrors)=(0,0,0); + my $dbh=C4::Context->dbh; + my $authtypecodefrom = GetAuthTypeCode($mergefrom); + my $authtypecodeto = GetAuthTypeCode($mergeto); +# warn "mergefrom : $authtypecodefrom $mergefrom mergeto : $authtypecodeto $mergeto "; + # return if authority does not exist + return "error MARCFROM not a marcrecord ".Data::Dumper::Dumper($MARCfrom) if scalar($MARCfrom->fields()) == 0; + return "error MARCTO not a marcrecord".Data::Dumper::Dumper($MARCto) if scalar($MARCto->fields()) == 0; + # 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_from) = $sth->fetchrow; + $sth->execute($authtypecodeto); + my ($auth_tag_to_report_to) = $sth->fetchrow; + + my @record_to; + @record_to = $MARCto->field($auth_tag_to_report_to)->subfields() if $MARCto->field($auth_tag_to_report_to); + my @record_from; + @record_from = $MARCfrom->field($auth_tag_to_report_from)->subfields() if $MARCfrom->field($auth_tag_to_report_from); + + my @reccache; + # search all biblio tags using this authority. + #Getting marcbiblios impacted by the change. + if (C4::Context->preference('NoZebra')) { + #nozebra way + my $dbh=C4::Context->dbh; + my $rq=$dbh->prepare(qq(SELECT biblionumbers from nozebra where indexname="an" and server="biblioserver" and value="$mergefrom" )); + $rq->execute; + while (my $biblionumbers=$rq->fetchrow){ + my @biblionumbers=split /;/,$biblionumbers; + foreach (@biblionumbers) { + if ($_=~/(\d+),.*/) { + my $marc=GetMarcBiblio($1); + push @reccache,$marc; + } + } + } + } else { + #zebra connection + my $oConnection=C4::Context->Zconn("biblioserver",0); + $oConnection->option("preferredRecordSyntax"=>"XML"); + my $query; + $query= "an=".$mergefrom; + my $oResult = $oConnection->search(new ZOOM::Query::CCL2RPN( $query, $oConnection )); + my $count = 0; + if ($oResult) { + $count=$oResult->size(); + } + my $z=0; + while ( $z<$count ) { + my $rec; + $rec=$oResult->record($z); + my $marcdata = $rec->raw(); + push @reccache, $marcdata; + $z++; + } + $oConnection->destroy(); + } + #warn scalar(@reccache)." biblios to update"; + # Get All candidate Tags for the change + # (This will reduce the search scope in marc records). + $sth = $dbh->prepare("select distinct tagfield from marc_subfield_structure where authtypecode=?"); + $sth->execute($authtypecodefrom); + my @tags_using_authtype; + while (my ($tagfield) = $sth->fetchrow) { + push @tags_using_authtype,$tagfield ; + } + my $tag_to=0; + if ($authtypecodeto ne $authtypecodefrom){ + # If many tags, take the first + $sth->execute($authtypecodeto); + $tag_to=$sth->fetchrow; + #warn $tag_to; + } + # BulkEdit marc records + # May be used as a template for a bulkedit field + foreach my $marcrecord(@reccache){ + my $update; + $marcrecord= MARC::Record->new_from_xml($marcrecord,"utf8",C4::Context->preference("marcflavour")) unless(C4::Context->preference('NoZebra')); + foreach my $tagfield (@tags_using_authtype){ +# warn "tagfield : $tagfield "; + foreach my $field ($marcrecord->field($tagfield)){ + my $auth_number=$field->subfield("9"); + my $tag=$field->tag(); + if ($auth_number==$mergefrom) { + my $field_to=MARC::Field->new(($tag_to?$tag_to:$tag),$field->indicator(1),$field->indicator(2),"9"=>$mergeto); + foreach my $subfield (@record_to) { + $field_to->add_subfields($subfield->[0] =>$subfield->[1]); + } + $marcrecord->delete_field($field); + $marcrecord->insert_grouped_field($field_to); + $update=1; + } + }#for each tag + }#foreach tagfield + my ($bibliotag,$bibliosubf) = GetMarcFromKohaField("biblio.biblionumber","") ; + my $biblionumber; + if ($bibliotag<10){ + $biblionumber=$marcrecord->field($bibliotag)->data; + } + else { + $biblionumber=$marcrecord->subfield($bibliotag,$bibliosubf); + } + unless ($biblionumber){ + warn "pas de numéro de notice bibliographique dans : ".$marcrecord->as_formatted; + next; + } + if ($update==1){ + &ModBiblio($marcrecord,$biblionumber,GetFrameworkCode($biblionumber)) ; + $counteditedbiblio++; + warn $counteditedbiblio if (($counteditedbiblio % 10) and $ENV{DEBUG}); + } + }#foreach $marc + return $counteditedbiblio; + # now, find every other authority linked with this authority + # now, find every other authority linked with this authority +# my $oConnection=C4::Context->Zconn("authorityserver"); +# my $query; +# # att 9210 Auth-Internal-authtype +# # att 9220 Auth-Internal-LN +# # ccl.properties to add for authorities +# $query= "= ".$mergefrom; +# my $oResult = $oConnection->search(new ZOOM::Query::CCL2RPN( $query, $oConnection )); +# my $count=$oResult->size() if ($oResult); +# my @reccache; +# my $z=0; +# while ( $z<$count ) { +# my $rec; +# $rec=$oResult->record($z); +# my $marcdata = $rec->raw(); +# push @reccache, $marcdata; +# $z++; +# } +# $oResult->destroy(); +# foreach my $marc(@reccache){ +# my $update; +# my $marcrecord; +# $marcrecord = MARC::File::USMARC::decode($marc); +# foreach my $tagfield (@tags_using_authtype){ +# $tagfield=substr($tagfield,0,3); +# my @tags = $marcrecord->field($tagfield); +# foreach my $tag (@tags){ +# my $tagsubs=$tag->subfield("9"); +# #warn "$tagfield:$tagsubs:$mergefrom"; +# if ($tagsubs== $mergefrom) { +# $tag->update("9" =>$mergeto); +# foreach my $subfield (@record_to) { +# # warn "$subfield,$subfield->[0],$subfield->[1]"; +# $tag->update($subfield->[0] =>$subfield->[1]); +# }#for $subfield +# } +# $marcrecord->delete_field($tag); +# $marcrecord->add_fields($tag); +# $update=1; +# }#for each tag +# }#foreach tagfield +# my $authoritynumber = TransformMarcToKoha($dbh,$marcrecord,"") ; +# if ($update==1){ +# &ModAuthority($marcrecord,$authoritynumber,GetAuthTypeCode($authoritynumber)) ; +# } +# +# }#foreach $marc }#sub -sub XML_writeline_withid{ -## Only used in authorities to update biblios with matching authids -my ($xml,$idsubf,$id,$newvalue,$tag,$subf)=@_; -my $biblio=$xml->{'datafield'}; -my $updated=0; - if ($tag>9){ - foreach my $data (@$biblio){ - if ($data->{'tag'} eq $tag){ - my @subfields=$data->{'subfield'}; - foreach my $subfield ( @subfields){ - foreach my $code ( @$subfield){ - if ($code->{'code'} eq $idsubf && $code->{'content'} eq $id){ - ###This is the correct tag -- Now reiterate and update - my @newsubs; - foreach my $code ( @$subfield){ - if ($code->{'code'} eq $subf ){ - $code->{'content'}=$newvalue; - $updated=1; - } - push @newsubs, $code; - }## each code updated - if (!$updated){ - ##Create the subfield if it did not exist - push @newsubs,{code=>$subf,content=>$newvalue}; - $data->{subfield}= \@newsubs; - $updated=1; - }### created - }### correct tag with id - }#each code - }##each subfield - }# tag match - }## each datafield - }### tag >9 -return $xml; -} -sub XML_delete_withid{ -## Currently only usedin authorities -### deletes all the subfields of a matching authid -my ($xml,$id,$tag,$idsubf)=@_; -my $biblio=$xml->{'datafield'}; - if ($tag>9){ - foreach my $data (@$biblio){ - if ($data->{'tag'} eq $tag){ - my @subfields=$data->{'subfield'}; - foreach my $subfield ( @subfields){ - foreach my $code ( @$subfield){ - if ($code->{'code'} eq $idsubf && $code->{'content'} eq $id){ - ###This is the correct tag -- Now reiterate and delete all but id subfield - foreach my $code ( @$subfield){ - if ($code->{'code'} ne $idsubf ){ - $code->{'content'}=""; - } - }## each code deleted - }### correct tag with id - }#each code - }## each subfield - }## tag matches - }## each datafield - }# tag >9 -return $xml; -} +=head2 get_auth_type_location + +=over 4 + +my ($tag, $subfield) = get_auth_type_location($auth_type_code); + +=back + +Get the tag and subfield used to store the heading type +for indexing purposes. The C<$auth_type> parameter is +optional; if it is not supplied, assume ''. -sub XML_readline_withtags { -my ($xml,$kohafield,$recordtype,$tag,$subf)=@_; -#$xml represents one record of MARCXML as perlhashed -## returns an array of read fields--useful for reading repeated fields -### $recordtype is needed for mapping the correct field if supplied -### If only $tag is given reads the whole tag -###Returns subfieldcodes as well -my @value; - ($tag,$subf)=MARCfind_marc_from_kohafield($kohafield,$recordtype) if $kohafield; -if ($tag){ -### Only datafields are read -my $biblio=$xml->{'datafield'}; - if ($tag>9){ - foreach my $data (@$biblio){ - if ($data->{'tag'} eq $tag){ - foreach my $subfield ( $data->{'subfield'}){ - foreach my $code ( @$subfield){ - if ($code->{'code'} eq $subf || !$subf){ - push @value,[$code->{'code'},$code->{'content'}]; - } - }# each code - }# each subfield - }### tag found - }## each tag - }##tag >9 -}## if tag -return @value; +This routine searches the MARC authority framework +for the tag and subfield whose kohafield is +C; if no such field is +defined in the framework, default to the hardcoded value +specific to the MARC format. + +=cut + +sub get_auth_type_location { + my $auth_type_code = @_ ? shift : ''; + + my ($tag, $subfield) = GetAuthMARCFromKohaField('auth_header.authtypecode', $auth_type_code); + if (defined $tag and defined $subfield and $tag != 0 and $subfield != 0) { + return ($tag, $subfield); + } else { + if (C4::Context->preference('marcflavour') eq "MARC21") { + return C4::AuthoritiesMarc::MARC21::default_auth_type_location(); + } else { + return C4::AuthoritiesMarc::UNIMARC::default_auth_type_location(); + } + } } END { } # module clean-up code here (global destructor) -=back +1; +__END__ =head1 AUTHOR @@ -847,58 +1402,3 @@ Paul POULAIN paul.poulain@free.fr =cut -# $Id$ - -# Revision 1.30 2006/09/06 16:21:03 tgarip1957 -# Clean up before final commits -# -# Revision 1.9.2.6 2005/06/07 10:02:00 tipaul -# porting dictionnary search from head to 2.2. there is now a ... facing titles, author & subject, to search in biblio & authorities existing values. -# -# Revision 1.9.2.5 2005/05/31 14:50:46 tipaul -# fix for authority merging. There was a bug on official installs -# -# Revision 1.9.2.4 2005/05/30 11:24:15 tipaul -# fixing a bug : when a field was repeated, the last field was also repeated. (Was due to the "empty" field in html between fields : to separate fields, in html, an empty field is automatically added. in AUTHhtml2marc, this empty field was not discarded correctly) -# -# Revision 1.9.2.3 2005/04/28 08:45:33 tipaul -# porting FindDuplicate feature for authorities from HEAD to rel_2_2, works correctly now. -# -# Revision 1.9.2.2 2005/02/28 14:03:13 tipaul -# * adding search on "main entry" (ie $a subfield) on a given authority (the "search everywhere" field is still here). -# * adding a select box to requet "contain" or "begin with" search. -# * fixing some bug in authority search (related to "main entry" search) -# -# Revision 1.9.2.1 2005/02/24 13:12:13 tipaul -# saving authority modif in a text file. This will be used soon with another script (in crontab). The script in crontab will retrieve every authorityid in the directory localfile/authorities and modify every biblio using this authority. Those modifs may be long. So they can't be done through http, because we may encounter a webserver timeout, and kill the process before end of the job. -# So, it will be done through a cron job. -# (/me agree we need some doc for command line scripts) -# -# Revision 1.9 2004/12/23 09:48:11 tipaul -# Minor changes in summary "exploding" (the 3 digits AFTER the subfield were not on the right place). -# -# Revision 1.8 2004/11/05 10:11:39 tipaul -# export auth_count_usage (bugfix) -# -# Revision 1.7 2004/09/23 16:13:00 tipaul -# Bugfix in modification -# -# Revision 1.6 2004/08/18 16:00:24 tipaul -# fixes for authorities management -# -# Revision 1.5 2004/07/05 13:37:22 doxulting -# First step for working authorities -# -# Revision 1.4 2004/06/22 11:35:37 tipaul -# removing % at the beginning of a string to avoid loooonnnngggg searchs -# -# Revision 1.3 2004/06/17 08:02:13 tipaul -# merging tag & subfield in auth_word for better perfs -# -# Revision 1.2 2004/06/10 08:29:01 tipaul -# MARC authority management (continued) -# -# Revision 1.1 2004/06/07 07:35:01 tipaul -# MARC authority management package -# -