|
Lines 228-239
The second parameter $template is a Template object. The routine uses this param
Link Here
|
| 228 |
sub Z3950Search { |
228 |
sub Z3950Search { |
| 229 |
my ($pars, $template)= @_; |
229 |
my ($pars, $template)= @_; |
| 230 |
|
230 |
|
| 231 |
my $dbh = C4::Context->dbh; |
|
|
| 232 |
my @id= @{$pars->{id}}; |
231 |
my @id= @{$pars->{id}}; |
| 233 |
my $random= $pars->{random}; |
|
|
| 234 |
my $page= $pars->{page}; |
232 |
my $page= $pars->{page}; |
| 235 |
my $biblionumber= $pars->{biblionumber}; |
233 |
my $biblionumber= $pars->{biblionumber}; |
| 236 |
|
|
|
| 237 |
my $isbn= $pars->{isbn}; |
234 |
my $isbn= $pars->{isbn}; |
| 238 |
my $issn= $pars->{issn}; |
235 |
my $issn= $pars->{issn}; |
| 239 |
my $title= $pars->{title}; |
236 |
my $title= $pars->{title}; |
|
Lines 248-276
sub Z3950Search {
Link Here
|
| 248 |
|
245 |
|
| 249 |
my $show_next = 0; |
246 |
my $show_next = 0; |
| 250 |
my $total_pages = 0; |
247 |
my $total_pages = 0; |
| 251 |
|
|
|
| 252 |
my $attr = ''; |
| 253 |
my $term; |
248 |
my $term; |
| 254 |
my $host; |
|
|
| 255 |
my $server; |
| 256 |
my $database; |
| 257 |
my $port; |
| 258 |
my $marcdata; |
| 259 |
my @encoding; |
| 260 |
my @results; |
249 |
my @results; |
| 261 |
my $count; |
|
|
| 262 |
my $record; |
| 263 |
my $oldbiblio; |
| 264 |
my @serverhost; |
| 265 |
my @servername; |
| 266 |
my @breeding_loop = (); |
250 |
my @breeding_loop = (); |
| 267 |
|
|
|
| 268 |
my @oConnection; |
251 |
my @oConnection; |
| 269 |
my @oResult; |
252 |
my @oResult; |
| 270 |
my @errconn; |
253 |
my @errconn; |
| 271 |
my $s = 0; |
254 |
my $s = 0; |
| 272 |
my $query; |
255 |
my $query; |
| 273 |
my $nterms=0; |
256 |
my $nterms=0; |
|
|
257 |
my $imported=0; |
| 258 |
my @serverinfo; #replaces former serverhost, servername, encoding |
| 259 |
|
| 274 |
if ($isbn) { |
260 |
if ($isbn) { |
| 275 |
$term=$isbn; |
261 |
$term=$isbn; |
| 276 |
$query .= " \@attr 1=7 \@attr 5=1 \"$term\" "; |
262 |
$query .= " \@attr 1=7 \@attr 5=1 \"$term\" "; |
|
Lines 321-344
sub Z3950Search {
Link Here
|
| 321 |
$query = "\@and " . $query; |
307 |
$query = "\@and " . $query; |
| 322 |
} |
308 |
} |
| 323 |
|
309 |
|
|
|
310 |
my $dbh = C4::Context->dbh; |
| 324 |
foreach my $servid (@id) { |
311 |
foreach my $servid (@id) { |
| 325 |
my $sth = $dbh->prepare("select * from z3950servers where id=?"); |
312 |
my $sth = $dbh->prepare("select * from z3950servers where id=?"); |
| 326 |
$sth->execute($servid); |
313 |
$sth->execute($servid); |
| 327 |
while ( $server = $sth->fetchrow_hashref ) { |
314 |
while (my $server = $sth->fetchrow_hashref) { |
| 328 |
my $option1 = new ZOOM::Options(); |
315 |
my $option1= new ZOOM::Options(); |
| 329 |
$option1->option( 'async' => 1 ); |
316 |
$option1->option( 'async' => 1 ); |
| 330 |
$option1->option( 'elementSetName', 'F' ); |
317 |
$option1->option( 'elementSetName', 'F' ); |
| 331 |
$option1->option( 'databaseName', $server->{db} ); |
318 |
$option1->option( 'databaseName', $server->{db} ); |
| 332 |
$option1->option( 'user', $server->{userid} ) if $server->{userid}; |
319 |
$option1->option( 'user', $server->{userid} ) if $server->{userid}; |
| 333 |
$option1->option( 'password', $server->{password} ) |
320 |
$option1->option( 'password', $server->{password} ) if $server->{password}; |
| 334 |
if $server->{password}; |
|
|
| 335 |
$option1->option( 'preferredRecordSyntax', $server->{syntax} ); |
321 |
$option1->option( 'preferredRecordSyntax', $server->{syntax} ); |
| 336 |
$option1->option( 'timeout', $server->{timeout} ) if $server->{timeout}; |
322 |
$option1->option( 'timeout', $server->{timeout} ) if $server->{timeout}; |
| 337 |
$oConnection[$s] = create ZOOM::Connection($option1); |
323 |
$oConnection[$s]= create ZOOM::Connection($option1); |
| 338 |
$oConnection[$s]->connect( $server->{host}, $server->{port} ); |
324 |
$oConnection[$s]->connect( $server->{host}, $server->{port} ); |
| 339 |
$serverhost[$s] = $server->{host}; |
325 |
$serverinfo[$s]->{host}= $server->{host}; |
| 340 |
$servername[$s] = $server->{name}; |
326 |
$serverinfo[$s]->{name}= $server->{name}; |
| 341 |
$encoding[$s] = ($server->{encoding}?$server->{encoding}:"iso-5426"); |
327 |
$serverinfo[$s]->{encd}= $server->{encoding} // "iso-5426"; |
| 342 |
$s++; |
328 |
$s++; |
| 343 |
} ## while fetch |
329 |
} ## while fetch |
| 344 |
} # foreach |
330 |
} # foreach |
|
Lines 358-367
sub Z3950Search {
Link Here
|
| 358 |
|
344 |
|
| 359 |
if ( $k != 0 ) { |
345 |
if ( $k != 0 ) { |
| 360 |
$k--; |
346 |
$k--; |
| 361 |
my ($error, $errmsg, $addinfo, $diagset)= $oConnection[$k]->error_x(); |
347 |
my ($error)= $oConnection[$k]->error_x(); #ignores errmsg, addinfo, diagset |
| 362 |
if ($error) { |
348 |
if ($error) { |
| 363 |
if ($error =~ m/^(10000|10007)$/ ) { |
349 |
if ($error =~ m/^(10000|10007)$/ ) { |
| 364 |
push(@errconn, {'server' => $serverhost[$k]}); |
350 |
push(@errconn, { 'server' => $serverinfo[$k]->{host} } ); |
| 365 |
} |
351 |
} |
| 366 |
} |
352 |
} |
| 367 |
else { |
353 |
else { |
|
Lines 372-409
sub Z3950Search {
Link Here
|
| 372 |
$show_next = 1 if $numresults >= ($page*20); |
358 |
$show_next = 1 if $numresults >= ($page*20); |
| 373 |
$total_pages = int($numresults/20)+1 if $total_pages < ($numresults/20); |
359 |
$total_pages = int($numresults/20)+1 if $total_pages < ($numresults/20); |
| 374 |
for ($i = ($page-1)*20; $i < (($numresults < ($page*20)) ? $numresults : ($page*20)); $i++) { |
360 |
for ($i = ($page-1)*20; $i < (($numresults < ($page*20)) ? $numresults : ($page*20)); $i++) { |
| 375 |
my $rec = $oResult[$k]->record($i); |
361 |
if($oResult[$k]->record($i)) { |
| 376 |
if ($rec) { |
362 |
my $res=_handle_one_result($oResult[$k]->record($i), $serverinfo[$k], ++$imported, $biblionumber); #ignores error in sequence numbering |
| 377 |
my $marcrecord; |
363 |
push @breeding_loop, $res if $res; |
| 378 |
$marcdata = $rec->raw(); |
|
|
| 379 |
my ($charset_result, $charset_errors); |
| 380 |
($marcrecord, $charset_result, $charset_errors)= MarcToUTF8Record($marcdata, C4::Context->preference('marcflavour'), $encoding[$k]); |
| 381 |
# Normalize the record so it doesn't have separated diacritics |
| 382 |
SetUTF8Flag($marcrecord); |
| 383 |
my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, "" ); |
| 384 |
$oldbiblio->{isbn} =~ s/ |-|\.//g if $oldbiblio->{isbn}; |
| 385 |
# pad | and ( with spaces to allow line breaks in the HTML |
| 386 |
$oldbiblio->{isbn} =~ s/\|/ \| /g if $oldbiblio->{isbn}; |
| 387 |
$oldbiblio->{isbn} =~ s/\(/ \(/g if $oldbiblio->{isbn}; |
| 388 |
$oldbiblio->{issn} =~ s/ |-|\.//g if $oldbiblio->{issn}; |
| 389 |
# pad | and ( with spaces to allow line breaks in the HTML |
| 390 |
$oldbiblio->{issn} =~ s/\|/ \| /g if $oldbiblio->{issn}; |
| 391 |
$oldbiblio->{issn} =~ s/\(/ \(/g if $oldbiblio->{issn}; |
| 392 |
my ($notmarcrecord, $alreadyindb, $alreadyinfarm, $imported, $breedingid)= ImportBreeding( $marcdata, 2, $serverhost[$k], $encoding[$k], $random, 'z3950' ); |
| 393 |
my %row_data; |
| 394 |
$row_data{server} = $servername[$k]; |
| 395 |
$row_data{isbn} = $oldbiblio->{isbn}; |
| 396 |
$row_data{lccn} = $oldbiblio->{lccn}; |
| 397 |
$row_data{title} = $oldbiblio->{title}; |
| 398 |
$row_data{author} = $oldbiblio->{author}; |
| 399 |
$row_data{date} = $oldbiblio->{copyrightdate}; |
| 400 |
$row_data{edition} = $oldbiblio->{editionstatement}; |
| 401 |
$row_data{breedingid} = $breedingid; |
| 402 |
$row_data{biblionumber} = $biblionumber; |
| 403 |
push( @breeding_loop, \%row_data ); |
| 404 |
} |
364 |
} |
| 405 |
else { |
365 |
else { |
| 406 |
push(@breeding_loop,{'server'=>$servername[$k],'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1}); |
366 |
push(@breeding_loop,{'server'=>$serverinfo[$k]->{name},'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1}); |
| 407 |
} |
367 |
} |
| 408 |
} |
368 |
} |
| 409 |
} #if $numresults |
369 |
} #if $numresults |
|
Lines 436-441
sub Z3950Search {
Link Here
|
| 436 |
); |
396 |
); |
| 437 |
} |
397 |
} |
| 438 |
|
398 |
|
|
|
399 |
sub _handle_one_result { |
| 400 |
my ($zoomrec, $servhref, $seq, $bib)= @_; |
| 401 |
|
| 402 |
my $raw= $zoomrec->raw(); |
| 403 |
my ($marcrecord) = MarcToUTF8Record($raw, C4::Context->preference('marcflavour'), $servhref->{encd}); #ignores charset return values |
| 404 |
SetUTF8Flag($marcrecord); |
| 405 |
|
| 406 |
#call to ImportBreeding replaced by next two calls for optimization |
| 407 |
my $batch_id = GetZ3950BatchId($servhref->{name}); |
| 408 |
my $breedingid = AddBiblioToBatch($batch_id, $seq, $marcrecord, 'UTF-8', 0, 0); |
| 409 |
#FIXME passing 0 for z3950random |
| 410 |
#Will eliminate this unused field in a followup report |
| 411 |
#Last zero indicates: no update for batch record counts |
| 412 |
|
| 413 |
|
| 414 |
#call to TransformMarcToKoha replaced by next call |
| 415 |
#we only need six fields from the marc record |
| 416 |
return _add_rowdata( |
| 417 |
{ |
| 418 |
biblionumber => $bib, |
| 419 |
server => $servhref->{name}, |
| 420 |
breedingid => $breedingid, |
| 421 |
}, $marcrecord) if $breedingid; |
| 422 |
} |
| 423 |
|
| 424 |
sub _add_rowdata { |
| 425 |
my ($rowref, $marcrecord)=@_; |
| 426 |
if(C4::Context->preference("marcflavour") ne 'UNIMARC') { #MARC21, NORMARC |
| 427 |
$rowref->{isbn} = _isbn_cleanup($marcrecord->subfield('020','a')||''); |
| 428 |
$rowref->{title}= $marcrecord->subfield('245','a')||''; |
| 429 |
$rowref->{author}= $marcrecord->subfield('100','a')||''; |
| 430 |
$rowref->{date}= $marcrecord->subfield('260','c')||''; |
| 431 |
$rowref->{edition}= $marcrecord->subfield('250','a')||''; |
| 432 |
$rowref->{lccn}= $marcrecord->subfield('050','a')||''; |
| 433 |
} |
| 434 |
else { #UNIMARC |
| 435 |
$rowref->{isbn}= _isbn_cleanup($marcrecord->subfield('010','a')||''); |
| 436 |
$rowref->{title}= $marcrecord->subfield('200','a')||''; |
| 437 |
$rowref->{author}= $marcrecord->subfield('200','f')||''; |
| 438 |
$rowref->{date}= $marcrecord->subfield('210','d')||''; |
| 439 |
$rowref->{edition}= $marcrecord->subfield('205','a')||''; |
| 440 |
$rowref->{lccn}= ''; |
| 441 |
} |
| 442 |
return $rowref; |
| 443 |
} |
| 444 |
|
| 445 |
sub _isbn_cleanup { |
| 446 |
my $isbn= shift; |
| 447 |
$isbn=~ s/ |-|\.//g; |
| 448 |
$isbn=~ s/\|/ \| /g; |
| 449 |
$isbn=~ s/\(/ \(/g; |
| 450 |
return $isbn; |
| 451 |
} |
| 452 |
|
| 439 |
1; |
453 |
1; |
| 440 |
__END__ |
454 |
__END__ |
| 441 |
|
455 |
|