support for subtitles, additional authors, subject.
authortipaul <tipaul>
Mon, 19 May 2003 13:45:18 +0000 (13:45 +0000)
committertipaul <tipaul>
Mon, 19 May 2003 13:45:18 +0000 (13:45 +0000)
This supports is only for MARC <-> OLD-DB link. It worked previously, but values entered as MARC were not reported to OLD-DB, neither values entered as OLD-DB were reported to MARC.
Note that some OLD-DB subs are strange (dummy ?) see OLDmodsubject, OLDmodsubtitle, OLDmodaddiauthor in C4/Biblio.pm
For example it seems impossible to have more that 1 addi author and 1 subtitle. In MARC it's not the case. So, if you enter more than one, I'm afraid only the LAST will be stored.

C4/Biblio.pm

index d1add18..a7a11ab 100644 (file)
@@ -1,6 +1,12 @@
 package C4::Biblio;
 # $Id$
 # $Log$
+# Revision 1.46  2003/05/19 13:45:18  tipaul
+# support for subtitles, additional authors, subject.
+# This supports is only for MARC <-> OLD-DB link. It worked previously, but values entered as MARC were not reported to OLD-DB, neither values entered as OLD-DB were reported to MARC.
+# Note that some OLD-DB subs are strange (dummy ?) see OLDmodsubject, OLDmodsubtitle, OLDmodaddiauthor in C4/Biblio.pm
+# For example it seems impossible to have more that 1 addi author and 1 subtitle. In MARC it's not the case. So, if you enter more than one, I'm afraid only the LAST will be stored.
+#
 # Revision 1.45  2003/04/29 16:50:49  tipaul
 # really proud of this commit :-)
 # z3950 search and import seems to works fine.
@@ -412,10 +418,8 @@ Returns a MARC::Record for the biblio $bibid.
 =item &MARCmodbiblio($dbh,$bibid,$record,$delete);
 
 MARCmodbiblio changes a biblio for a biblio,MARC::Record passed as parameter
-if $delete == 1, every field/subfield not found is deleted in the biblio
-otherwise, only data passed to MARCmodbiblio is managed.
-thus, you can change only a small part of a biblio (like an item, or a subtitle, or a additionalauthor...)
-
+It 1st delete the biblio, then recreates it.
+WARNING : the $delete parameter is not used anymore (too much unsolvable cases).
 =item ($subfieldid,$subfieldvalue) = &MARCmodsubfield($dbh,$subfieldid,$subfieldvalue);
 
 MARCmodsubfield changes the value of a given subfield
@@ -934,8 +938,23 @@ sub MARCkoha2marcBiblio {
            }
        }
     }
+       # other fields => additional authors, subjects, subtitles
+       my $sth2=$dbh->prepare(" SELECT author FROM additionalauthors WHERE biblionumber=?");
+       $sth2->execute($biblionumber);
+       while (my $row=$sth2->fetchrow_hashref) {
+                       &MARCkoha2marcOnefield($sth,$record,"additionalauthors.author",$row->{'author'});
+               }
+       my $sth2=$dbh->prepare(" SELECT subject FROM bibliosubject WHERE biblionumber=?");
+       $sth2->execute($biblionumber);
+       while (my $row=$sth2->fetchrow_hashref) {
+                       &MARCkoha2marcOnefield($sth,$record,"bibliosubject.subject",$row->{'subject'});
+               }
+       my $sth2=$dbh->prepare(" SELECT subtitle FROM bibliosubtitle WHERE biblionumber=?");
+       $sth2->execute($biblionumber);
+       while (my $row=$sth2->fetchrow_hashref) {
+                       &MARCkoha2marcOnefield($sth,$record,"bibliosubtitle.title",$row->{'subtitle'});
+               }
     return $record;
-# TODO : retrieve notes, additionalauthors
 }
 
 sub MARCkoha2marcItem {
@@ -963,7 +982,6 @@ sub MARCkoha2marcItem {
        }
     }
     return $record;
