From a368cb9a3fb5429e5988f6cdf9bdbc57567d141b Mon Sep 17 00:00:00 2001 From: Paul Poulain Date: Tue, 26 May 2009 18:21:14 +0200 Subject: [PATCH] merge fixes * BiblioAddAuthorities is moved to Search.pm * missing param in addorder + 'ITEM' specified * updatedatabase fix --- C4/Search.pm | 99 ++++++++++++++++++++++++++ acqui/addorder.pl | 4 +- installer/data/mysql/updatedatabase.pl | 2 + 3 files changed, 104 insertions(+), 1 deletion(-) diff --git a/C4/Search.pm b/C4/Search.pm index 27bceb4a33..a8a0ec212e 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -63,7 +63,9 @@ This module provides searching functions for Koha's bibliographic databases &NZgetRecords &AddSearchHistory &GetDistinctValues + &BiblioAddAuthorities ); +#FIXME: i had to add BiblioAddAuthorities here because in Biblios.pm it caused circular dependencies (C4::Search uses C4::Biblio, and BiblioAddAuthorities uses SimpleSearch from C4::Search) # make all your functions, whether exported or not; @@ -2145,6 +2147,103 @@ sub z3950_search_args { push @$array, { name=>$field, value=>$bibrec->{$field}, encvalue=>$encvalue } if defined $bibrec->{$field}; } return $array; + +=head2 BiblioAddAuthorities + +( $countlinked, $countcreated ) = BiblioAddAuthorities($record, $frameworkcode); + +this function finds the authorities linked to the biblio + * search in the authority DB for the same authid (in $9 of the biblio) + * search in the authority DB for the same 001 (in $3 of the biblio in UNIMARC) + * search in the authority DB for the same values (exactly) (in all subfields of the biblio) +OR adds a new authority record + +=over 2 + +=item C + + * $record is the MARC record in question (marc blob) + * $frameworkcode is the bibliographic framework to use (if it is "" it uses the default framework) + +=item C + + * $countlinked is the number of authorities records that are linked to this authority + * $countcreated + +=item C + * I had to add this to Search.pm (instead of the logical Biblio.pm) because of a circular dependency (this sub uses SimpleSearch, and Search.pm uses Biblio.pm) +=back + +=cut + + +sub BiblioAddAuthorities{ + my ( $record, $frameworkcode ) = @_; + my $dbh=C4::Context->dbh; + my $query=$dbh->prepare(qq| +SELECT authtypecode,tagfield +FROM marc_subfield_structure +WHERE frameworkcode=? +AND (authtypecode IS NOT NULL AND authtypecode<>\"\")|); +# SELECT authtypecode,tagfield +# FROM marc_subfield_structure +# WHERE frameworkcode=? +# AND (authtypecode IS NOT NULL OR authtypecode<>\"\")|); + $query->execute($frameworkcode); + my ($countcreated,$countlinked); + while (my $data=$query->fetchrow_hashref){ + foreach my $field ($record->field($data->{tagfield})){ + next if ($field->subfield('3')||$field->subfield('9')); + # No authorities id in the tag. + # Search if there is any authorities to link to. + my $query='at='.$data->{authtypecode}.' '; + map {$query.= ' and he,ext="'.$_->[1].'"' if ($_->[0]=~/[A-z]/)} $field->subfields(); + my ($error, $results, $total_hits)=SimpleSearch( $query, undef, undef, [ "authorityserver" ] ); + # there is only 1 result + if ( $error ) { + warn "BIBLIOADDSAUTHORITIES: $error"; + return (0,0) ; + } + if ($results && scalar(@$results)==1) { + my $marcrecord = MARC::File::USMARC::decode($results->[0]); + $field->add_subfields('9'=>$marcrecord->field('001')->data); + $countlinked++; + } elsif (scalar(@$results)>1) { + #More than One result + #This can comes out of a lack of a subfield. +# my $marcrecord = MARC::File::USMARC::decode($results->[0]); +# $record->field($data->{tagfield})->add_subfields('9'=>$marcrecord->field('001')->data); + $countlinked++; + } else { + #There are no results, build authority record, add it to Authorities, get authid and add it to 9 + ###NOTICE : This is only valid if a subfield is linked to one and only one authtypecode + ###NOTICE : This can be a problem. We should also look into other types and rejected forms. + my $authtypedata=C4::AuthoritiesMarc->GetAuthType($data->{authtypecode}); + next unless $authtypedata; + my $marcrecordauth=MARC::Record->new(); + my $authfield=MARC::Field->new($authtypedata->{auth_tag_to_report},'','',"a"=>"".$field->subfield('a')); + map { $authfield->add_subfields($_->[0]=>$_->[1]) if ($_->[0]=~/[A-z]/ && $_->[0] ne "a" )} $field->subfields(); + $marcrecordauth->insert_fields_ordered($authfield); + + # bug 2317: ensure new authority knows it's using UTF-8; currently + # only need to do this for MARC21, as MARC::Record->as_xml_record() handles + # automatically for UNIMARC (by not transcoding) + # FIXME: AddAuthority() instead should simply explicitly require that the MARC::Record + # use UTF-8, but as of 2008-08-05, did not want to introduce that kind + # of change to a core API just before the 3.0 release. + if (C4::Context->preference('marcflavour') eq 'MARC21') { + SetMarcUnicodeFlag($marcrecordauth, 'MARC21'); + } + +# warn "AUTH RECORD ADDED : ".$marcrecordauth->as_formatted; + + my $authid=AddAuthority($marcrecordauth,'',$data->{authtypecode}); + $countcreated++; + $field->add_subfields('9'=>$authid); + } + } + } + return ($countlinked,$countcreated); } =head2 GetDistinctValues($field); diff --git a/acqui/addorder.pl b/acqui/addorder.pl index 1cb4c23739..255dd7e4f0 100755 --- a/acqui/addorder.pl +++ b/acqui/addorder.pl @@ -173,6 +173,7 @@ my $purchaseorder = $input->param('purchaseordernumber'); my $invoice = $input->param('invoice'); my $publishercode = $input->param('publishercode'); my $suggestionid = $input->param('suggestionid'); +my $biblionumber = $input->param('biblionumber'); my $user = $input->remote_user; my $uncertainprice = $input->param('uncertainprice'); @@ -288,7 +289,8 @@ if ( $quantity ne '0' ) { $itemhash{$item}->{'subfields'}, $itemhash{$item}->{'field_values'}, $itemhash{$item}->{'ind_tag'}, - $itemhash{$item}->{'indicator'}); + $itemhash{$item}->{'indicator'}, + 'ITEM'); my $record=MARC::Record::new_from_xml($xml, 'UTF-8'); my ($biblionumber,$bibitemnum,$itemnumber) = AddItemFromMarc($record,$biblionumber); NewOrderItem($itemnumber, $ordnum); diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl index 18674e7112..df3b1d6019 100755 --- a/installer/data/mysql/updatedatabase.pl +++ b/installer/data/mysql/updatedatabase.pl @@ -2456,6 +2456,8 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { # borrower reading record privacy : 0 : forever, 1 : laws, 2 : don't keep at all $dbh->do("ALTER TABLE `borrowers` ADD `privacy` INTEGER NOT NULL DEFAULT 1;"); print "Upgrade to $DBversion done (add new syspref and column in borrowers)\n"; + SetVersion ($DBversion); +} $DBversion = '3.01.00.036'; if (C4::Context->preference("Version") < TransformToNum($DBversion)) { -- 2.39.5