koha-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Koha-cvs] koha/C4 AuthoritiesMarc.pm


From: Tumer Garip
Subject: [Koha-cvs] koha/C4 AuthoritiesMarc.pm
Date: Fri, 19 May 2006 18:09:39 +0000

CVSROOT:        /sources/koha
Module name:    koha
Branch:         
Changes by:     Tumer Garip <address@hidden>    06/05/19 18:09:39

Modified files:
        C4             : AuthoritiesMarc.pm 

Log message:
        All support for auth_subfield_tables is removed. All search is now with 
zebra authorities. New authority structure allows multiple linking of 
authorities of differnet types to one another.
        Authority tables are modified to be compatible with new MARC 
frameworks. This change is part of Authority Linking & Zebra authorities. 
Requires change in Mysql database. It will break head unless all changes 
regarding this is implemented. This warning will take place on all commits 
regarding this

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/koha/koha/C4/AuthoritiesMarc.pm.diff?tr1=1.24&tr2=1.25&r1=text&r2=text

Patches:
Index: koha/C4/AuthoritiesMarc.pm
diff -u koha/C4/AuthoritiesMarc.pm:1.24 koha/C4/AuthoritiesMarc.pm:1.25
--- koha/C4/AuthoritiesMarc.pm:1.24     Thu Feb  9 01:56:20 2006
+++ koha/C4/AuthoritiesMarc.pm  Fri May 19 18:09:39 2006
@@ -23,7 +23,7 @@
 use C4::Koha;
 use MARC::Record;
 use C4::Biblio;
-
+#use ZOOM;
 use vars qw($VERSION @ISA @EXPORT);
 
 # set the version for version checking
@@ -40,163 +40,188 @@
        &AUTHdelauthority
        &AUTHaddsubfield
        &AUTHgetauthority
-       
+       &AUTHfind_marc_from_kohafield
        &AUTHgetauth_type
        &AUTHcount_usage
-       
+       &getsummary
        &authoritysearch
        
-       &MARCmodsubfield
+       
        &AUTHhtml2marc
-       &AUTHaddword
-       &MARCaddword &MARCdelword
-       &char_decode
+       
+       &merge
        &FindDuplicate
  );
 