-# TODO : retrieve notes, additionalauthors
 }
 
 sub MARCkoha2marcSubtitle {
@@ -1034,7 +1052,7 @@ sub MARChtml2marc {
        }
        # the last has not been included inside the loop... do it now !
        $record->add_fields($field);
-       warn $record->as_formatted;
+#      warn $record->as_formatted;
        return $record;
 }
 
@@ -1134,60 +1152,114 @@ adds an item in the db.
 =cut
 
 sub NEWnewbiblio {
-    my ($dbh, $record, $oldbiblio, $oldbiblioitem) = @_;
-# note $oldbiblio and $oldbiblioitem are not mandatory.
-# if not present, they will be builded from $record with MARCmarc2koha function
-    if (($oldbiblio) and not($oldbiblioitem)) {
-       print STDERR "NEWnewbiblio : missing parameter\n";
-       print "NEWnewbiblio : missing parameter : contact koha development  team\n";
-       die;
-    }
-    my $oldbibnum;
-    my $oldbibitemnum;
-    if ($oldbiblio) {
-       $oldbibnum = OLDnewbiblio($dbh,$oldbiblio);
-       $oldbiblioitem->{'biblionumber'} = $oldbibnum;
-       $oldbibitemnum = OLDnewbiblioitem($dbh,$oldbiblioitem);
-    } else {
-       my $olddata = MARCmarc2koha($dbh,$record);
-       $oldbibnum = OLDnewbiblio($dbh,$olddata);
-       $olddata->{'biblionumber'} = $oldbibnum;
-       $oldbibitemnum = OLDnewbiblioitem($dbh,$olddata);
-    }
-# we must add bibnum and bibitemnum in MARC::Record...
-# we build the new field with biblionumber and biblioitemnumber
-# we drop the original field
-# we add the new builded field.
-# NOTE : Works only if the field is ONLY for biblionumber and biblioitemnumber
-# (steve and paul : thinks 090 is a good choice)
-    my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
-    $sth->execute("biblio.biblionumber");
-    (my $tagfield1, my $tagsubfield1) = $sth->fetchrow;
-    $sth->execute("biblioitems.biblioitemnumber");
-    (my $tagfield2, my $tagsubfield2) = $sth->fetchrow;
-    if ($tagfield1 != $tagfield2) {
-       warn "Error in NEWnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
-       print "Content-Type: text/html\n\nError in NEWnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
-       die;
-    }
-    my $newfield = MARC::Field->new( $tagfield1,'','',
-                                    "$tagsubfield1" => $oldbibnum,
-                                    "$tagsubfield2" => $oldbibitemnum);
-# drop old field and create new one...
-    my $old_field = $record->field($tagfield1);
-    $record->delete_field($old_field);
-    $record->add_fields($newfield);
-    my $bibid = MARCaddbiblio($dbh,$record,$oldbibnum);
-    return ($bibid,$oldbibnum,$oldbibitemnum );
+       my ($dbh, $record, $oldbiblio, $oldbiblioitem) = @_;
+       # note $oldbiblio and $oldbiblioitem are not mandatory.
+       # if not present, they will be builded from $record with MARCmarc2koha function
+       if (($oldbiblio) and not($oldbiblioitem)) {
+               print STDERR "NEWnewbiblio : missing parameter\n";
+               print "NEWnewbiblio : missing parameter : contact koha development  team\n";
+               die;
+       }
+       my $oldbibnum;
+       my $oldbibitemnum;
+       if ($oldbiblio) {
+               $oldbibnum = OLDnewbiblio($dbh,$oldbiblio);
+               $oldbiblioitem->{'biblionumber'} = $oldbibnum;
+               $oldbibitemnum = OLDnewbiblioitem($dbh,$oldbiblioitem);
+       } else {
+               my $olddata = MARCmarc2koha($dbh,$record);
+               $oldbibnum = OLDnewbiblio($dbh,$olddata);
+               $olddata->{'biblionumber'} = $oldbibnum;
+               $oldbibitemnum = OLDnewbiblioitem($dbh,$olddata);
+       }
+       # search subtiles, addiauthors and subjects
+       my ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"additionalauthors.author");
+       my @addiauthfields = $record->field($tagfield);
+       foreach my $addiauthfield (@addiauthfields) {
+               my @addiauthsubfields = $addiauthfield->subfield($tagsubfield);
+               foreach my $subfieldcount (0..$#addiauthsubfields) {
+                       OLDmodaddauthor($dbh,$oldbibnum,$addiauthsubfields[$subfieldcount]);
+               }
+       }
+       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubtitle.subtitle");
+       my @subtitlefields = $record->field($tagfield);
+       foreach my $subtitlefield (@subtitlefields) {
+               my @subtitlesubfields = $subtitlefield->subfield($tagsubfield);
+               foreach my $subfieldcount (0..$#subtitlesubfields) {
+                       OLDnewsubtitle($dbh,$oldbibnum,$subtitlesubfields[$subfieldcount]);
+               }
+       }
+       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubject.subject");
+       my @subj = $record->field($tagfield);
+       foreach my $subject (@subj) {
+               my @subjsubfield = $subject->subfield($tagsubfield);
+               my @subjects;
+               foreach my $subfieldcount (0..$#subjsubfield) {
+                       push @subjects,$subjsubfield[$subfieldcount];
+               }
+               OLDmodsubject($dbh,$oldbibnum,1,@subjects);
+       }
+       # we must add bibnum and bibitemnum in MARC::Record...
+       # we build the new field with biblionumber and biblioitemnumber
+       # we drop the original field
+       # we add the new builded field.
+       # NOTE : Works only if the field is ONLY for biblionumber and biblioitemnumber
+       # (steve and paul : thinks 090 is a good choice)
+       my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
+       $sth->execute("biblio.biblionumber");
+       (my $tagfield1, my $tagsubfield1) = $sth->fetchrow;
+       $sth->execute("biblioitems.biblioitemnumber");
+       (my $tagfield2, my $tagsubfield2) = $sth->fetchrow;
+       if ($tagfield1 != $tagfield2) {
+               warn "Error in NEWnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
+               print "Content-Type: text/html\n\nError in NEWnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
+               die;
+       }
+       my $newfield = MARC::Field->new( $tagfield1,'','',
+                                               "$tagsubfield1" => $oldbibnum,
+                                               "$tagsubfield2" => $oldbibitemnum);
+       # drop old field and create new one...
+       my $old_field = $record->field($tagfield1);
+       $record->delete_field($old_field);
+       $record->add_fields($newfield);
+       my $bibid = MARCaddbiblio($dbh,$record,$oldbibnum);
+       return ($bibid,$oldbibnum,$oldbibitemnum );
 }
 
 sub NEWmodbiblio {
-my ($dbh,$record,$bibid) =@_;
-&MARCmodbiblio($dbh,$bibid,$record,0);
-my $oldbiblio = MARCmarc2koha($dbh,$record);
-my $oldbiblionumber = OLDmodbiblio($dbh,$oldbiblio);
-OLDmodbibitem($dbh,$oldbiblio);
-return 1;
+       my ($dbh,$record,$bibid) =@_;
+       &MARCmodbiblio($dbh,$bibid,$record,0);
+       my $oldbiblio = MARCmarc2koha($dbh,$record);
+       my $oldbiblionumber = OLDmodbiblio($dbh,$oldbiblio);
+       OLDmodbibitem($dbh,$oldbiblio);
+       # now, modify addi authors, subject, addititles.
+       my ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"additionalauthors.author");
+       my @addiauthfields = $record->field($tagfield);
+       foreach my $addiauthfield (@addiauthfields) {
+               my @addiauthsubfields = $addiauthfield->subfield($tagsubfield);
+               foreach my $subfieldcount (0..$#addiauthsubfields) {
+                       OLDmodaddauthor($dbh,$oldbiblionumber,$addiauthsubfields[$subfieldcount]);
+               }
+       }
+       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubtitle.subtitle");
+       my @subtitlefields = $record->field($tagfield);
+       foreach my $subtitlefield (@subtitlefields) {
+               my @subtitlesubfields = $subtitlefield->subfield($tagsubfield);
+               foreach my $subfieldcount (0..$#subtitlesubfields) {
+                       OLDmodsubtitle($dbh,$oldbiblionumber,$subtitlesubfields[$subfieldcount]);
+               }
+       }
+       ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubject.subject");
+       my @subj = $record->field($tagfield);
+       foreach my $subject (@subj) {
+               my @subjsubfield = $subject->subfield($tagsubfield);
+               my @subjects;
+               foreach my $subfieldcount (0..$#subjsubfield) {
+                       push @subjects,$subjsubfield[$subfieldcount];
+               }
+               OLDmodsubject($dbh,$oldbiblionumber,1,@subjects);
+       }
+       return 1;
 }
 
 
