adding authentification with Auth.pm and
[koha_fer] / C4 / Biblio.pm
index 58cf58d..f320c5e 100644 (file)
@@ -1,6 +1,10 @@
 package C4::Biblio;
 # $Id$
 # $Log$
+# Revision 1.29  2002/12/12 16:35:00  tipaul
+# adding authentification with Auth.pm and
+# MAJOR BUGFIX on marc biblio modification
+#
 # Revision 1.28  2002/12/10 13:30:03  tipaul
 # fugfixes from Dombes Abbey work
 #
@@ -450,6 +454,7 @@ sub MARCaddbiblio {
 sub MARCadditem {
 # pass the MARC::Record to this function, and it will create the records in the marc tables
     my ($dbh,$record,$biblionumber) = @_;
+    warn "adding : ".$record->as_formatted();
 # search for MARC biblionumber
     $dbh->do("lock tables marc_biblio WRITE,marc_subfield_table WRITE, marc_word WRITE, marc_blob_subfield WRITE, stopwords READ");
     my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblionumber);
@@ -470,6 +475,13 @@ sub MARCadditem {
                                 $subfieldcount+1,
                                 $subfields[$subfieldcount][1]
                                 );
+                                warn "ADDING :$bibid,".
+                                $field->tag().
+                                $field->indicator(1).$field->indicator(2).",
+                                $fieldcount,
+                                $subfields[$subfieldcount][0],
+                                $subfieldcount+1,
+                                $subfields[$subfieldcount][1]";
        }
     }
     $dbh->do("unlock tables");
