[Koha-patches] [PATCH 74/78] merge fixes
paul.poulain at biblibre.com
paul.poulain at biblibre.com
Thu May 28 18:33:24 CEST 2009
From: Paul Poulain <paul.poulain at biblibre.com>
* BiblioAddAuthorities is moved to Search.pm
* missing param in addorder + 'ITEM' specified
* updatedatabase fix
---
C4/Search.pm | 102 ++++++++++++++++++++++++++++++++
acqui/addorder.pl | 4 +-
installer/data/mysql/updatedatabase.pl | 2 +
3 files changed, 107 insertions(+), 1 deletions(-)
diff --git a/C4/Search.pm b/C4/Search.pm
index 9229746..041eaba 100644
--- a/C4/Search.pm
+++ b/C4/Search.pm
@@ -60,7 +60,9 @@ This module provides searching functions for Koha's bibliographic databases
&getRecords
&buildQuery
&NZgetRecords
+ &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;
@@ -2109,6 +2111,106 @@ sub NZorder {
}
}
+
+=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<input arg:>
+
+ * $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<Output arg:>
+
+ * $countlinked is the number of authorities records that are linked to this authority
+ * $countcreated
+
+=item C<BUGS>
+ * 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);
+}
+
+
END { } # module clean-up code here (global destructor)
1;
diff --git a/acqui/addorder.pl b/acqui/addorder.pl
index 1cb4c23..255dd7e 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 11a6584..dd141f3 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -2454,6 +2454,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)) {
--
1.6.0.4
More information about the Koha-patches
mailing list