@@ -1355,65 +1427,55 @@ sub OLDmodaddauthor {
 
 
 sub OLDmodsubject {
-    my ($dbh,$bibnum, $force, @subject) = @_;
-#  my $dbh   = C4Connect;
-    my $count = @subject;
-    my $error;
-    for (my $i = 0; $i < $count; $i++) {
-       $subject[$i] =~ s/^ //g;
-       $subject[$i] =~ s/ $//g;
-       my $query = "select * from catalogueentry
-                       where entrytype = 's'
-                               and catalogueentry = '$subject[$i]'";
-       my $sth   = $dbh->prepare($query);
-       $sth->execute;
-
-       if (my $data = $sth->fetchrow_hashref) {
-       } else {
-           if ($force eq $subject[$i]) {
-               # subject not in aut, chosen to force anway
-               # so insert into cataloguentry so its in auth file
-               $query = "Insert into catalogueentry
-                               (entrytype,catalogueentry)
-                           values ('s','$subject[$i]')";
-        my $sth2 = $dbh->prepare($query);
-
-        $sth2->execute;
-        $sth2->finish;
-      } else {
-        $error = "$subject[$i]\n does not exist in the subject authority file";
-        $query = "Select * from catalogueentry
-                           where entrytype = 's'
-                           and (catalogueentry like '$subject[$i] %'
-                                or catalogueentry like '% $subject[$i] %'
-                                or catalogueentry like '% $subject[$i]')";
-        my $sth2 = $dbh->prepare($query);
-
-        $sth2->execute;
-        while (my $data = $sth2->fetchrow_hashref) {
-          $error .= "<br>$data->{'catalogueentry'}";
-        } # while
-        $sth2->finish;
-      } # else
-    } # else
-    $sth->finish;
-  } # else
-  if ($error eq '') {
-    my $query = "Delete from bibliosubject where biblionumber = $bibnum";
-    my $sth   = $dbh->prepare($query);
-    $sth->execute;
-    $sth->finish;
-    for (my $i = 0; $i < $count; $i++) {
-      $sth = $dbh->prepare("Insert into bibliosubject
-                           values ('$subject[$i]', $bibnum)");
+       my ($dbh,$bibnum, $force, @subject) = @_;
+       #  my $dbh   = C4Connect;
+       my $count = @subject;
+       my $error;
+       for (my $i = 0; $i < $count; $i++) {
+               $subject[$i] =~ s/^ //g;
+               $subject[$i] =~ s/ $//g;
+               my $query = "select * from catalogueentry where entrytype = 's' and catalogueentry = '$subject[$i]'";
+               my $sth   = $dbh->prepare($query);
+               $sth->execute;
 
-      $sth->execute;
-      $sth->finish;
-    } # for
-  } # if
+               if (my $data = $sth->fetchrow_hashref) {
+               } else {
+                       if ($force eq $subject[$i]) {
+                               # subject not in aut, chosen to force anway
+                               # so insert into cataloguentry so its in auth file
+                               $query = "Insert into catalogueentry (entrytype,catalogueentry) values ('s','$subject[$i]')";
+                               my $sth2 = $dbh->prepare($query);
+
+                               $sth2->execute;
+                               $sth2->finish;
+                       } else {
+                               $error = "$subject[$i]\n does not exist in the subject authority file";
+                               $query = "Select * from catalogueentry where entrytype = 's' and (catalogueentry like '$subject[$i] %'
+                                                                       or catalogueentry like '% $subject[$i] %' or catalogueentry like '% $subject[$i]')";
+                               my $sth2 = $dbh->prepare($query);
+                               $sth2->execute;
+                               while (my $data = $sth2->fetchrow_hashref) {
+                                       $error .= "<br>$data->{'catalogueentry'}";
+                               } # while
+                               $sth2->finish;
+                       } # else
+               } # else
+               $sth->finish;
+       } # else
+       if ($error eq '') {
+               my $query = "Delete from bibliosubject where biblionumber = $bibnum";
+               my $sth   = $dbh->prepare($query);
+               $sth->execute;
+               $sth->finish;
+               for (my $i = 0; $i < $count; $i++) {
+                       $sth = $dbh->prepare("Insert into bibliosubject values ('$subject[$i]', $bibnum)");
+                       $sth->execute;
+                       $sth->finish;
+               } # for
+       } # if
 
-#  $dbh->disconnect;
-  return($error);
+       #  $dbh->disconnect;
+       return($error);
 } # sub modsubject
 
 sub OLDmodbibitem {
@@ -1513,28 +1575,18 @@ sub OLDnewbiblioitem {
 
 sub OLDnewsubject {
   my ($dbh,$bibnum)=@_;
-#  my $dbh=C4Connect;
-  my $query="insert into bibliosubject (biblionumber) values
-  ($bibnum)";
+  my $query="insert into bibliosubject (biblionumber) values ($bibnum)";
   my $sth=$dbh->prepare($query);
-#  print $query;
   $sth->execute;
   $sth->finish;
-#  $dbh->disconnect;
 }
 
 sub OLDnewsubtitle {
     my ($dbh,$bibnum, $subtitle) = @_;
-#  my $dbh   = C4Connect;
-    my $query = "insert into bibliosubtitle set
-                            biblionumber = ?,
-                            subtitle = ?";
+    my $query = "insert into bibliosubtitle set biblionumber = ?, subtitle = ?";
     my $sth   = $dbh->prepare($query);
-
     $sth->execute($bibnum,$subtitle);
-
     $sth->finish;
-#  $dbh->disconnect;
 }
 
 
@@ -1778,9 +1830,13 @@ sub getsingleorder {
 }
 
 sub newbiblio {
-  my ($biblio) = @_;
-  my $dbh    = C4::Context->dbh;
-  my $bibnum=OLDnewbiblio($dbh,$biblio);
+       my ($biblio) = @_;
+       my $dbh    = C4::Context->dbh;
+       my $bibnum=OLDnewbiblio($dbh,$biblio);
+       # finds new (MARC bibid
+       my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$bibnum);
+       my $record = &MARCkoha2marcBiblio($dbh,$bibnum);
+       MARCaddbiblio($dbh,$record,$bibnum);
 # FIXME : MARC add
   return($bibnum);
 }
@@ -1804,11 +1860,14 @@ successful or not.
 =cut
 
 sub modbiblio {
-  my ($biblio) = @_;
-  my $dbh  = C4::Context->dbh;
-  my $biblionumber=OLDmodbiblio($dbh,$biblio);
-  return($biblionumber);
-# FIXME : MARC mod
+       my ($biblio) = @_;
+       my $dbh  = C4::Context->dbh;
+       my $biblionumber=OLDmodbiblio($dbh,$biblio);
+       my $record = MARCkoha2marcBiblio($dbh,$biblionumber);
+       # finds new (MARC bibid
+       my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblionumber);
+       MARCmodbiblio($dbh,$bibid,$record,0);
+       return($biblionumber);
 } # sub modbiblio
 
 =item modsubtitle