+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);
+}
 sub authoritysearch {
        my ($dbh, $tags, $and_or, $excluding, $operator, $value, 
$offset,$length,$authtypecode) = @_;
-       # build the sql request. She will look like :
-       # select m1.bibid
-       #               from auth_subfield_table as m1, auth_subfield_table as 
m2
-       #               where m1.authid=m2.authid and
-       #               (m1.subfieldvalue like "Des%" and m2.subfieldvalue like 
"27%")
-
+       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;
-       my $sth = $dbh->prepare("select auth_tag_to_report from auth_types 
where authtypecode=?");
-       $sth->execute($authtypecode);
-       my ($tag_to_report) = $sth->fetchrow;
-       $mainentrytag = $tag_to_report;
-       for (my $i=0;$i<$#{$tags};$i++) {
-               if (@$tags[$i] eq "mainentry") {
-                       @$tags[$i] = $tag_to_report."a";
-               }
-       }
-
-       # "Normal" statements
-       # quote marc fields/subfields
-       for (my $i=0;$i<=$#{$tags};$i++) {
-               if (@$tags[$i]) {
-                       @$tags[$i] = $dbh->quote(@$tags[$i]);
-               }
-       }
-       my @normal_tags = ();
-       my @normal_and_or = ();
-       my @normal_operator = ();
-       my @normal_value = ();
-       # Extracts the NOT statements from the list of statements
+       ##first set the authtype search
+       $query="address@hidden 1=1013 address@hidden 5=100 ".$authtypecode; 
##No truncation on authtype
+       my $dosearch;
+       my $and;
+       my $q2;
        for(my $i = 0 ; $i <= $#{$value} ; $i++)
        {
-               # replace * by %
-               @$value[$i] =~ s/\*/%/g;
-               # remove % at the beginning
-               @$value[$i] =~ s/^%//g;
-           @$value[$i] =~ s/(\.|\?|\:|\!|\'|,|\-|\"|\(|\)|\[|\]|\{|\}|\/)/ /g 
if @$operator[$i] eq "contains";
-               if(@$operator[$i] eq "contains") # if operator is contains, 
splits the words in separate requests
-               {
-                       foreach my $word (split(/ /, @$value[$i]))
-                       {
-                               unless (C4::Context->stopwords->{uc($word)}) {  
#it's NOT a stopword => use it. Otherwise, ignore
-                                       my $tag = substr(@$tags[$i],0,3);
-                                       my $subf = substr(@$tags[$i],3,1);
-                                       push @normal_tags, @$tags[$i];
-                                       push @normal_and_or, "and";     # 
assumes "foo" and "bar" if "foo bar" is entered
-                                       push @normal_operator, @$operator[$i];
-                                       push @normal_value, $word;
-                               }
-                       }
-               }
-               else
-               {
-                       push @normal_tags, @$tags[$i];
-                       push @normal_and_or, @$and_or[$i];
-                       push @normal_operator, @$operator[$i];
-                       push @normal_value, @$value[$i];
-               }
-       }
 
-       # Finds the basic results without the NOT requests
-       my ($sql_tables, $sql_where1, $sql_where2) = 
create_request($dbh,address@hidden, address@hidden, address@hidden, 
address@hidden);
+       if (@$value[$i]){
+       ##If mainentry search $a tag
+               if (@$tags[$i] eq "mainentry") {
+               $attr =" address@hidden 1=21 ";
+               }else{
+               $attr =" address@hidden 1=47 ";
+               }
+               
 
+       
+               
+               if (@$operator[$i] eq 'phrase') {
+                        $attr.=" address@hidden 4=1  address@hidden 5=100 
address@hidden 3=1 ";##Phrase, No truncation, first in field###It seems not 
implemented by indexdata
+               
+               } else {
+               
+                        $attr .=" address@hidden 4=6  address@hidden 5=1  ";## 
Word list, right truncated, anywhere
+               }                
+       
+               
+               $and .=" address@hidden " ;
+               $attr =$attr."\""address@hidden"\"";
+               $q2 .=$attr;
+       $dosearch=1;            
+       }#if value              
+               
+       }
+##Add how many queries generated
+$query= $and.$query.$q2;
+warn $query;
+
+$offset=0 unless $offset;
+my $counter = $offset;
+$length=10 unless $length;
+
+my $oAuth=C4::Context->Zconnauth("authorityserver");
+if ($oAuth eq "error"){
+warn "Error/CONNECTING \n";
+  return("error",undef);
+ }
+
+my $oAResult;
+my $Anewq= new ZOOM::Query::PQF($query);
+$Anewq->sortby("1=21 i< 1=47 i<");
+
+eval {
+$oAResult= $oAuth->search($Anewq) ; 
+};
+if($@){
+warn " /CODE:", address@hidden>code()," /MSG:",address@hidden>message(),"\n";
+   return("error",undef);
+ }
 
 
-       if ($sql_where2) {
-               $sth = $dbh->prepare("select distinct m1.authid from 
auth_header,$sql_tables where  m1.authid=auth_header.authid and 
auth_header.authtypecode=? and $sql_where2 and ($sql_where1)");
-               warn "Q2 : select distinct m1.authid from 
auth_header,$sql_tables where  m1.authid=auth_header.authid and 
auth_header.authtypecode=? and $sql_where2 and ($sql_where1)";
-       } else {
-               $sth = $dbh->prepare("select distinct m1.authid from 
auth_header,$sql_tables where  m1.authid=auth_header.authid and 
auth_header.authtypecode=? and $sql_where1");
-               warn "Q : select distinct m1.authid from 
auth_header,$sql_tables where  m1.authid=auth_header.authid and 
auth_header.authtypecode=? and $sql_where1";
-       }
-       $sth->execute($authtypecode);
+my $nbresults=0;
+ $nbresults=$oAResult->size() if  ($oAResult);
+       
        my @result = ();
-       while (my ($authid) = $sth->fetchrow) {
-                       push @result,$authid;
-               }
-       # we have authid list. Now, loads summary from [offset] to 
[offset]+[length]
-#      my $counter = $offset;
+
+       
        my @finalresult = ();
-       my $oldline;
-#      while (($counter <= $#result) && ($counter <= ($offset + $length))) {
-       # retrieve everything
-       for (my $counter=0;$counter <=$#result;$counter++) {
-#              warn " HERE : $counter, $#result, $offset, $length";
-               # get MARC::Record of the authority
-               my $record = AUTHgetauthority($dbh,$result[$counter]);
-               # then build the summary
-               my $authtypecode = 
AUTHfind_authtypecode($dbh,$result[$counter]);
-               my $authref = getauthtype($authtypecode);
-               my $summary = $authref->{summary};
-               my @fields = $record->fields();
-               foreach my $field (@fields) {
-                       my $tag = $field->tag();
-                       if ($tag<10) {
-                       } 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/<br>/g;
+if ($nbresults>0){
+##fIND tags using authority
 
-               # find biblio MARC field using this authtypecode (to jump to 
biblio)
-               $authtypecode = AUTHfind_authtypecode($dbh,$result[$counter]);
-               my $sth = $dbh->prepare("select distinct tagfield from 
marc_subfield_structure where authtypecode=?");
-               $sth->execute($authtypecode);
+       my $newsth = $dbh->prepare("select distinct tagfield from 
marc_subfield_structure where authtypecode=?");
+               $newsth->execute($authtypecode);
                my $tags_using_authtype;
-               while (my ($tagfield) = $sth->fetchrow) {
-#                      warn "TAG : $tagfield";
-                       $tags_using_authtype.= $tagfield."9,";
+               while (my ($tagfield) = $newsth->fetchrow) {
+                       $tags_using_authtype.= "'".$tagfield."9',";
                }
-               chop $tags_using_authtype;
-               
-               # then add a line for the template loop
-               my %newline;
-               $newline{summary} = $summary;
-               $newline{authid} = $result[$counter];
-               $newline{used} = &AUTHcount_usage($result[$counter]);
-               $newline{biblio_fields} = $tags_using_authtype;
-               $newline{even} = $counter % 2;
-               $newline{mainentry} = 
$record->field($mainentrytag)->subfield('a')." 
".$record->field($mainentrytag)->subfield('b') if $record->field($mainentrytag);
-               push @finalresult, \%newline;
-       }
-       # sort everything
-       my @finalresult3= sort {$a->{summary} cmp $b->{summary}} @finalresult;
-       # cut from $offset to $offset+$length;
-       my @finalresult2;
-       for (my $i=$offset;$i<=$offset+$length;$i++) {
-               push @finalresult2,$finalresult3[$i] if $finalresult3[$i];
-       }
-       my $nbresults = $#result + 1;
+##Find authid and linkid fields
+my 
($authidfield,$authidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.authid",$authtypecode);
+my 
($linkidfield,$linkidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.linkid",$authtypecode);
+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 $linkid;
+my @linkids;   
+my $separator=C4::Context->preference('authoritysep');
+my $linksummary=" ".$separator;        
+       
+       $authrecord = MARC::File::USMARC::decode($marcdata);            
+my $authid=$authrecord->field($authidfield)->subfield($authidsubfield); ## we 
could have these defined in system pref.
+       if ($authrecord->field($linkidfield)){
+my @fields=$authrecord->field($linkidfield);
+
+       foreach my $field (@fields){
+       $linkid=$field->subfield($linkidsubfield) ;
+               if ($linkid){ ##There is a linked record add fields to produce 
summary
+my $linktype=AUTHfind_authtypecode($dbh,$linkid);
+               my $linkrecord=AUTHgetauthority($dbh,$linkid);
+               
$linksummary.=getsummary($dbh,$linkrecord,$linkid,$linktype).$separator;
+               }
+       }
+       }#
 
-       return (address@hidden, $nbresults);
+my $summary=getsummary($dbh,$authrecord,$authid,$authtypecode);
+if ($linkid && $linksummary ne " ".$separator){
+$summary="<b>".$summary."</b>".$linksummary;
+}
+## Fix Async search and move Zconn to here
+       my %newline;
+       $newline{summary} = $summary;
+       $newline{authid} = $authid;
+       $newline{linkid} = $linkid;
+#      $newline{used} =$count;
+       $newline{biblio_fields} = $tags_using_authtype;
+       $newline{even} = $counter % 2;
+       $counter++;
+       push @finalresult, \%newline;
+       }## while counter
+$oAResult->destroy();
+#$oAuth->destroy();
+
+###
+my $oConnection=C4::Context->Zconn("biblioserver");
+       if ($oConnection eq "error"){
+       warn "Error/CONNECTING \n";
+        }
+my $oResult;
+for (my $z=0; $z<@finalresult; $z++){
+       my $nquery;
+               
+               $nquery= "address@hidden GILS 1=2057 ".$finalresult[$z]{authid};
+               $nquery="address@hidden ".$nquery." address@hidden GILS 1=2057 
".$finalresult[$z]{linkid} if $finalresult[$z]{linkid};
+               
+               eval{
+                $oResult = $oConnection->search_pqf($nquery);
+               };
+               if($@){
+               warn " /CODE:", address@hidden>code()," 
/MSG:",address@hidden>message(),"\n";
+               }
+               my $count=$oResult->size() if  ($oResult);
+               $finalresult[$z]{used}=$count;
+}##for Zconn
+       $oResult->destroy();
+#              $oConnection->destroy();
+}## if nbresult
+       return (address@hidden, $nbresults);
 }
 
 # Creates the SQL Request
@@ -214,72 +239,33 @@
        for(my $i=0; $i<address@hidden;$i++) {
                if (@$value[$i]) {
                        $nb_active++;
-#                      warn " @$tags[$i]";
                        if ($nb_active==1) {
-                               if (@$operator[$i] eq "start") {
-                                       $sql_tables .= "auth_subfield_table as 
m$nb_table,";
-                                       $sql_where1 .= "(m1.subfieldvalue like 
".$dbh->quote("@$value[$i]%");
+                               
+                                       $sql_tables = "auth_subfield_table as 
m$nb_table,";
+                                       $sql_where1 .= "( 
m$nb_table.subfieldvalue like '@$value[$i]' ";
                                        if (@$tags[$i]) {
-                                               $sql_where1 .=" and 
m1.tag+m1.subfieldcode in (@$tags[$i])";
-                                       }
+                                               $sql_where1 .=" and 
concat(m$nb_table.tag,m$nb_table.subfieldcode) IN (@$tags[$i])";
+                                                       }
                                        $sql_where1.=")";
-                               } elsif (@$operator[$i] eq "contains") {        
-                               $sql_tables .= "auth_word as m$nb_table,";
-                                       $sql_where1 .= "(m1.word  like 
".$dbh->quote("@$value[$i]%");
-                                       if (@$tags[$i]) {
-                                                $sql_where1 .=" and 
m1.tagsubfield in (@$tags[$i])";
-                                       }
-                                       $sql_where1.=")";
-                               } else {
-
-                                       $sql_tables .= "auth_subfield_table as 
m$nb_table,";
-                                       $sql_where1 .= "(m1.subfieldvalue 
@$operator[$i] ".$dbh->quote("@$value[$i]");
-                                       if (@$tags[$i]) {
-                                                $sql_where1 .=" and 
m1.tag+m1.subfieldcode in (@$tags[$i])";
-                                       }
-                                       $sql_where1.=")";
-                               }
-                       } else {
-                               if (@$operator[$i] eq "start") {
-                                       $nb_table++;
-                                       $sql_tables .= "auth_subfield_table as 
m$nb_table,";
-                                       $sql_where1 .= "@$and_or[$i] 
(m$nb_table.subfieldvalue like ".$dbh->quote("@$value[$i]%");
-                                       if (@$tags[$i]) {
-                                               $sql_where1 .=" and 
m$nb_table.tag+m$nb_table.subfieldcode in (@$tags[$i])";
-                                       }
-                                       $sql_where1.=")";
-                                       $sql_where2 .= 
"m1.authid=m$nb_table.authid and ";
-                               } elsif (@$operator[$i] eq "contains") {
-                                       if (@$and_or[$i] eq 'and') {
-                                               $nb_table++;
-                                               $sql_tables .= "auth_word as 
m$nb_table,";
-                                               $sql_where1 .= "@$and_or[$i] 
(m$nb_table.word like ".$dbh->quote("@$value[$i]%");
-                                               if (@$tags[$i]) {
-                                                       $sql_where1 .=" and 
m$nb_table.tagsubfield in(@$tags[$i])";
-                                               }
-                                               $sql_where1.=")";
-                                               $sql_where2 .= 
"m1.authid=m$nb_table.authid and ";
                                        } else {
-                                               $sql_where1 .= "@$and_or[$i] 
(m$nb_table.word like ".$dbh->quote("@$value[$i]%");
-                                               if (@$tags[$i]) {
-                                                       $sql_where1 .="  and 
m$nb_table.tag+m$nb_table.subfieldid in (@$tags[$i])";
-                                               }
-                                               $sql_where1.=")";
-                                               $sql_where2 .= 
"m1.authid=m$nb_table.authid and ";
-                                       }
-                               } else {
+                               
+                                       
+                                       
+                                       
                                        $nb_table++;
+                                       
                                        $sql_tables .= "auth_subfield_table as 
m$nb_table,";
-                                       $sql_where1 .= "@$and_or[$i] 
(m$nb_table.subfieldvalue @$operator[$i] ".$dbh->quote(@$value[$i]);
+                                       $sql_where1 .= "@$and_or[$i] 
(m$nb_table.subfieldvalue   like '@$value[$i]' ";
                                        if (@$tags[$i]) {
-                                               $sql_where1 .="  and 
m$nb_table.tag+m$nb_table.subfieldcode in (@$tags[$i])";
-                                       }
-                                       $sql_where2 .= 
"m1.authid=m$nb_table.authid and ";
+                                               $sql_where1 .=" and 
concat(m$nb_table.tag,m$nb_table.subfieldcode) IN (@$tags[$i])";
+                                                       }
                                        $sql_where1.=")";
+                                       
$sql_where2.="m1.authid=m$nb_table.authid and ";
+                                                               
+                               
+                                       } 
                                }
-                       }
                }
-       }
 
        if($sql_where2 ne "(")  # some datas added to sql_where2, processing
        {
@@ -302,52 +288,41 @@
        # find MARC fields using this authtype
        my $authtypecode = AUTHfind_authtypecode($dbh,$authid);
        my $sth = $dbh->prepare("select distinct tagfield from 
marc_subfield_structure where authtypecode=?");
-       $sth->execute($authtypecode);
+       my $tags_used=$sth->execute($authtypecode);
        my $tags_using_authtype;
-       while (my ($tagfield) = $sth->fetchrow) {
+
+       while  (my($tagfield) = $sth->fetchrow){
 #              warn "TAG : $tagfield";
                $tags_using_authtype.= "'".$tagfield."9',";
+
        }
+
        chop $tags_using_authtype;
-       if ($tags_using_authtype) {
-               $sth = $dbh->prepare("select count(*) from marc_subfield_table 
where concat(tag,subfieldcode) in ($tags_using_authtype) and subfieldvalue=?");
-#      } else {
-#              $sth = $dbh->prepare("select count(*) from marc_subfield_table 
where subfieldvalue=?");
-       }
-#      warn "Q : select count(*) from marc_subfield_table where 
concat(tag,subfieldcode) in ($tags_using_authtype) and subfieldvalue=$authid";
-       $sth->execute($authid);
-       my ($result) = $sth->fetchrow;
+### try ZOOM search here
+my $oConnection=C4::Context->Zconn("biblioserver");
+my $query;
+
+$query= "address@hidden GILS 1=2057 ".$authid;
+
+my $oResult = $oConnection->search_pqf($query);
+
+my $result=$oResult->size() if  ($oResult);
+
+### OLD API
+#      if ($tags_using_authtype) {
+#              $sth = $dbh->prepare("select count(*) from marc_subfield_table 
where concat(tag,subfieldcode) in ($tags_using_authtype) and 
MATCH(subfieldvalue) AGAINST(? IN BOOLEAN MODE)");
+#      } else {
+#              $sth = $dbh->prepare("select count(*) from marc_subfield_table 
where subfieldvalue=?");
+#      }
+#      warn "Q : select count(*) from marc_subfield_table where 
concat(tag,subfieldcode) in ($tags_using_authtype) and d MATCH(subfieldvalue) 
AGAINST($authid IN BOOLEAN MODE) ";
+#      $sth->execute($authid);
+#      my ($result) = $sth->fetchrow;
 #      warn "Authority $authid TOTAL USED : $result";
-       return $result;
+       
+       return ($result);
 }
 
-# merging 2 authority entries. After a merge, the "from" can be deleted.
-# sub AUTHmerge {
-#      my ($auth_merge_from,$auth_merge_to) = @_;
-#      my $dbh = C4::Context->dbh;
-#      # find MARC fields using this authtype
-#      my $authtypecode = AUTHfind_authtypecode($dbh,$authid);
-#      # retrieve records
-#      my $record_from = AUTHgetauthority($dbh,$auth_merge_from);
-#      my $record_to = AUTHgetauthority($dbh,$auth_merge_to);
-#      my $sth = $dbh->prepare("select distinct tagfield from 
marc_subfield_structure where authtypecode=?");
-#      $sth->execute($authtypecode);
-#      my $tags_using_authtype;
-#      while (my ($tagfield) = $sth->fetchrow) {
-#              warn "TAG : $tagfield";
-#              $tags_using_authtype.= "'".$tagfield."9',";
-#      }
-#      chop $tags_using_authtype;
-#      # now, find every biblio using this authority
-#      $sth = $dbh->prepare("select bibid,tag,tag_indicator,tagorder from 
marc_subfield_table where tag+subfieldid in ($tags_using_authtype) and 
subfieldvalue=?");
-#      $sth->execute($authid);
-#      # and delete entries before recreating them
-#      while (my ($bibid,$tag,$tag_indicator,$tagorder) = $sth->fetchrow) {
-#              &MARCdelsubfield($dbh,$bibid,$tag);
-#              
-#      }
-# 
-# }
+
 
 sub AUTHfind_authtypecode {
        my ($dbh,$authid) = @_;
@@ -363,176 +338,231 @@
        $authtypecode="" unless $authtypecode;
        my $sth;
        my $libfield = ($forlibrarian eq 1)? 'liblibrarian' : 'libopac';
-       # check that framework exists
+
+
+       # 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,$libfield as 
lib,mandatory,repeatable from auth_tag_structure where authtypecode=? order by 
tagfield");
-       $sth->execute($authtypecode);
-       my ($lib,$tag,$res,$tab,$mandatory,$repeatable);
-       while ( ($tag,$lib,$mandatory,$repeatable) = $sth->fetchrow) {
-               $res->{$tag}->{lib}=$lib;
-               $res->{$tab}->{tab}=""; # XXX
-               $res->{$tag}->{mandatory}=$mandatory;
-               $res->{$tag}->{repeatable}=$repeatable;
-       }
-
-       $sth=$dbh->prepare("select tagfield,tagsubfield,$libfield as lib,tab, 
mandatory, repeatable,authorised_value,value_builder,seealso from 
auth_subfield_structure where authtypecode=? order by tagfield,tagsubfield");
+       $sth= $dbh->prepare(
+"select tagfield,liblibrarian,libopac,mandatory,repeatable from 
auth_tag_structure where authtypecode=? order by tagfield"
+    );
+
+$sth->execute($authtypecode);
+        my ( $liblibrarian, $libopac, $tag, $res, $tab, $mandatory, 
$repeatable );
+
+    while ( ( $tag, $liblibrarian, $libopac, $mandatory, $repeatable ) = 
$sth->fetchrow ) {
+        $res->{$tag}->{lib}        = ($forlibrarian or 
!$libopac)?$liblibrarian:$libopac;
+        $res->{$tab}->{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,kohafield,seealso,hidden,isurl,link
 from auth_subfield_structure where authtypecode=? order by 
tagfield,tagsubfield"
+    );
        $sth->execute($authtypecode);
 
-       my $subfield;
-       my $authorised_value;
-       my $thesaurus_category;
-       my $value_builder;
-       my $kohafield;
-       my $seealso;
-       my $hidden;
-       my $isurl;
-       while ( ($tag, $subfield, $lib, $tab, $mandatory, 
$repeatable,$authorised_value,$value_builder,$seealso) = $sth->fetchrow) {
-               $res->{$tag}->{$subfield}->{lib}=$lib;
-               $res->{$tag}->{$subfield}->{tab}=$tab;
-               $res->{$tag}->{$subfield}->{mandatory}=$mandatory;
-               $res->{$tag}->{$subfield}->{repeatable}=$repeatable;
-               $res->{$tag}->{$subfield}->{authorised_value}=$authorised_value;
-               
$res->{$tag}->{$subfield}->{thesaurus_category}=$thesaurus_category;
-               $res->{$tag}->{$subfield}->{value_builder}=$value_builder;
-               $res->{$tag}->{$subfield}->{seealso}=$seealso;
-               $res->{$tag}->{$subfield}->{hidden}=$hidden;
-               $res->{$tag}->{$subfield}->{isurl}=$isurl;
-       }
-       return $res;
+        my $subfield;
+    my $authorised_value;
+    my $authtypecode;
+    my $value_builder;
+    my $kohafield;
+    my $seealso;
+    my $hidden;
+    my $isurl;
+       my $link;
+
+    while (
+        ( $tag,         $subfield,   $liblibrarian,   , $libopac,      $tab,
+        $mandatory,     $repeatable, $authorised_value, $authtypecode,
+        $value_builder, $kohafield,  $seealso,          $hidden,
+        $isurl,                        $link )
+        = $sth->fetchrow
+      )
+    {
+        $res->{$tag}->{$subfield}->{lib}              = ($forlibrarian or 
!$libopac)?$liblibrarian:$libopac;
+        $res->{$tag}->{$subfield}->{tab}              = $tab;
+        $res->{$tag}->{$subfield}->{mandatory}        = $mandatory;
+        $res->{$tag}->{$subfield}->{repeatable}       = $repeatable;
+        $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;
+        $res->{$tag}->{$subfield}->{link}            = $link;
+    }
+    return $res;
 }
 
 sub AUTHaddauthority {
-# pass the MARC::Record to this function, and it will create the records in 
the marc tables
+# pass the MARC::Record to this function, and it will create the records in 
the authority table
        my ($dbh,$record,$authid,$authtypecode) = @_;
-       my @fields=$record->fields();
-# adding main table, and retrieving authid
-# if authid is sent, then it's not a true add, it's only a re-add, after a 
delete (ie, a mod)
+
+#my $leadercode=AUTHfind_leader($dbh,$authtypecode);
+my $leader='         a              ';##Fixme correct leader as this one just 
adds utf8 to MARC21
+#substr($leader,8,1)=$leadercode;
+#      $record->leader($leader);
+my 
($authfield,$authidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.authid",$authtypecode);
+my 
($authfield2,$authtypesubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.authtypecode",$authtypecode);
+my 
($linkidfield,$linkidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.linkid",$authtypecode);
+
 # if authid empty => true add, find a new authid number
-       unless ($authid) {
-               $dbh->do("lock tables auth_header WRITE,auth_subfield_table 
WRITE, auth_word WRITE, stopwords READ");
-               my $sth=$dbh->prepare("insert into auth_header 
(datecreated,authtypecode) values (now(),?)");
-               $sth->execute($authtypecode);
-               $sth=$dbh->prepare("select max(authid) from auth_header");
+       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 
+
+##Both authid and authtypecode is expected to be in the same field. Modify if 
other requirements arise
+       
$record->add_fields($authfield,'','',$authidsubfield=>$authid,$authtypesubfield=>$authtypecode);
+
+               $dbh->do("lock tables auth_header WRITE");
+                $sth=$dbh->prepare("insert into auth_header 
(authid,datecreated,authtypecode,marc) values (?,now(),?,?)");
+               $sth->execute($authid,$authtypecode,$record->as_usmarc);        
        
                $sth->finish;
-       }
-       my $fieldcount=0;
-       # now, add subfields...
-       foreach my $field (@fields) {
-               $fieldcount++;
-               if ($field->tag() <10) {
-                               &AUTHaddsubfield($dbh,$authid,
-                                               $field->tag(),
-                                               '',
-                                               $fieldcount,
-                                               '',
-                                               1,
-                                               $field->data()
-                                               );
-               } else {
-                       my @subfields=$field->subfields();
-                       my $subfieldorder;
-                       foreach my $subfield (@subfields) {
-                               foreach (split /\|/,@$subfield[1]) {
-                                       $subfieldorder++;
-                                       &AUTHaddsubfield($dbh,$authid,
-                                                       $field->tag(),
-                                                       
$field->indicator(1).$field->indicator(2),
-                                                       $fieldcount,
-                                                       @$subfield[0],
-                                                       $subfieldorder,
-                                                       $_
-                                                       );
-                               }
-                       }
-               }
+       
+       }else{
+##Modified record reinsertid
+$record->delete_field($authfield);
+$record->add_fields($authfield,'','',$authidsubfield=>$authid,$authtypesubfield=>$authtypecode);
+
+       $dbh->do("lock tables auth_header WRITE");
+       my $sth=$dbh->prepare("update auth_header set marc=? where authid=?");
+       $sth->execute($record->as_usmarc,$authid);
+       $sth->finish;
        }
        $dbh->do("unlock tables");
-       return $authid;
-}
+       zebraopauth($dbh,$authid,'specialUpdate');
 
+if ($record->field($linkidfield)){
+my @fields=$record->field($linkidfield);
 
-sub AUTHaddsubfield {
-# Add a new subfield to a tag into the DB.
-       my 
($dbh,$authid,$tagid,$tag_indicator,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalues)
 = @_;
-       # if not value, end of job, we do nothing
-       if (length($subfieldvalues) ==0) {
-               return;
+       foreach my $field (@fields){
+my     $linkid=$field->subfield($linkidsubfield) ;
+               if ($linkid){
+       ##Modify the record of linked 
+       AUTHaddlink($dbh,$linkid,$authid);
        }
-       if (not($subfieldcode)) {
-               $subfieldcode=' ';
        }
-       my @subfieldvalues = split /\|/,$subfieldvalues;
-       foreach my $subfieldvalue (@subfieldvalues) {
-               my $sth=$dbh->prepare("insert into auth_subfield_table 
(authid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) 
values (?,?,?,?,?,?,?)");
-#              warn "==> $authid,".(sprintf "%03s",$tagid).",TAG : 
$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue";
-               $sth->execute($authid,(sprintf 
"%03s",$tagid),$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue);
-               if ($sth->errstr) {
-                       warn "ERROR ==> insert into auth_subfield_table 
(authid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) 
values 
($authid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
+}
+       return ($authid);
+}
+
+sub AUTHaddlink{
+my ($dbh,$linkid,$authid)address@hidden;
+my $record=AUTHgetauthority($dbh,$linkid);
+my $authtypecode=AUTHfind_authtypecode($dbh,$linkid);
+#warn "adding l:$linkid,a:$authid,auth:$authtypecode";
+$record=AUTH2marcOnefieldlink($dbh,$record,"auth_header.linkid",$authid,$authtypecode);
+$dbh->do("lock tables auth_header WRITE");
+       my $sth=$dbh->prepare("update auth_header set marc=? where authid=?");
+       $sth->execute($record->as_usmarc,$linkid);
+       $sth->finish;   
+       $dbh->do("unlock tables");
+       zebraopauth($dbh,$linkid,'specialUpdate');
+}
+
+sub AUTH2marcOnefieldlink {
+    my ( $dbh, $record, $kohafieldname, $newvalue,$authtypecode ) = @_;
+my $sth =      $dbh->prepare(
+"select tagfield,tagsubfield from auth_subfield_structure where authtypecode=? 
and kohafield=?"
+    );
+    $sth->execute($authtypecode,$kohafieldname);
+my  ($tagfield,$tagsubfield)=$sth->fetchrow;
+            $record->add_fields( $tagfield, " ", " ", $tagsubfield => 
$newvalue );
+    return $record;
+}
+sub zebraopauth{
+
+my ($dbh,$authid,$op)address@hidden;
+my $Zconnauthority;
+my $tried=0;
+my $recon=0;
+reconnect:
+$Zconnauthority=C4::Context->Zconnauth("authorityserver");
+if ($Zconnauthority ne "error"){
+my     $record = AUTHgetauthority($dbh,$authid);
+my $Zpackage = $Zconnauthority->package();
+$Zpackage->option(action => $op);
+       $Zpackage->option(record => $record->as_xml_record);
+retry:
+       eval {
+               $Zpackage->send("update");
+       };
+       if ($@) {
+               if(address@hidden>code()==10007 && $tried==0){ ##Timedout -retry
+               $tried=1;
+               goto "retry";
+               }elsif(address@hidden>code()==10004 && $recon==0){##Lost 
connection -reconnect
+               $recon=1;
+               goto "reconnect";
+               }else{
+               warn "Error-authority updating $authid $op /CODE:", 
address@hidden>code()," /MSG:",address@hidden>message(),"\n";       
+               zebrafiles($dbh,$authid,$op);
+               return;
                }
-               
&AUTHaddword($dbh,$authid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
        }
+$Zpackage->("commit") if (C4::Context->shadow);        
+$Zpackage->destroy;
+}else{
+zebrafiles($dbh,$authid,$op);
+}      
+}
+
+sub zebrafiles{
+
+my ($dbh,$authid,$folder)address@hidden;
+my $record=AUTHgetauthority($dbh,$authid);
+my $zebradir = 
C4::Context->zebraconfig("authorityserver")->{directory}."/".$folder."/";
+       
+#my $zebradir = C4::Context->authoritydir."/".$folder."/";
+       unless (opendir(DIR, "$zebradir")) {
+warn "$zebradir not found";
+                       return;
+       } 
+       closedir DIR;
+       my $filename = $zebradir.$authid;
+if ($record){
+       open (OUTPUT,">", $filename.".xml");
+       print OUTPUT $record->as_xml_record;
+
+       close OUTPUT;
+}
+
+
+}
+
+
+sub AUTHfind_leader{
+##Hard coded for NEU auth types 
+my($dbh,$authtypecode)address@hidden;
+
+my $leadercode;
+if ($authtypecode eq "AUTH"){
+$leadercode="a";
+}elsif ($authtypecode eq "ESUB"){
+$leadercode="b";
+}elsif ($authtypecode eq "TSUB"){
+$leadercode="c";
+}else{
+$leadercode=" ";
+}
+return $leadercode;
 }
 
 sub AUTHgetauthority {
 # Returns MARC::Record of the biblio passed in parameter.
     my ($dbh,$authid)address@hidden;
-    my $record = MARC::Record->new();
-#---- TODO : the leader is missing
-       $record->leader('                        ');
-    my $sth=$dbh->prepare("select 
authid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue
-                                from auth_subfield_table
-                                where authid=? order by 
tag,tagorder,subfieldorder
-                        ");
-       $sth->execute($authid);
-       my $prevtagorder=1;
-       my $prevtag='XXX';
-       my $previndicator;
-       my $field; # for >=10 tags
-       my $prevvalue; # for <10 tags
-       while (my $row=$sth->fetchrow_hashref) {
-               if ($row->{tagorder} ne $prevtagorder || $row->{tag} ne 
$prevtag) {
-                       $previndicator.="  ";
-                       if ($prevtag <10) {
-                       $record->add_fields((sprintf 
"%03s",$prevtag),$prevvalue) unless $prevtag eq "XXX"; # ignore the 1st loop
-                       } else {
-                               $record->add_fields($field) unless $prevtag eq 
"XXX";
-                       }
-                       undef $field;
-                       $prevtagorder=$row->{tagorder};
-                       $prevtag = $row->{tag};
-                       $previndicator=$row->{tag_indicator};
-                       if ($row->{tag}<10) {
-                               $prevvalue = $row->{subfieldvalue};
-                       } else {
-                               $field = MARC::Field->new((sprintf 
"%03s",$prevtag), substr($row->{tag_indicator}.'  ',0,1), 
substr($row->{tag_indicator}.'  ',1,1), $row->{'subfieldcode'}, 
$row->{'subfieldvalue'} );
-                       }
-               } else {
-                       if ($row->{tag} <10) {
-                               $record->add_fields((sprintf 
"%03s",$row->{tag}), $row->{'subfieldvalue'});
-                       } else {
-                               $field->add_subfields($row->{'subfieldcode'}, 
$row->{'subfieldvalue'} );
-                       }
-                       $prevtag= $row->{tag};
-                       $previndicator=$row->{tag_indicator};
-               }
-       }
-       # the last has not been included inside the loop... do it now !
-       if ($prevtag ne "XXX") { # check that we have found something. 
Otherwise, prevtag is still XXX and we
-                                               # must return an empty record, 
not make MARC::Record fail because we try to
-                                               # create a record with XXX as 
field :-(
-               if ($prevtag <10) {
-                       $record->add_fields($prevtag,$prevvalue);
-               } else {
-       #               my $field = MARC::Field->new( $prevtag, "", "", 
%subfieldlist);
-                       $record->add_fields($field);
-               }
-       }
-       return $record;
+my     $sth=$dbh->prepare("select marc from auth_header where authid=?");
+               $sth->execute($authid);
+       my ($marc) = $sth->fetchrow; 
+my $record=MARC::File::USMARC::decode($marc);
+
+       return ($record);
 }
 
 sub AUTHgetauth_type {
@@ -543,128 +573,72 @@
        return $sth->fetchrow_hashref;
 }
 sub AUTHmodauthority {
-       my ($dbh,$authid,$record,$delete)address@hidden;
-       my $oldrecord=&AUTHgetauthority($dbh,$authid);
+
+       my ($dbh,$authid,$record,$authtypecode,$merge)address@hidden;
+       my ($oldrecord)=&AUTHgetauthority($dbh,$authid);
        if ($oldrecord eq $record) {
                return;
        }
-# 1st delete the authority,
-# 2nd recreate it
-       &AUTHdelauthority($dbh,$authid,1);
-       
&AUTHaddauthority($dbh,$record,$authid,AUTHfind_authtypecode($dbh,$authid));
-       # save the file in localfile/modified_authorities
-       my $cgidir = C4::Context->intranetdir ."/cgi-bin";
-       unless (opendir(DIR, "$cgidir")) {
-                       $cgidir = C4::Context->intranetdir."/";
-       } 
+my $sth=$dbh->prepare("update auth_header set marc=? where authid=?");
+#warn find if linked records exist and delete them
+my($linkidfield,$linkidsubfield)=AUTHfind_marc_from_kohafield($dbh,"auth_header.linkid",$authtypecode);
+
+if ($oldrecord->field($linkidfield)){
+my @fields=$oldrecord->field($linkidfield);
+       foreach my $field (@fields){
+my     $linkid=$field->subfield($linkidsubfield) ;
+       if ($linkid){                   
+               ##Modify the record of linked 
+               my $linkrecord=AUTHgetauthority($dbh,$linkid);
+               my $linktypecode=AUTHfind_authtypecode($dbh,$linkid);
+               my ( 
$linkidfield2,$linkidsubfield2)=AUTHfind_marc_from_kohafield($dbh,"auth_header.linkid",$linktypecode);
+               my @linkfields=$linkrecord->field($linkidfield2);
+                       foreach my $linkfield (@linkfields){
+                       if ($linkfield->subfield($linkidsubfield2) eq $authid){
+                               $linkrecord->delete_field($linkfield);
+                               $sth->execute($linkrecord->as_usmarc,$linkid);
+                               zebraopauth($dbh,$linkid,'specialUpdate');
+                       }
+                       }#foreach linkfield
+       }
+       }#foreach linkid
+}
+#Now rewrite the $record to table with an add
+$authid=AUTHaddauthority($dbh,$record,$authid,$authtypecode);
 
-       my $filename = $cgidir."/localfile/modified_authorities/$authid.authid";
-       open AUTH, "> $filename";
-       print AUTH $authid;
-       close AUTH;
+##Uncomment below and all biblios will get updated with modified authority-- 
To be used with $merge flag
+#      &merge($dbh,$authid,$record,$authid,$record);
+return $authid;
 }
 
 sub AUTHdelauthority {
        my ($dbh,$authid,$keep_biblio) = @_;
 # if the keep_biblio is set to 1, then authority entries in biblio are 
preserved.
-# This flag is set when the delauthority is called by modauthority
-# due to a too complex structure of MARC (repeatable fields and subfields),
-# the best solution for a modif is to delete / recreate the record.
-
-       my $record = AUTHgetauthority($dbh,$authid);
-       $dbh->do("delete from auth_header where authid=$authid") unless 
$keep_biblio;
-       $dbh->do("delete from auth_subfield_table where authid=$authid");
-       $dbh->do("delete from auth_word where authid=$authid");
+
+zebraopauth($dbh,$authid,"recordDelete");
+       $dbh->do("delete from auth_header where authid=$authid") ;
+
 # FIXME : delete or not in biblio tables (depending on $keep_biblio flag)
 }
 
-sub AUTHmodsubfield {
-# Subroutine changes a subfield value given a subfieldid.
-       my ($dbh, $subfieldid, $subfieldvalue )address@hidden;
-       $dbh->do("lock tables auth_subfield_table WRITE");
-       my $sth=$dbh->prepare("update auth_subfield_table set subfieldvalue=? 
where subfieldid=?");
-       $sth->execute($subfieldvalue, $subfieldid);
-       $dbh->do("unlock tables");
-       $sth->finish;
-       $sth=$dbh->prepare("select 
authid,tag,tagorder,subfieldcode,subfieldid,subfieldorder from 
auth_subfield_table where subfieldid=?");
-       $sth->execute($subfieldid);
-       my ($authid,$tagid,$tagorder,$subfieldcode,$x,$subfieldorder) = 
$sth->fetchrow;
-       $subfieldid=$x;
-       
&AUTHdelword($dbh,$authid,$tagid,$tagorder,$subfieldcode,$subfieldorder);
-       
&AUTHaddword($dbh,$authid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
-       return($subfieldid, $subfieldvalue);
-}
-
-sub AUTHfindsubfield {
-    my ($dbh,$authid,$tag,$subfieldcode,$subfieldorder,$subfieldvalue) = @_;
-    my $resultcounter=0;
-    my $subfieldid;
-    my $lastsubfieldid;
-    my $query="select subfieldid from auth_subfield_table where authid=? and 
tag=? and subfieldcode=?";
-    my @bind_values = ($authid,$tag, $subfieldcode);
-    if ($subfieldvalue) {
-       $query .= " and subfieldvalue=?";
-       push(@bind_values,$subfieldvalue);
-    } else {
-       if ($subfieldorder<1) {
-           $subfieldorder=1;
-       }
-       $query .= " and subfieldorder=?";
-       push(@bind_values,$subfieldorder);
-    }
-    my $sti=$dbh->prepare($query);
-    $sti->execute(@bind_values);
-    while (($subfieldid) = $sti->fetchrow) {
-       $resultcounter++;
-       $lastsubfieldid=$subfieldid;
-    }
-    if ($resultcounter>1) {
-               # Error condition.  Values given did not resolve into a unique 
record.  Don't know what to edit
-               # should rarely occur (only if we use subfieldvalue with a 
value that exists twice, which is strange)
-               return -1;
-    } else {
-               return $lastsubfieldid;
-    }
-}
 
-sub AUTHfindsubfieldid {
-       my ($dbh,$authid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-       my $sth=$dbh->prepare("select subfieldid from auth_subfield_table
-                               where authid=? and tag=? and tagorder=?
-                                       and subfieldcode=? and 
subfieldorder=?");
-       $sth->execute($authid,$tag,$tagorder,$subfield,$subfieldorder);
-       my ($res) = $sth->fetchrow;
-       unless ($res) {
-               $sth=$dbh->prepare("select subfieldid from auth_subfield_table
-                               where authid=? and tag=? and tagorder=?
-                                       and subfieldcode=?");
-               $sth->execute($authid,$tag,$tagorder,$subfield);
-               ($res) = $sth->fetchrow;
-       }
-    return $res;
-}
 
-# 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;
-# }
-
-sub AUTHdelsubfield {
-# delete a subfield for $authid / tag / tagorder / subfield / subfieldorder
-    my ($dbh,$authid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-    $dbh->do("delete from auth_subfield_table where authid='$authid' and
-                       tag='$tag' and tagorder='$tagorder'
-                       and subfieldcode='$subfield' and 
subfieldorder='$subfieldorder'
-                       ");
+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;
 }
 
+
+
 sub AUTHhtml2marc {
        my ($dbh,$rtags,$rsubfields,$rvalues,%indicators) = @_;
        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
@@ -705,226 +679,227 @@
        return $record;
 }
 
-sub AUTHaddword {
-# split a subfield string and adds it into the word table.
-# removes stopwords
-    my ($dbh,$authid,$tag,$tagorder,$subfieldid,$subfieldorder,$sentence) 
address@hidden;
-    $sentence =~ s/(\.|\?|\:|\!|\'|,|\-|\"|\(|\)|\[|\]|\{|\})/ /g;
-    my @words = split / /,$sentence;
-    my $stopwords= C4::Context->stopwords;
-    my $sth=$dbh->prepare("insert into auth_word (authid, tagsubfield, 
tagorder, subfieldorder, word, sndx_word)
-                       values (?,concat(?,?),?,?,?,soundex(?))");
-    foreach my $word (@words) {
-# we record only words longer than 2 car and not in stopwords hash
-       if (length($word)>2 and !($stopwords->{uc($word)})) {
-           
$sth->execute($authid,$tag,$subfieldid,$tagorder,$subfieldorder,$word,$word);
-           if ($sth->err()) {
-               warn "ERROR ==> insert into auth_word (authid, tagsubfield, 
tagorder, subfieldorder, word, sndx_word) values 
($authid,concat($tag,$subfieldid),$tagorder,$subfieldorder,$word,soundex($word))\n";
-           }
-       }
-    }
-}
 
-sub AUTHdelword {
-# delete words. this sub deletes all the words from a sentence. a subfield 
modif is done by a delete then a add
-    my ($dbh,$authid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-    my $sth=$dbh->prepare("delete from auth_word where authid=? and 
tagsubfield=concat(?,?) and tagorder=? and subfieldorder=?");
-    $sth->execute($authid,$tag,$subfield,$tagorder,$subfieldorder);
-}
-
-sub char_decode {
-       # converts ISO 5426 coded string to ISO 8859-1
-       # sloppy code : should be improved in next issue
-       my ($string,$encoding) = @_ ;
-       $_ = $string ;
-#      $encoding = C4::Context->preference("marcflavour") unless $encoding;
-       if ($encoding eq "UNIMARC") {
-               s/\xe1/Æ/gm ;
-               s/\xe2/Ð/gm ;
-               s/\xe9/Ø/gm ;
-               s/\xec/þ/gm ;
-               s/\xf1/æ/gm ;
-               s/\xf3/ð/gm ;
-               s/\xf9/ø/gm ;
-               s/\xfb/ß/gm ;
-               s/\xc1\x61/à/gm ;
-               s/\xc1\x65/è/gm ;
-               s/\xc1\x69/ì/gm ;
-               s/\xc1\x6f/ò/gm ;
-               s/\xc1\x75/ù/gm ;
-               s/\xc1\x41/À/gm ;
-               s/\xc1\x45/È/gm ;
-               s/\xc1\x49/Ì/gm ;
-               s/\xc1\x4f/Ò/gm ;
-               s/\xc1\x55/Ù/gm ;
-               s/\xc2\x41/Á/gm ;
-               s/\xc2\x45/É/gm ;
-               s/\xc2\x49/Í/gm ;
-               s/\xc2\x4f/Ó/gm ;
-               s/\xc2\x55/Ú/gm ;
-               s/\xc2\x59/Ý/gm ;
-               s/\xc2\x61/á/gm ;
-               s/\xc2\x65/é/gm ;
-               s/\xc2\x69/í/gm ;
-               s/\xc2\x6f/ó/gm ;
-               s/\xc2\x75/ú/gm ;
-               s/\xc2\x79/ý/gm ;
-               s/\xc3\x41/Â/gm ;
-               s/\xc3\x45/Ê/gm ;
-               s/\xc3\x49/Î/gm ;
-               s/\xc3\x4f/Ô/gm ;
-               s/\xc3\x55/Û/gm ;
-               s/\xc3\x61/â/gm ;
-               s/\xc3\x65/ê/gm ;
-               s/\xc3\x69/î/gm ;
-               s/\xc3\x6f/ô/gm ;
-               s/\xc3\x75/û/gm ;
-               s/\xc4\x41/Ã/gm ;
-               s/\xc4\x4e/Ñ/gm ;
-               s/\xc4\x4f/Õ/gm ;
-               s/\xc4\x61/ã/gm ;
-               s/\xc4\x6e/ñ/gm ;
-               s/\xc4\x6f/õ/gm ;
-               s/\xc8\x45/Ë/gm ;
-               s/\xc8\x49/Ï/gm ;
-               s/\xc8\x65/ë/gm ;
-               s/\xc8\x69/ï/gm ;
-               s/\xc8\x76/ÿ/gm ;
-               s/\xc9\x41/Ä/gm ;
-               s/\xc9\x4f/Ö/gm ;
-               s/\xc9\x55/Ü/gm ;
-               s/\xc9\x61/ä/gm ;
-               s/\xc9\x6f/ö/gm ;
-               s/\xc9\x75/ü/gm ;
-               s/\xca\x41/Å/gm ;
-               s/\xca\x61/å/gm ;
-               s/\xd0\x43/Ç/gm ;
-               s/\xd0\x63/ç/gm ;
-               # this handles non-sorting blocks (if implementation requires 
this)
-               $string = nsb_clean($_) ;
-       } elsif ($encoding eq "USMARC" || $encoding eq "MARC21") {
-               if(/[\xc1-\xff]/) {
-                       s/\xe1\x61/à/gm ;
-                       s/\xe1\x65/è/gm ;
-                       s/\xe1\x69/ì/gm ;
-                       s/\xe1\x6f/ò/gm ;
-                       s/\xe1\x75/ù/gm ;
-                       s/\xe1\x41/À/gm ;
-                       s/\xe1\x45/È/gm ;
-                       s/\xe1\x49/Ì/gm ;
-                       s/\xe1\x4f/Ò/gm ;
-                       s/\xe1\x55/Ù/gm ;
-                       s/\xe2\x41/Á/gm ;
-                       s/\xe2\x45/É/gm ;
-                       s/\xe2\x49/Í/gm ;
-                       s/\xe2\x4f/Ó/gm ;
-                       s/\xe2\x55/Ú/gm ;
-                       s/\xe2\x59/Ý/gm ;
-                       s/\xe2\x61/á/gm ;
-                       s/\xe2\x65/é/gm ;
-                       s/\xe2\x69/í/gm ;
-                       s/\xe2\x6f/ó/gm ;
-                       s/\xe2\x75/ú/gm ;
-                       s/\xe2\x79/ý/gm ;
-                       s/\xe3\x41/Â/gm ;
-                       s/\xe3\x45/Ê/gm ;
-                       s/\xe3\x49/Î/gm ;
-                       s/\xe3\x4f/Ô/gm ;
-                       s/\xe3\x55/Û/gm ;
-                       s/\xe3\x61/â/gm ;
-                       s/\xe3\x65/ê/gm ;
-                       s/\xe3\x69/î/gm ;
-                       s/\xe3\x6f/ô/gm ;
-                       s/\xe3\x75/û/gm ;
-                       s/\xe4\x41/Ã/gm ;
-                       s/\xe4\x4e/Ñ/gm ;
-                       s/\xe4\x4f/Õ/gm ;
-                       s/\xe4\x61/ã/gm ;
-                       s/\xe4\x6e/ñ/gm ;
-                       s/\xe4\x6f/õ/gm ;
-                       s/\xe8\x45/Ë/gm ;
-                       s/\xe8\x49/Ï/gm ;
-                       s/\xe8\x65/ë/gm ;
-                       s/\xe8\x69/ï/gm ;
-                       s/\xe8\x76/ÿ/gm ;
-                       s/\xe9\x41/Ä/gm ;
-                       s/\xe9\x4f/Ö/gm ;
-                       s/\xe9\x55/Ü/gm ;
-                       s/\xe9\x61/ä/gm ;
-                       s/\xe9\x6f/ö/gm ;
-                       s/\xe9\x75/ü/gm ;
-                       s/\xea\x41/Å/gm ;
-                       s/\xea\x61/å/gm ;
-                       # this handles non-sorting blocks (if implementation 
requires this)
-                       $string = nsb_clean($_) ;
-               }
-       }
-       return($string) ;
-}
 
-sub nsb_clean {
-       my $NSB = '\x88' ;              # NSB : begin Non Sorting Block
-       my $NSE = '\x89' ;              # NSE : Non Sorting Block end
-       # handles non sorting blocks
-       my ($string) = @_ ;
-       $_ = $string ;
-       s/$NSB/(/gm ;
-       s/[ ]{0,1}$NSE/) /gm ;
-       $string = $_ ;
-       return($string) ;
-}
 
 sub FindDuplicate {
+
        my ($record,$authtypecode)address@hidden;
-       warn "IN for ".$record->as_formatted;
+#      warn "IN for ".$record->as_formatted;
        my $dbh = C4::Context->dbh;
-
 #      warn "".$record->as_formatted;
-       my $sth = $dbh->prepare("select auth_tag_to_report,summary from 
auth_types where authtypecode=?");
+       my $sth = $dbh->prepare("select auth_tag_to_report from auth_types 
where authtypecode=?");
        $sth->execute($authtypecode);
-       my ($auth_tag_to_report,$taglist) = $sth->fetchrow;
+       my ($auth_tag_to_report) = $sth->fetchrow;
        $sth->finish;
        # build a request for authoritysearch
        my (@tags, @and_or, @excluding, @operator, @value, $offset, $length);
-       # search on biblio.title
-#      warn " tag a reporter : $auth_tag_to_report";
-#      warn "taglist ".$taglist;
-       my @subfield = split /\[/,  $taglist;
-       my $max = @subfield;
-       for (my $i=1; $i<$max;$i++){
-               warn " ".$subfield[$i];
-               $subfield[$i]=substr($subfield[$i],3,1);
-#              warn " ".$subfield[$i];
-       }
-       
-       if ($record->fields($auth_tag_to_report)) {
-               my $sth = $dbh->prepare("select tagfield,tagsubfield from 
auth_subfield_structure where tagfield=? and authtypecode=? ");
-               $sth->execute($auth_tag_to_report,$authtypecode);
-#              warn " field $auth_tag_to_report exists";
-               while (my ($tag,$subfield) = $sth->fetchrow){
-                       if ($record->field($tag)->subfield($subfield)) {
-                               warn "tag :".$tag." subfield: $subfield value : 
".$record->field($tag)->subfield($subfield);
-                               push @tags, $tag.$subfield;
-#                              warn "'".$tag.$subfield."' value :". 
$record->field($tag)->subfield($subfield);
-                               push @and_or, "and";
+       if ($record->field($auth_tag_to_report)) {
+                               push @tags, $auth_tag_to_report;
+                               push @and_or, "";
                                push @excluding, "";
-                               push @operator, "=";
-                               push @value, 
$record->field($tag)->subfield($subfield);
-                       }
-               }
-       }
+                               push @operator, "all";
+                               push @value, 
$record->field($auth_tag_to_report)->as_string();
+                       }
  
        my ($finalresult,$nbresult) = 
authoritysearch($dbh,address@hidden,address@hidden,address@hidden,address@hidden,address@hidden,0,10,$authtypecode);
        # there is at least 1 result => return the 1st one
-       if ($nbresult) {
-               warn "XXXXX $nbresult => 
"address@hidden>{authid},@$finalresult[0]->{summary};
+       if ($nbresult>0) {
                return @$finalresult[0]->{authid},@$finalresult[0]->{summary};
        }
        # no result, returns nothing
        return;
 }
 
+sub getsummary{
+## give this a Marc record to return summary
+my ($dbh,$record,$authid,$authtypecode)address@hidden;
 
+# my $authtypecode = AUTHfind_authtypecode($dbh,$authid);
+ my $authref = getauthtype($authtypecode);
+               my $summary = $authref->{summary};
+               my @fields = $record->fields();
+#              chop $tags_using_authtype;
+               # if the library has a summary defined, use it. Otherwise, 
build a standard one
+               if ($summary) {
+                       my @fields = $record->fields();
+                       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) {
+                               } 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/<br>/g;
+               } else {
+                       my $heading; # = $authref->{summary};
+                       my $altheading;
+                       my $seeheading;
+                       my $see;
+                       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->as_string();
+                               }
+                               # rejected form(s)
+                               foreach my $field ($record->field('4..')) {
+                                       $summary.= 
"&nbsp;&nbsp;&nbsp;<i>".$field->as_string()."</i><br/>";
+                                       $summary.= 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>see:</i> ".$heading."<br/>";
+                               }
+                               # see :
+                               foreach my $field ($record->field('5..')) {
+                                       $summary.= 
"&nbsp;&nbsp;&nbsp;<i>".$field->as_string()."</i><br/>";
+                                       $summary.= 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>see:</i> ".$heading."<br/>";
+                               }
+                               # // form
+                               foreach my $field ($record->field('7..')) {
+                                       $seeheading.= 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>see also:</i> 
".$field->as_string()."<br />";     
+                                       $altheading.= 
"&nbsp;&nbsp;&nbsp;".$field->as_string()."<br />";
+                                       $altheading.= 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>see also:</i> ".$heading."<br />";
+                               }
+                               $summary = "<b>".$heading."</b><br 
/>".$seeheading.$altheading.$summary;        
+                       } else {
+                       # construct MARC21 summary
+                               foreach my $field ($record->field('1..')) {
+                                       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');       
+                                       } 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.= 
"&nbsp;&nbsp;&nbsp;".$field->as_string()."<br />";
+                                       $seeheading.= 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>see:</i> ".$seeheading."<br />";  
+                               } #See Also
+                               foreach my $field ($record->field('5..')) {
+                                       $altheading.= 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>see also:</i> 
".$field->as_string()."<br />";     
+                                       $altheading.= 
"&nbsp;&nbsp;&nbsp;".$field->as_string()."<br />";
+                                       $altheading.= 
"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>see also:</i> ".$altheading."<br />";
+                               }
+                               $summary.=$heading.$seeheading.$altheading;
+                       }
+               }
+return $summary;
+}
+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;
+       
+       
+       # 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;
+       @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) {
+               push @tags_using_authtype,$tagfield."9" ;
+       }
+
+       # now, find every biblio using this authority
+### try ZOOM search here
+my $oConnection=C4::Context->Zconn("biblioserver");
+
+
+my $query;
+
+$query= "address@hidden GILS 1=2057 ".$mergefrom;
+
+my $oResult = $oConnection->search_pqf($query);
+
+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 $oldbiblio = MARCmarc2koha($dbh,$marcrecord,"") ;
+               if ($update==1){
+               
&NEWmodbiblio($dbh,$marcrecord,$oldbiblio->{'biblionumber'},undef,"0000") ;
+               }
+               
+}#foreach $marc
+}#sub
 END { }       # module clean-up code here (global destructor)
 
 =back
@@ -937,35 +912,11 @@
 
 =cut
 
-# $Id: AuthoritiesMarc.pm,v 1.24 2006/02/09 01:56:20 rangi Exp $
+# $Id: AuthoritiesMarc.pm,v 1.25 2006/05/19 18:09:39 tgarip1957 Exp $
 # $Log: AuthoritiesMarc.pm,v $
-# Revision 1.24  2006/02/09 01:56:20  rangi
-# Hmm there seem to be quite a few subroutines twice in this module....
-#
-# Paul could you take a look and remove the ones that shouldnt be there please
-#
-# Revision 1.23  2006/02/09 01:52:14  rangi
-# Cleaning up some unessecary my statements
-#
-# Revision 1.22  2006/01/06 16:39:37  tipaul
-# synch'ing head and rel_2_2 (from 2.2.5, including npl templates)
-# Seems not to break too many things, but i'm probably wrong here.
-# at least, new features/bugfixes from 2.2.5 are here (tested on some features 
on my head local copy)
-#
-# - removing useless directories (koha-html and koha-plucene)
-#
-# Revision 1.21  2005/10/26 09:12:33  tipaul
-# big commit, still breaking things...
-#
-# * synch with rel_2_2. Probably the last non manual synch, as rel_2_2 should 
not be modified deeply.
-# * code cleaning (cleaning warnings from perl -w) continued
-#
-# Revision 1.9.2.8  2005/10/25 12:38:59  tipaul
-# * fixing bug in summary (separator before subfield was in fact after)
-# * fixing bug in authority order : authorities are not ordered alphabetically 
instead of no order. Requires all the dataset to be retrieved, but the benefits 
is important !
-#
-# Revision 1.9.2.7  2005/08/01 15:14:50  tipaul
-# minor change in summary handling (accepting 4 digits before the field)
+# Revision 1.25  2006/05/19 18:09:39  tgarip1957
+# All support for auth_subfield_tables is removed. All search is now with 
zebra authorities. New authority structure allows multiple linking of 
authorities of differnet types to one another.
+# Authority tables are modified to be compatible with new MARC frameworks. 
This change is part of Authority Linking & Zebra authorities. Requires change 
in Mysql database. It will break head unless all changes regarding this is 
implemented. This warning will take place on all commits regarding this
 #
 # 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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]