View | Details | Raw Unified | Return to bug 11300
Collapse All | Expand All

(-)a/C4/Biblio.pm (-3 / +15 lines)
Lines 106-111 use Koha::SearchEngine; Link Here
106
use Koha::SearchEngine::Indexer;
106
use Koha::SearchEngine::Indexer;
107
use Koha::Libraries;
107
use Koha::Libraries;
108
use Koha::Util::MARC;
108
use Koha::Util::MARC;
109
use C4::Linker::Default;
109
110
110
use vars qw($debug $cgi_debug);
111
use vars qw($debug $cgi_debug);
111
112
Lines 461-467 sub BiblioAutoLink { Link Here
461
462
462
=head2 LinkBibHeadingsToAuthorities
463
=head2 LinkBibHeadingsToAuthorities
463
464
464
  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $verbose]);
465
  my $num_headings_changed, %results = LinkBibHeadingsToAuthorities($linker, $marc, $frameworkcode, [$allowrelink, $verbose, $dont_auto_create]);
465
466
466
Links bib headings to authority records by checking
467
Links bib headings to authority records by checking
467
each authority-controlled field in the C<MARC::Record>
468
each authority-controlled field in the C<MARC::Record>
Lines 484-490 sub LinkBibHeadingsToAuthorities { Link Here
484
    my $frameworkcode = shift;
485
    my $frameworkcode = shift;
485
    my $allowrelink = shift;
486
    my $allowrelink = shift;
486
    my $verbose = shift;
487
    my $verbose = shift;
488
    my $dont_auto_create = shift;
487
    my %results;
489
    my %results;
490
    my $linker_default=C4::Linker::Default->new();
488
    if (!$bib) {
491
    if (!$bib) {
489
        carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
492
        carp 'LinkBibHeadingsToAuthorities called on undefined bib record';
490
        return ( 0, {});
493
        return ( 0, {});
Lines 508-514 sub LinkBibHeadingsToAuthorities { Link Here
508
            next;
511
            next;
509
        }
512
        }
510
513
511
        my ( $authid, $fuzzy, $match_count ) = $linker->get_link($heading);
514
        my ( $authid, $fuzzy, $match_count, $status ) = $linker->get_link($heading);
515
        if(defined $status){
516
            if ($status eq 'NO_CONNECTION' or $status eq 'SERVER_NOT_FOUND') {
517
                return 0, { error => $status };
518
            }
519
            elsif($status eq 'Z3950_SEARCH_EMPTY'){
520
                ( $authid, $fuzzy, $match_count, $status ) = $linker_default->get_link($heading);
521
            }
522
        }
512
        if ($authid) {
523
        if ($authid) {
513
            $results{ $fuzzy ? 'fuzzy' : 'linked' }
524
            $results{ $fuzzy ? 'fuzzy' : 'linked' }
514
              ->{ $heading->display_form() }++;
525
              ->{ $heading->display_form() }++;
Lines 530-538 sub LinkBibHeadingsToAuthorities { Link Here
530
                $results{'fuzzy'}->{ $heading->display_form() }++;
541
                $results{'fuzzy'}->{ $heading->display_form() }++;
531
                push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
542
                push(@{$results{'details'}}, { tag => $field->tag(), authid => $current_link, status => 'UNCHANGED'}) if $verbose;
532
            }
543
            }
533
            elsif ( C4::Context->preference('AutoCreateAuthorities') ) {
544
            elsif ( !$dont_auto_create && C4::Context->preference('AutoCreateAuthorities') ) {
534
                if ( _check_valid_auth_link( $current_link, $field ) ) {
545
                if ( _check_valid_auth_link( $current_link, $field ) ) {
535
                    $results{'linked'}->{ $heading->display_form() }++;
546
                    $results{'linked'}->{ $heading->display_form() }++;
547
                    push(@{$results{'details'}}, { tag => $field->tag(), authid => $authid, status => 'UNCHANGED'}) if $verbose;
536
                }
548
                }
537
                elsif ( !$match_count ) {
549
                elsif ( !$match_count ) {
538
                    my $authority_type = Koha::Authority::Types->find( $heading->auth_type() );
550
                    my $authority_type = Koha::Authority::Types->find( $heading->auth_type() );
(-)a/C4/Linker/Z3950Server.pm (+313 lines)
Line 0 Link Here
1
package C4::Linker::Z3950Server;
2
3
# Copyright 2012 Frédérick Capovilla - Libéo
4
#
5
# Koha is free software; you can redistribute it and/or modify it
6
# under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 3 of the License, or
8
# (at your option) any later version.
9
#
10
# Koha is distributed in the hope that it will be useful, but
11
# WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
14
#
15
# You should have received a copy of the GNU General Public License
16
# along with Koha; if not, see <http://www.gnu.org/licenses>.
17
18
use strict;
19
use warnings;
20
use Carp;
21
use MARC::Field;
22
use MARC::Record;
23
use C4::Context;
24
use C4::Heading;
25
use ZOOM; # For Z39.50 Searches
26
use C4::AuthoritiesMarc; # For Authority addition
27
use C4::Log; # logaction
28
29
use base qw(C4::Linker);
30
31
32
sub get_link {
33
    my $self        = shift;
34
    my $heading     = shift;
35
    my $behavior    = shift || 'default';
36
    my $search_form = $heading->search_form();
37
    my $authid;
38
    my $fuzzy = 0;
39
    my $status = '';
40
41
    if ( $self->{'cache'}->{$search_form}->{'cached'} ) {
42
        $authid = $self->{'cache'}->{$search_form}->{'authid'};
43
        $fuzzy  = $self->{'cache'}->{$search_form}->{'fuzzy'};
44
    }else {
45
        # Look for matching authorities on the Z39.50 server
46
        unless($self->{'local_first'}) {
47
            ($authid, undef, $status) = $self->getZ3950Authority($heading);
48
            if($status eq 'Z3950_SEARCH_ERROR' or
49
               $status eq 'Z3950_QUERY_ERROR' or
50
               $status eq 'NO_CONNECTION' or
51
               $status eq 'SERVER_NOT_FOUND') {
52
                return $authid, $fuzzy, 0, $status;
53
            }
54
        }
55
        if(!$authid) {
56
            # look for matching authorities
57
            my $authorities = $heading->authorities(1);    # $skipmetadata = true
58
            $match_count = scalar @$authorities;
59
60
            if ( $behavior eq 'default' && $#{$authorities} >= 0 ) {
61
                $authid = $authorities->[0]->{'authid'};
62
            }elsif ( $behavior eq 'first' && $#{$authorities} >= 0 ) {
63
                $authid = $authorities->[0]->{'authid'};
64
                $fuzzy  = $#{$authorities} > 0;
65
            }
66
            elsif ( $behavior eq 'last' && $#{$authorities} >= 0 ) {
67
                $authid = $authorities->[ $#{$authorities} ]->{'authid'};
68
                $fuzzy  = $#{$authorities} > 0;
69
            }
70
71
            if ( !defined $authid && $self->{'broader_headings'} ) {
72
                my $field     = $heading->field();
73
                my @subfields = $field->subfields();
74
                if ( scalar @subfields > 1 ) {
75
                    pop @subfields;
76
                    $field->replace_with(
77
                        MARC::Field->new(
78
                            $field->tag,
79
                            $field->indicator(1),
80
                            $field->indicator(2),
81
                            map { $_[0] => $_[1] } @subfields
82
                        )
83
                    );
84
                    ( $authid, $fuzzy ) =
85
                      $self->get_link( C4::Heading->new_from_bib_field($field),
86
                        $behavior );
87
                }
88
            }
89
        }
90
        if($self->{'local_first'} && !$authid) {
91
            ($authid, undef, $status) = $self->getZ3950Authority($heading);
92
        }
93
94
        $self->{'cache'}->{$search_form}->{'cached'} = 1;
95
        $self->{'cache'}->{$search_form}->{'authid'} = $authid;
96
        $self->{'cache'}->{$search_form}->{'fuzzy'}  = $fuzzy;
97
    }
98
    return $self->SUPER::_handle_auth_limit($authid), $fuzzy, $match_count, $status;
99
}
100
101
sub update_cache {
102
    my $self        = shift;
103
    my $heading     = shift;
104
    my $authid      = shift;
105
    my $search_form = $heading->search_form();
106
    my $fuzzy = 0;
107
108
    $self->{'cache'}->{$search_form}->{'cached'} = 1;
109
    $self->{'cache'}->{$search_form}->{'authid'} = $authid;
110
    $self->{'cache'}->{$search_form}->{'fuzzy'}  = $fuzzy;
111
}
112
sub flip_heading {
113
    my $self    = shift;
114
    my $heading = shift;
115
116
    # TODO: implement
117
}
118
119
120
=head1 getZ3950Authority
121
122
  ($authid, $record, $status) = $self->getZ3950Authority($heading);
123
124
  Do a Z39.50 search for the heading using the $conn ZOOM::Connection object and the $heading Heading.
125
  The column origincode is used to check for duplicates.
126
  FIXME: Use thesaurus in search? As of Koha 3.8, the community stopped using them.
127
128
  RETURNS :
129
  $authid = the ID of the local copy of the authority record that was found. undef if nothing was found.
130
  $record = the MARC record of the found authority.
131
  $status = A string with additional informations on the search status (Z3950_CREATED, Z3950_UPDATED, Z3950_QUERY_ERROR, Z3950_SEARCH_ERROR)
132
133
=cut
134
135
sub getZ3950Authority {
136
    my $self = shift;
137
    my $heading = shift;
138
139
    # Try to find a match on the Z39.50 server if LinkerZ3950Server is set
140
    if(C4::Context->preference('LinkerZ3950Server')) {
141
        unless($self->{'conn'}) {
142
            my $sth = C4::Context->dbh->prepare("select * from z3950servers where servername=?");
143
            $sth->execute(C4::Context->preference('LinkerZ3950Server'));
144
            my $server = $sth->fetchrow_hashref or undef;
145
            $sth->finish;
146
147
            if($server) {
148
                my $options = new ZOOM::Options();
149
                $options->option('cclfile' => C4::Context->ModZebrations('authorityserver')->{"ccl2rpn"});
150
                $options->option('elementSetName', 'F');
151
                $options->option('async', 0);
152
                $options->option('databaseName', $server->{db});
153
                $options->option('user',         $server->{userid}  ) if $server->{userid};
154
                $options->option('password',     $server->{password}) if $server->{password};
155
                $options->option('preferredRecordSyntax', $server->{syntax});
156
                $self->{'conn'} = create ZOOM::Connection($options);
157
                eval{ $self->{'conn'}->connect( $server->{host}, $server->{port} ) };
158
                if($@) {
159
                    return (undef, undef, 'NO_CONNECTION');
160
                }}
161
            else {
162
                return (undef, undef, 'SERVER_NOT_FOUND');
163
            }
164
        }
165
    }
166
    else {
167
        return;
168
    }
169
    my $query =qq(Match-Heading,do-not-truncate,ext="$heading->{'search_form'}");
170
    my $zquery = eval{ new ZOOM::Query::CCL2RPN($query, $self->{'conn'}) };
171
    if($@) {
172
        warn $query . "\n" . $@;
173
        return (undef, undef, 'Z3950_QUERY_ERROR');
174
    }
175
176
    # Try to send the search query to the server.
177
    my $rs = eval{ $self->{'conn'}->search($zquery) };
178
    if($@){
179
        warn $query . "\n" . $@;
180
        return (undef, undef, 'Z3950_SEARCH_EMPTY');
181
    }
182
183
    # If authorities are found, select the first valid one for addition in the local authority table.
184
    my $record;
185
    if($rs->size() != 0) {
186
        $record = MARC::Record::new_from_usmarc($rs->record(0)->raw());
187
    }else{
188
        return (undef, undef, 'Z3950_SEARCH_ERROR');
189
    }
190
    $rs->destroy();
191
    $zquery->destroy();
192
193
    # If a valid authority was found, add it in the local authority database.
194
    if($record) {
195
        my $dbh=C4::Context->dbh;
196
197
        my $authtypecode = C4::AuthoritiesMarc::GuessAuthTypeCode($record);
198
        my $authId;
199
200
        # Use the control number to prevent the creation of duplicate authorities.
201
        my $controlNumber = $record->field('970')->subfield('0');
202
        my $sthExist=$dbh->prepare("SELECT authid FROM auth_header WHERE origincode =?");
203
        $sthExist->execute($controlNumber) or die $sthExist->errstr;
204
        ($authId) = $sthExist->fetchrow;
205
        $sthExist->finish;
206
207
        #------------------------------------------------------------------------------------------
208
        # Corrections and verifications before insertion
209
        my $format;
210
        my $leader='     nz  a22     o  4500';# Leader for incomplete MARC21 record
211
212
        if (uc(C4::Context->preference('marcflavour')) eq 'UNIMARC') {
213
            $format= 'UNIMARCAUTH';
214
        }
215
        else {
216
            $format= 'MARC21';
217
        }
218
219
        if ($format eq "MARC21") {
220
            if (!$record->leader) {
221
                $record->leader($leader);
222
            }
223
            if (!$record->field('003')) {
224
                $record->insert_fields_ordered(
225
                        MARC::Field->new('003',C4::Context->preference('MARCOrgCode'))
226
                        );
227
            }
228
            my $time=POSIX::strftime("%Y%m%d%H%M%S",localtime);
229
            if (!$record->field('005')) {
230
                $record->insert_fields_ordered(
231
                        MARC::Field->new('005',$time.".0")
232
                        );
233
            }
234
            my $date=POSIX::strftime("%y%m%d",localtime);
235
            if (!$record->field('008')) {
236
                # Get a valid default value for field 008
237
                my $default_008 = C4::Context->preference('MARCAuthorityControlField008');
238
                if(!$default_008 or length($default_008)<34) {
239
                    $default_008 = '|| aca||aabn           | a|a     d';
240
            }
241
            else {
242
                    $default_008 = substr($default_008,0,34);
243
                }
244
                $record->insert_fields_ordered( MARC::Field->new('008',$date.$default_008) );
245
            }
246
            if (!$record->field('040')) {
247
                $record->insert_fields_ordered(
248
                    MARC::Field->new('040','','',
249
                        'a' => C4::Context->preference('MARCOrgCode'),
250
                        'c' => C4::Context->preference('MARCOrgCode')
251
                    )
252
                );
253
            }
254
        }
255
        if ($format eq "UNIMARCAUTH") {
256
            $record->leader("     nx  j22             ") unless ($record->leader());
257
            my $date=POSIX::strftime("%Y%m%d",localtime);
258
            if (my $string=$record->subfield('100',"a")){
259
                $string=~s/fre50/frey50/;
260
                $record->field('100')->update('a'=>$string);
261
            }
262
            elsif ($record->field('100')){
263
                $record->field('100')->update('a'=>$date."afrey50      ba0");
264
            } else {
265
                $record->append_fields(
266
                    MARC::Field->new('100',' ',' '
267
                        ,'a'=>$date."afrey50      ba0")
268
                );
269
            }
270
        }
271
        my ($auth_type_tag, $auth_type_subfield) = C4::AuthoritiesMarc::get_auth_type_location($authtypecode);
272
        if (!$authId and $format eq "MARC21") {
273
        # only need to do this fix when modifying an existing authority
274
            C4::AuthoritiesMarc::MARC21::fix_marc21_auth_type_location($record, $auth_type_tag, $auth_type_subfield);
275
        }
276
        if (my $field=$record->field($auth_type_tag)){
277
            $field->update($auth_type_subfield=>$authtypecode);
278
        }
279
        else {
280
            $record->add_fields($auth_type_tag,'','', $auth_type_subfield=>$authtypecode);
281
        }
282
        #------------------------------------------------------------------------------------------
283
        if ($authId) {
284
            my $oldRecord=C4::AuthoritiesMarc::GetAuthority($authId);
285
286
            my $sth=$dbh->prepare("UPDATE auth_header SET authtypecode=?,marc=?,marcxml=? WHERE origincode =?");
287
            eval { $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$controlNumber) or die $sth->errstr; };
288
            $sth->finish;
289
            warn "Problem with authority $controlNumber : Cannot update" if $@;
290
            $dbh->commit unless $dbh->{AutoCommit};
291
            return if $@;
292
293
            C4::Biblio::ModZebra($authId,'linkerUpdate',"authorityserver",$oldRecord,$record);
294
            return ($authId, $record, 'Z3950_UPDATED');
295
        }
296
        else {
297
            my $sth=$dbh->prepare("INSERT INTO auth_header (datecreated,authtypecode,marc,marcxml,origincode) VALUES (NOW(),?,?,?,?)");
298
            eval { $sth->execute($authtypecode,$record->as_usmarc,$record->as_xml_record($format),$controlNumber) or die $sth->errstr; };
299
            $sth->finish;
300
            warn "Problem with authority $controlNumber : Cannot insert" if $@;
301
            my $id = $dbh->{'mysql_insertid'};
302
            $dbh->commit unless $dbh->{AutoCommit};
303
            return if $@;
304
305
            logaction( "AUTHORITIES", "ADD", $id, "authority" ) if C4::Context->preference("AuthoritiesLog");
306
            C4::Biblio::ModZebra($id,'linkerUpdate',"authorityserver",undef,$record);
307
            return ($id, $record, 'Z3950_CREATED');
308
        }
309
    }
310
    return ;
311
}
312
313
1;
(-)a/installer/data/mysql/atomicupdate/Bug11300_LinkerZ3950Server_syspef.sql (+2 lines)
Line 0 Link Here
1
INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES
2
('LinkerZ3950Server','',NULL,'Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module','free');
(-)a/installer/data/mysql/mandatory/sysprefs.sql (+1 lines)
Lines 300-305 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
300
('LinkerModule','Default','Default|FirstMatch|LastMatch','Chooses which linker module to use (see documentation).','Choice'),
300
('LinkerModule','Default','Default|FirstMatch|LastMatch','Chooses which linker module to use (see documentation).','Choice'),
301
('LinkerOptions','','','A pipe-separated list of options for the linker.','free'),
301
('LinkerOptions','','','A pipe-separated list of options for the linker.','free'),
302
('LinkerRelink','1',NULL,'If ON the authority linker will relink headings that have previously been linked every time it runs.','YesNo'),
302
('LinkerRelink','1',NULL,'If ON the authority linker will relink headings that have previously been linked every time it runs.','YesNo'),
303
('LinkerZ3950Server','',NULL,'Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module',''),
303
('LoadSearchHistoryToTheFirstLoggedUser', '1', NULL, 'If ON, the next user will automatically get the last searches in his history', 'YesNo'),
304
('LoadSearchHistoryToTheFirstLoggedUser', '1', NULL, 'If ON, the next user will automatically get the last searches in his history', 'YesNo'),
304
('LocalCoverImages','0','1','Display local cover images on intranet details pages.','YesNo'),
305
('LocalCoverImages','0','1','Display local cover images on intranet details pages.','YesNo'),
305
('LocalHoldsPriority',  '0', NULL,  'Enables the LocalHoldsPriority feature',  'YesNo'),
306
('LocalHoldsPriority',  '0', NULL,  'Enables the LocalHoldsPriority feature',  'YesNo'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/authorities.pref (+5 lines)
Lines 73-78 Authorities: Link Here
73
                  Default: default
73
                  Default: default
74
                  FirstMatch: "first match"
74
                  FirstMatch: "first match"
75
                  LastMatch: "last match"
75
                  LastMatch: "last match"
76
                  Z3950Server: "Z39.50 Server"
76
            - linker module for matching headings to authority records.
77
            - linker module for matching headings to authority records.
77
        -
78
        -
78
            - "Set the following options for the authority linker:"
79
            - "Set the following options for the authority linker:"
Lines 100-102 Authorities: Link Here
100
                  yes: Do
101
                  yes: Do
101
                  no: "Don't"
102
                  no: "Don't"
102
            - automatically relink headings that have previously been linked when saving records in the cataloging module.
103
            - automatically relink headings that have previously been linked when saving records in the cataloging module.
104
        -
105
            - pref: LinkerZ3950Server
106
            - class: multi
107
            - Import authorities from this Z39.50 server when searching for authority links with the Z39.50 Server linker module :
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/addbiblio.tt (-2 / +19 lines)
Lines 285-290 function updateHeadingLinks(links) { Link Here
285
        var message = '';
285
        var message = '';
286
        var field_class = 'no_matching_authority_field';
286
        var field_class = 'no_matching_authority_field';
287
        switch(heading.status) {
287
        switch(heading.status) {
288
            case 'Z3950_CREATED':
289
                image = 'approve.gif';
290
                message = _("A matching authority record was found on the Z39.50 server and was imported locally.");
291
                field_color = '#99FF99';
292
                break;
293
            case 'Z3950_UPDATED':
294
                image = 'approve.gif';
295
                message = _("A matching authority record was found on the Z39.50 server and a local authority was updated.");
296
                field_color = '#99FF99';
297
                break;
288
            case 'LOCAL_FOUND':
298
            case 'LOCAL_FOUND':
289
                image = '<i class="fa fa-check matching_authority"</i> ';
299
                image = '<i class="fa fa-check matching_authority"</i> ';
290
                message = _("A matching authority was found in the local database.");
300
                message = _("A matching authority was found in the local database.");
Lines 338-344 function AutomaticLinker() { Link Here
338
    $('#f').find('.tag').each(function() {
348
    $('#f').find('.tag').each(function() {
339
        var empty = true;
349
        var empty = true;
340
        $(this).find('.input_marceditor').each(function() {
350
        $(this).find('.input_marceditor').each(function() {
341
            if($(this).val() != '') {
351
            if(this.value != '') {
342
                empty = false;
352
                empty = false;
343
                return false;
353
                return false;
344
            }
354
            }
Lines 350-357 function AutomaticLinker() { Link Here
350
360
351
    // Get all the form values to post via AJAX
361
    // Get all the form values to post via AJAX
352
    var form_data = {};
362
    var form_data = {};
363
    var i=0;
353
    $('#f').find(':input').each(function(){
364
    $('#f').find(':input').each(function(){
354
        form_data[this.name] = $(this).val();
365
       form_data[this.name] = this.value;
355
    });
366
    });
356
    delete form_data[''];
367
    delete form_data[''];
357
368
Lines 369-374 function AutomaticLinker() { Link Here
369
                case 'UNAUTHORIZED':
380
                case 'UNAUTHORIZED':
370
                    alert(_("Error : You do not have the permissions necessary to use this functionality."));
381
                    alert(_("Error : You do not have the permissions necessary to use this functionality."));
371
                    break;
382
                    break;
383
                case 'SERVER_NOT_FOUND':
384
                    alert(_("Error : The Z39.50 server configured in the 'LinkerZ3950Server' preference was not found in the Z39.50 servers list."));
385
                    break;
386
                case 'NO_CONNECTION':
387
                    alert(_("Error : Could not connect to the Z39.50 server."));
388
                    break;
372
                case 'OK':
389
                case 'OK':
373
                    updateHeadingLinks(json.links);
390
                    updateHeadingLinks(json.links);
374
                    break;
391
                    break;
(-)a/svc/cataloguing/automatic_linker.pl (-9 / +9 lines)
Lines 33-49 my %cookies = CGI::Cookie->fetch; Link Here
33
my $sessid = $cookies{'CGISESSID'}->value || $input->param('CGISESSID');
33
my $sessid = $cookies{'CGISESSID'}->value || $input->param('CGISESSID');
34
my ( $auth_status, $auth_sessid ) =
34
my ( $auth_status, $auth_sessid ) =
35
  C4::Auth::check_cookie_auth( $sessid, { editauthorities => 1, editcatalogue => 1 } );
35
  C4::Auth::check_cookie_auth( $sessid, { editauthorities => 1, editcatalogue => 1 } );
36
if ( $auth_status ne "ok" ) {
37
    print to_json( { status => 'UNAUTHORIZED' } );
38
    exit 0;
39
}
40
36
41
# Link the biblio headings to authorities and return a json containing the status of all the links.
37
# Link the biblio headings to authorities and return a json containing the status of all the links.
42
# Example : {"status":"OK","links":[{"authid":"123","status":"LINK_CHANGED","tag":"650"}]}
38
# Example : {"status":"OK","links":[{"authid":"123","status":"LINK_CHANGED","tag":"650"}]}
43
#
39
#
44
# tag = the tag number of the field
40
# tag = the tag number of the field
45
# authid = the value of the $9 subfield for this tag
41
# authid = the value of the $9 subfield for this tag
46
# status = The status of the link (LOCAL_FOUND, NONE_FOUND, MULTIPLE_MATCH, UNCHANGED, CREATED)
42
# status = The status of the link (LOCAL_FOUND, NONE_FOUND, MULTIPLE_MATCH, UNCHANGED, CREATED,3950_CREATED, Z3950_UPDATED)
47
43
48
my $json;
44
my $json;
49
45
Lines 54-61 my ( $headings_changed, $results ) = BiblioAutoLink ( Link Here
54
    $input->param('frameworkcode'),
50
    $input->param('frameworkcode'),
55
    1
51
    1
56
);
52
);
57
53
if(defined $results->{error}) {
58
$json->{status} = 'OK';
54
    $json->{links} = $results->{details} || '';
59
$json->{links} = $results->{details} || '';
55
    $json->{links} = $results->{details} || '';
56
}
57
else{
58
    $json->{status} = 'OK';
59
    $json->{links} = $results->{details} || '';
60
}
60
61
61
print to_json($json);
62
print to_json($json);
62
- 

Return to bug 11300