@@ -478,37 +490,37 @@ sub MARCadditem {
 
 sub MARCaddsubfield {
 # Add a new subfield to a tag into the DB.
-    my ($dbh,$bibid,$tagid,$tag_indicator,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue) = @_;
-    # if not value, end of job, we do nothing
-    if (not($subfieldvalue)) {
-       return;
-    }
+       my ($dbh,$bibid,$tagid,$tag_indicator,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue) = @_;
+       # if not value, end of job, we do nothing
+       if (length($subfieldvalue) ==0) {
+               return;
+       }
     if (not($subfieldcode)) {
        $subfieldcode=' ';
     }
-    if (length($subfieldvalue)>255) {
-#      $dbh->do("lock tables marc_blob_subfield WRITE, marc_subfield_table WRITE");
-       my $sth=$dbh->prepare("insert into marc_blob_subfield (subfieldvalue) values (?)");
-       $sth->execute($subfieldvalue);
-       $sth=$dbh->prepare("select max(blobidlink)from marc_blob_subfield");
-       $sth->execute;
-       my ($res)=$sth->fetchrow;
-       $sth=$dbh->prepare("insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,valuebloblink) values (?,?,?,?,?,?,?)");
-       if ($tagid<100) {
-           $sth->execute($bibid,'0'.$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$res);
-       } else {
-           $sth->execute($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$res);
-       }
-       if ($sth->errstr) {
-           print STDERR "ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
-       }
+       if (length($subfieldvalue)>255) {
+       #       $dbh->do("lock tables marc_blob_subfield WRITE, marc_subfield_table WRITE");
+               my $sth=$dbh->prepare("insert into marc_blob_subfield (subfieldvalue) values (?)");
+               $sth->execute($subfieldvalue);
+               $sth=$dbh->prepare("select max(blobidlink)from marc_blob_subfield");
+               $sth->execute;
+               my ($res)=$sth->fetchrow;
+               $sth=$dbh->prepare("insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,valuebloblink) values (?,?,?,?,?,?,?)");
+               if ($tagid<100) {
+               $sth->execute($bibid,'0'.$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$res);
+               } else {
+               $sth->execute($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$res);
+               }
+               if ($sth->errstr) {
+               print STDERR "ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
+               }
 #      $dbh->do("unlock tables");
-    } else {
-       my $sth=$dbh->prepare("insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values (?,?,?,?,?,?,?)");
-       $sth->execute($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue);
-       if ($sth->errstr) {
-           print STDERR "ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
-       }
+       } else {
+               my $sth=$dbh->prepare("insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values (?,?,?,?,?,?,?)");
+               $sth->execute($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue);
+               if ($sth->errstr) {
+               print STDERR "ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
+               }
     }
     &MARCaddword($dbh,$bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
 }
@@ -520,12 +532,12 @@ sub MARCgetbiblio {
 #---- TODO : the leader is missing
     my $sth=$dbh->prepare("select bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink
                                 from marc_subfield_table
-                                where bibid=? order by tagorder,subfieldorder
+                                where bibid=? order by tag,tagorder,subfieldcode
                         ");
     my $sth2=$dbh->prepare("select subfieldvalue from marc_blob_subfield where blobidlink=?");
     $sth->execute($bibid);
     my $prevtagorder=1;
-    my $prevtag;
+    my $prevtag='  ';
     my $previndicator;
     my %subfieldlist={};
     while (my $row=$sth->fetchrow_hashref) {
@@ -541,6 +553,7 @@ sub MARCgetbiblio {
                                $prevtag = "0".$prevtag;
                        }
                        $previndicator.="  ";
+#                      warn "NEW : subfieldcode : $prevtag";
                        my $field = MARC::Field->new( $prevtag, substr($previndicator,0,1), substr($previndicator,1,1), %subfieldlist);
 #                      warn $field->as_formatted();
                        $record->add_fields($field);
@@ -550,7 +563,11 @@ sub MARCgetbiblio {
                        %subfieldlist={};
                        %subfieldlist->{$row->{'subfieldcode'}} = $row->{'subfieldvalue'};
                } else {
-                       %subfieldlist->{$row->{'subfieldcode'}} = $row->{'subfieldvalue'};
+                       warn "subfieldcode : $row->{'subfieldcode'} / value : $row->{'subfieldvalue'}, tag : $row->{tag}";
+                       if (%subfieldlist->{$row->{'subfieldcode'}}) {
+                               %subfieldlist->{$row->{'subfieldcode'}}.='|';
+                       }
+                       %subfieldlist->{$row->{'subfieldcode'}} .= $row->{'subfieldvalue'};
                        $prevtag= $row->{tag};
                        $previndicator=$row->{tag_indicator};
                }
@@ -571,7 +588,7 @@ sub MARCgetitem {
 #---- TODO : the leader is missing
     my $sth=$dbh->prepare("select bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink
                                 from marc_subfield_table
-                                where bibid=? and tagorder=? order by subfieldorder
+                                where bibid=? and tagorder=? order by subfieldcode,subfieldorder
                         ");
        $sth2=$dbh->prepare("select subfieldvalue from marc_blob_subfield where blobidlink=?");
        $sth->execute($bibid,$tagorder);
@@ -610,6 +627,9 @@ sub MARCgetitem {
 sub MARCmodbiblio {
     my ($dbh,$record,$bibid,$itemnumber,$delete)=@_;
     my $oldrecord=&MARCgetbiblio($dbh,$bibid);
+    warn "OLD : ".$oldrecord->as_formatted();
+    warn "----------------------------------\nNEW : ".$record->as_formatted();
+    warn "\n";
 # if nothing to change, don't waste time...
     if ($oldrecord eq $record) {
 #    warn "NOTHING TO CHANGE";
@@ -649,7 +669,9 @@ sub MARCmoditem {
 #              warn "nothing to change";
                return;
        }
-#      warn "MARCmoditem : ".$record->as_formatted;
+       warn "MARCmoditem : ".$record->as_formatted;
+       warn "OLD : ".$oldrecord->as_formatted;
+
        # otherwise, skip through each subfield...
        my @fields = $record->fields();
        # search old MARC item
@@ -661,26 +683,29 @@ sub MARCmoditem {
                my @subfields=$field->subfields();
                my $subfieldorder=0;
                foreach my $subfield (@subfields) {
-               $subfieldorder++;
-               if ($oldfield eq 0 or (! $oldfield->subfield(@$subfield[0])) ) {
-       # just adding datas...
+                       $subfieldorder++;
+                       warn "compare : $oldfield".$oldfield->subfield(@$subfield[0]);
+                       if ($oldfield eq 0 or (length($oldfield->subfield(@$subfield[0])) ==0) ) {
+               # just adding datas...
 #              warn "addfield : / $subfieldorder / @$subfield[0] - @$subfield[1]";
-                       &MARCaddsubfield($dbh,$bibid,$field->tag(),$field->indicator(1).$field->indicator(2),
-                                       $tagorder,@$subfield[0],$subfieldorder,@$subfield[1]);
-               } else {
-#              warn "modfield : / $subfieldorder / @$subfield[0] - @$subfield[1]";
-       # modify he subfield if it's a different string
-                       if ($oldfield->subfield(@$subfield[0]) ne @$subfield[1] ) {
-                               my $subfieldid=&MARCfindsubfieldid($dbh,$bibid,$field->tag(),$tagorder,@$subfield[0],$subfieldorder);
-#                              warn "HERE : $subfieldid, $bibid,$field->tag(),$tagorder,@$subfield[0],$subfieldorder";
-                               &MARCmodsubfield($dbh,$subfieldid,@$subfield[1]);
+                               warn "NEW subfield : $bibid,".$field->tag().",".$tagorder.",".@$subfield[0].",".$subfieldorder.",".@$subfield[1].")";
+                               &MARCaddsubfield($dbh,$bibid,$field->tag(),$field->indicator(1).$field->indicator(2),
+                                               $tagorder,@$subfield[0],$subfieldorder,@$subfield[1]);
                        } else {
+#              warn "modfield : / $subfieldorder / @$subfield[0] - @$subfield[1]";
+               # modify he subfield if it's a different string
+                               if ($oldfield->subfield(@$subfield[0]) ne @$subfield[1] ) {
+                                       my $subfieldid=&MARCfindsubfieldid($dbh,$bibid,$field->tag(),$tagorder,@$subfield[0],$subfieldorder);
+                                       warn "changing : $subfieldid, $bibid,".$field->tag(),",$tagorder,@$subfield[0],@$subfield[1],$subfieldorder";
+                                       &MARCmodsubfield($dbh,$subfieldid,@$subfield[1]);
+                               } else {
 #FIXME ???
-                               warn "ICI";
+                                       warn "nothing to change : ".$oldfield->subfield(@$subfield[0]);
+                               }
                        }
                }
-               }
        }
+       warn "-----------------------";
 }
 
 
@@ -754,12 +779,19 @@ sub MARCfindsubfield {
 }
 
 sub MARCfindsubfieldid {
-    my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
-    my $sth=$dbh->prepare("select subfieldid from marc_subfield_table
-                       where bibid=? and tag=? and tagorder=?
-                               and subfieldcode=? and subfieldorder=?");
-    $sth->execute($bibid,$tag,$tagorder,$subfield,$subfieldorder);
-    my ($res) = $sth->fetchrow;
+       my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
+       my $sth=$dbh->prepare("select subfieldid from marc_subfield_table
+                               where bibid=? and tag=? and tagorder=?
+                                       and subfieldcode=? and subfieldorder=?");
+       $sth->execute($bibid,$tag,$tagorder,$subfield,$subfieldorder);
+       my ($res) = $sth->fetchrow;
+       unless ($res) {
+               $sth=$dbh->prepare("select subfieldid from marc_subfield_table
+                               where bibid=? and tag=? and tagorder=?
+                                       and subfieldcode=?");
+               $sth->execute($bibid,$tag,$tagorder,$subfield);
+               ($res) = $sth->fetchrow;
+       }
     return $res;
 }
 
@@ -880,7 +912,7 @@ sub MARChtml2marc {
        my $prevtag = @$rtags[0];
        my $record = MARC::Record->new();
        my %subfieldlist={};
-       for (my $i=0; $i<= @$rtags; $i++) {
+       for (my $i=0; $i< @$rtags; $i++) {
                # rebuild MARC::Record
                if (@$rtags[$i] ne $prevtag) {
                        if ($prevtag<10) {
@@ -892,9 +924,14 @@ sub MARChtml2marc {
                        $prevtag = @$rtags[$i];
                        %subfieldlist={};
                        %subfieldlist->{@$rsubfields[$i]} = @$rvalues[$i];
+                       warn " ==>@$rsubfields[$i]} = @$rvalues[$i];";
                } else {
-                       %subfieldlist->{@$rsubfields[$i]} = @$rvalues[$i];
+#                      if (%subfieldlist->{@$rsubfields[$i]}) {
+#                              %subfieldlist->{@$rsubfields[$i]} .= '|';
+#                      }
+                       %subfieldlist->{@$rsubfields[$i]} .=@$rvalues[$i];
                        $prevtag= @$rtags[$i];
+                       warn " ==>@$rsubfields[$i]} ,= @$rvalues[$i];";
                }
        }
        # the last has not been included inside the loop... do it now !