7 use Data::Dump qw/dump/;
14 my $debug = $ENV{DEBUG} || 0;
23 # Bib-1 @and @and @and @and @and @and @and @or
28 # @attr 1=16 dewey (godina)
29 # @attr 1=21 subject-holding
30 # @attr 1=12 control-no
31 # @attr 1=1007 standard-id
43 1016 => 'fti_au,fti_pr:',
50 my $dbname = 'bibliografija';
51 my $pg_user = $ENV{PGUSER} || '';
52 my $pg_passwd = $ENV{PGPASSWD} || '';
53 my $pg_host = $ENV{PGHOST} || '';
58 my ( $self, $query ) = @_;
60 utf8::decode( $query );
61 warn "QUERY",dump( $query );
63 die "ERROR need query" unless defined $query;
68 my $table = lc $self->{database};
69 $table =~ s/^crosbi-//g;
71 $self->{_table} = $table;
77 ,ARRAY( select napomena from rad_napomena where rad_napomena.id = $table.id ) as rad_napomena
78 ,ARRAY( select projekt from rad_projekt where rad_projekt.id = $table.id ) as rad_projekt
79 ,ARRAY( select datum from rad_godina where rad_godina.id = $table.id ) as rad_godina
80 ,ARRAY( select sifra from rad_podrucje where rad_podrucje.id = $table.id ) as rad_podrucje
81 ,ARRAY( select url from url where url.id = $table.id ) as url
83 inner join rad_ustanova using (id) -- sifra
86 @and = ( qq{ rad_ustanova.sifra = ? } );
87 @exec = ( 130 ); # FIXME ustanova
91 warn "## parse_fti [$query]";
93 if ( $query =~ s/^(fti_.+):\s*// ) {
96 warn "INVALID QUERY no fti_xxx: [$query]";
99 my $tsquery = join(' & ', split(/\s+/,$query) );
102 foreach my $f ( split(/,/,$fti) ) {
103 # push @or, "$f @@ to_tsquery('english',?)";
104 # push @exec, $tsquery;
106 push @or, "$f @@ to_tsquery('english',?) or $f @@ to_tsquery('croatian',?)";
107 push @exec, $tsquery, $tsquery;
109 push @and, "( " . join(" or ", @or) . ")";
112 if ( $query =~ / AND / ) {
113 foreach my $and ( split(/ AND /, $query) ) {
116 } elsif ( $query =~ m/fti_.+:/ ) {
118 } else { # no " AND " in query
119 my $tsquery = join(' & ', split(/\s+/,$query) );
120 # push @and, "( fti_au @@ to_tsquery('english',?) or fti_pr @@ to_tsquery('english',?) )";
121 # push @exec, $tsquery, $tsquery;
122 push @and, "( fti_au @@ to_tsquery('english',?) or fti_pr @@ to_tsquery('english',?) or fti_au @@ to_tsquery('croatian',?) or fti_pr @@ to_tsquery('croatian',?) )";
123 push @exec, $tsquery, $tsquery, $tsquery, $tsquery;
127 $sql .= "where " . join(" and ", @and);
129 warn "XXX SQL = ",$sql, dump( @exec );
131 my $dbh = DBI->connect_cached("dbi:Pg:dbname=$dbname;host=$pg_host", $pg_user, $pg_passwd, {AutoCommit => 0});
133 my $sth = $dbh->prepare( $sql );
135 $sth->execute( @exec );
137 my $hits = $sth->rows;
139 $self->{_sth} = $sth;
141 warn "# [$query] $hits hits\n";
143 return $self->{hits} = $hits;
146 my $langrecode008 = {
151 'Esperanto' => 'epo',
159 'Madžarski' => 'hun',
160 'Makedonski' => 'mac',
161 'nizozemski' => 'dut',
164 'Portugalski' => 'por',
165 'portugalski' => 'por',
167 'Rumunjski' => 'rum',
168 'rumunjski' => 'rum',
171 'slovenski' => 'slv',
178 'ukrajinski' => 'ukr',
181 'hrvatsko-francuski' => 'mul',
185 my ($self,$format) = @_;
189 my $sth = $self->{_sth} || die "ERROR no _sth";
190 my $row = $sth->fetchrow_hashref;
192 warn "## row = ",dump($row) if $ENV{DEBUG};
194 warn "ERROR: no row" unless $row;
196 my $id = $row->{id} || die "ERROR no id";
198 my $marc = MARC::Record->new;
199 $marc->encoding('UTF-8');
201 my $leader = $marc->leader;
203 # /srv/webpac2/conf/crosbi/2016-12-12/casopis-dbi2marc.pl
206 ## LDR 06 - a - language material
207 ## LDR 07 - a - monographic component part
209 $leader =~ s/^(.....)...(.+)/$1naa$2/;
211 ## LDR 17 - Encoding level ; 7 - minimal level, u - unknown
212 ## LDR 18 - i = isbd ; u = unknown
214 $leader =~ s/^(.{17})..(.+)/$1ui$2/;
216 $marc->leader( $leader );
217 warn "# leader [$leader]";
220 ### 008 - All materials
222 ## 008 - 00-05 - Date entered on file
224 my $f008 = $1 . $2 . $3 if $row->{time_date} =~ m/\d\d(\d\d)-(\d\d)-(\d\d)/;
226 ## 008 06 - Type of date/Publication status
230 ## 008 07-10 - Date 1
232 $f008 .= substr( $row->{rad_godina}->[0] ,0,4);
234 ## 008 11-14 - Date 2
238 $f008 .= ' ' x ( 15 - length($f008) ); # pad to 15 position
239 ## 008 15-17 - Place of publication, production, or execution - ako nema 102, popunjava se s |
242 ## 008 29 - Conference publication
243 $f008 .= ' ' x ( 29 - length($f008) );
244 $f008 .= $self->{_table} eq 'zbornik' ? '1' : '0';
246 ## 008 35-37 - Language
247 $f008 .= ' ' x ( 35 - length($f008) ); # pad to 35 position
248 if ( my $lng = $langrecode008->{ $row->{jezik} } ) {
251 warn "INFO unknown jezik [$row->{jezik}] insert into langrecode008!";
254 $f008 .= ' ' x ( 38 - length($f008) );
255 ## 008 38 - Modified record
257 ## 008 39 - Cataloging source - d (other)
260 warn "# 008 ",length($f008);
262 $marc->add_fields('008', $f008); # FIXME - mglavica check
265 if ( my $doi = $row->{doi} ) {
267 $marc->add_fields('024','7',' ',
276 ## marc 035a - System Number
277 ## polje moze sadrzavati slova i razmake
278 ## moguc problem u pretrazivanju ako ima zagrade, kako bi trebalo po standardu
280 $marc->add_fields('035',' ',' ',
281 a => join('', '(CROSBI)', $row->{id})
287 $marc->add_fields('040',' ',' ',
295 # i1=0 - Item not a translation/does not include a translation
296 # i1=1 - Item is or includes a translation
297 # i1=' ' - No information provided
300 # ponovljivo potpolje (041a) - marc_repeatable_subfield
301 # koristi se kad ima vise od jednog jezika, ili kad se radi o prijevodu
303 $marc->add_fields('041',' ',' ', map {
305 } split(/-/, $row->{jezik}));
310 ## i1 = 0 zza anonimne publikacije, i1 = 1 ako postoji 700 ili 710
311 ## i2 = pretpostavlja se na temelju clana na pocetku naslova i jezika
313 my ( $first_author, $authors ) = split(/ ;\s*/,$row->{autori});
315 $marc->add_fields(100,'1',' ','a' => $first_author );
319 my $naslov = $row->{naslov}; # XXX title?
322 $naslov =~ m/^Eine / ? 5 :
323 $naslov =~ m/(Die|Das|Der|Ein|Les|Los|The) / ? 4 :
324 $naslov =~ m/^(Um|Un|An|La|Le|Lo|Il) / ? 3 :
325 $naslov =~ m/^(A|L) / ? 2 :
326 $naslov =~ m/^L'/ ? 2 :
329 $marc->add_fields(245,'1',$i2,
330 'a' => $naslov . ' /',
331 'c' => $row->{autori} . '.',
334 $marc->add_fields(246,'3',' ',
335 'i' => 'Naslov na engleskom:',
340 my ( $prefix, $from, $to ) = @_;
343 $out = $prefix . $from;
344 $out .= '-' . $to if $to;
349 # fake date for Koha import
350 #$marc->add_fields(260,' ',' ',
351 # c => $row->{godina},
354 $marc->add_fields(300,' ',' ',
355 a => page_range('',$row->{stranica_prva},$row->{stranica_zadnja}),
359 $marc->add_fields(363,' ',' ',
360 a => $row->{volumen},
363 ) if $row->{volumen};
365 # /data/FF/crosbi/2016-12-12/casopis-rad_napomena.sql
367 foreach my $napomena ( @{ $row->{rad_napomena} } ) {
368 $marc->add_fields(500,' ',' ',
369 a => substr($napomena, 0, 9999), # XXX marc limit for one subfield is 4 digits in dictionary
373 $marc->add_fields(520,' ',' ',
374 a => substr($row->{sazetak}, 0, 9999)
378 if ( $row->{rad_projekt} ) {
379 $marc->add_fields(536,' ',' ',
385 $marc->add_fields(546,' ',' ',
389 foreach my $v ( @{ $row->{rad_podrucje} } ) {
390 $marc->add_fields(690,' ',' ',
396 $marc->add_fields(693,' ',' ',
397 a => $row->{kljucne_rijeci},
401 $marc->add_fields(693,' ',' ',
402 a => $row->{key_words},
407 if ( $row->{autori} =~ m/ ; / ) {
408 my @a = split(/ ; /, $row->{autori});
409 shift @a; # skip first
410 $marc->add_fields(700,'1',' ',
418 my $last_delimiter = '';
420 my $value = shift @_;
421 my $delimiter = shift @_;
422 my ( $before,$after ) = ( '', '' );
423 ( $before, $value, $after ) = @$value if ( ref $value eq 'ARRAY' );
424 $out .= $last_delimiter . $before . $value . $after if $value;
425 $last_delimiter = $delimiter || last;
432 if ( $self->{_table} =~ m/(casopis|preprint)/ ) {
434 $marc->add_fields(773,'0',' ',
435 t => $row->{casopis},
437 # g => "$row->{volumen} ($row->{godina}), $row->{broj} ;" . page_range(' str. ',$row->{stranica_prva}, $row->{stranica_zadnja}),
438 g => combine( $row->{volumen}, ' ', [ '(', $row->{godina}, ')' ], ', ', $row->{broj}, ' ;', page_range(' str. ',$row->{stranica_prva}, $row->{stranica_zadnja}) ),
441 } elsif ( $self->{_table} =~ m/rknjiga/ ) {
443 # rknjiga-dbi2marc.pl
444 $marc->add_fields(773,'0',' ',
446 # d => "$row->{grad} : $row->{nakladnik}, $row->{godina}",
447 d => combine( $row->{grad}, ' : ', $row->{nakladnik}, ', ', $row->{godina} ),
449 h => $row->{ukupno_stranica},
450 n => $row->{uredink},
452 g => page_range('str. ',$row->{stranica_prva}, $row->{stranica_zadnja}),
455 } elsif ( $self->{_table} =~ m/zbornik/ ) {
457 # zbornik-dbi2marc.pl
458 $marc->add_fields(773,'0',' ',
460 # d => "$row->{grad} : $row->{nakladnik}, $row->{godina}",
461 d => combine( $row->{grad}, ' : ', $row->{nakladnik}, ', ', $row->{godina} ),
463 h => $row->{ukupno_stranica},
464 n => $row->{uredink},
466 g => page_range('str. ',$row->{stranica_prva}, $row->{stranica_zadnja}),
469 } elsif ( $self->{_table} =~ m/ostalo/ ) {
471 $marc->add_fields(773,'0',' ',
472 t => $row->{izvornik},
476 die "ERROR: 773 undefined in row ",dump($row);
480 if ( my $file = $row->{datoteka} ) {
481 $marc->add_fields(856,' ',' ',
482 u => "http://bib.irb.hr/datoteka/$file",
487 $marc->add_fields(856,' ',' ',
488 u => $row->{openurl},
489 ) if $row->{openurl};
491 foreach my $url ( @{ $row->{url} } ) {
492 $marc->add_fields(856,' ',' ',
505 c => $f942c->{ $self->{_table} } || die "ERROR no table $self->{_table} in ".dump($f942c),
506 ) if $self->{_table} !~ m/ostalo/;
508 if ( $row->{status_rada} ) {
511 g => $row->{status_rada}
515 if ( $self->{_table} =~ m/(casopis|preprint)/ ) {
517 if ( $row->{kategorija} =~ m/Znanstveni/ ) {
518 push @f942, t => '1.01'
519 } elsif ( $row->{kategorija} =~ m/Strucni/ ) {
520 push @f942, t => '1.04';
522 warn "ERROR kategorija $row->{kategorija}";
525 } elsif ( $self->{_table} =~ m/rknjiga/ ) {
527 if ( $row->{kategorija} =~ m/Znanstveni/ ) {
528 push @f942, t => '1.16.1';
529 } elsif ( $row->{kategorija} =~ m/Pregledni/ ) {
530 push @f942, t => '1.16.2';
531 } elsif ( $row->{kategorija} =~ m/Strucni/ ) {
532 push @f942, t => '1.17';
534 warn "ERROR kategorija $row->{kategorija}";
537 } elsif ( $self->{_table} =~ m/zbornik/ ) {
539 push @f942, v => $row->{vrst_recenzije};
541 } elsif ( $self->{_table} =~ m/ostalo/ ) {
546 die "ERROR _table $self->{_table}";
549 $marc->add_fields(942,' ',' ',
552 z => join(' - ', grep { defined $_ } ($row->{kategorija}, $row->{vrst_sudjelovanja}, $row->{vrsta_rada})),
556 $marc->add_fields(999,' ',' ',
562 # diag "# hash ",dump($hash);
563 diag "# marc\n", $marc->as_formatted if $ENV{DEBUG};
565 $self->save_marc( "$id.marc", $marc->as_usmarc );