7 use Data::Dump qw/dump/;
13 my $debug = $ENV{DEBUG} || 0;
22 # Bib-1 @and @and @and @and @and @and @and @or
27 # @attr 1=16 dewey (godina)
28 # @attr 1=21 subject-holding
29 # @attr 1=12 control-no
30 # @attr 1=1007 standard-id
42 1016 => 'fti_au,fti_pr:',
49 my $dbname = 'bibliografija';
54 my ( $self, $query ) = @_;
56 utf8::decode( $query );
57 warn "QUERY",dump( $query );
59 die "need query" unless defined $query;
64 my $table = lc $self->{database};
65 $table =~ s/^crosbi-//g;
67 $self->{_table} = $table;
73 ,ARRAY( select napomena from rad_napomena where rad_napomena.id = $table.id ) as rad_napomena
74 ,ARRAY( select projekt from rad_projekt where rad_projekt.id = $table.id ) as rad_projekt
75 --,ARRAY( select datum from rad_godina where rad_godina.id = $table.id ) as rad_godina
76 ,ARRAY( select sifra from rad_podrucje where rad_podrucje.id = $table.id ) as rad_podrucje
77 ,ARRAY( select url from url where url.id = $table.id ) as url
79 inner join rad_ustanova using (id) -- sifra
82 @and = ( qq{ rad_ustanova.sifra = ? } );
83 @exec = ( 130 ); # FIXME ustanova
87 warn "## parse_fti [$query]";
89 if ( $query =~ s/^(fti_.+):// ) {
92 warn "INVALID QUERY no fti_xxx: [$query]";
95 my $tsquery = join(' & ', split(/\s+/,$query) );
98 foreach my $f ( split(/,/,$fti) ) {
99 push @or, "$f @@ to_tsquery(?)";
100 push @exec, $tsquery;
102 push @and, "( " . join(" or ", @or) . ")";
105 if ( $query =~ / AND / ) {
106 foreach my $and ( split(/ AND /, $query) ) {
109 } elsif ( $query =~ m/fti_.+:/ ) {
111 } else { # no " AND " in query
112 my $tsquery = join(' & ', split(/\s+/,$query) );
113 push @and, "( fti_au @@ to_tsquery(?) or fti_pr @@ to_tsquery(?) )";
114 push @exec, $tsquery, $tsquery;
118 $sql .= "where " . join(" and ", @and);
120 warn "XXX SQL = ",$sql, dump( @exec );
122 my $dbh = DBI->connect_cached("dbi:Pg:dbname=$dbname", '', '', {AutoCommit => 0});
124 my $sth = $dbh->prepare( $sql );
126 $sth->execute( @exec );
128 my $hits = $sth->rows;
130 $self->{_sth} = $sth;
132 warn "# [$query] $hits hits\n";
134 return $self->{hits} = $hits;
137 my $langrecode008 = {
142 'Esperanto' => 'epo',
150 'Madžarski' => 'hun',
151 'Makedonski' => 'mac',
152 'nizozemski' => 'dut',
155 'Portugalski' => 'por',
156 'portugalski' => 'por',
158 'Rumunjski' => 'rum',
159 'rumunjski' => 'rum',
162 'slovenski' => 'slv',
169 'ukrajinski' => 'ukr',
172 'hrvatsko-francuski' => 'mul',
176 my ($self,$format) = @_;
180 my $row = $self->{_sth}->fetchrow_hashref;
182 warn "## row = ",dump($row) if $ENV{DEBUG};
184 die "no row" unless $row;
186 my $id = $row->{id} || die "no id";
188 my $marc = MARC::Record->new;
189 $marc->encoding('UTF-8');
191 my $leader = $marc->leader;
193 # /srv/webpac2/conf/crosbi/2016-12-12/casopis-dbi2marc.pl
196 ## LDR 06 - a - language material
197 ## LDR 07 - a - monographic component part
199 $leader =~ s/^(.....)...(.+)/$1naa$2/;
201 ## LDR 17 - Encoding level ; 7 - minimal level, u - unknown
202 ## LDR 18 - i = isbd ; u = unknown
204 $leader =~ s/^(.{17})..(.+)/$1ui$2/;
206 $marc->leader( $leader );
207 warn "# leader [$leader]";
210 ### 008 - All materials
212 ## 008 - 00-05 - Date entered on file
214 my $f008 = $1 . $2 . $3 if $row->{time_date} =~ m/\d\d(\d\d)-(\d\d)-(\d\d)/;
216 ## 008 06 - Type of date/Publication status
220 ## 008 07-10 - Date 1
222 $f008 .= substr($row->{datum},0,4);
224 ## 008 11-14 - Date 2
228 $f008 .= ' ' x ( 15 - length($f008) ); # pad to 15 position
229 ## 008 15-17 - Place of publication, production, or execution - ako nema 102, popunjava se s |
232 ## 008 35-37 - Language
233 $f008 .= ' ' x ( 35 - length($f008) ); # pad to 35 position
234 if ( my $lng = $langrecode008->{ $row->{jezik} } ) {
237 warn "INFO unknown jezik [$row->{jezik}] insert into langrecode008!";
240 $f008 .= ' ' x ( 38 - length($f008) );
241 ## 008 38 - Modified record
243 ## 008 39 - Cataloging source - d (other)
246 warn "# 008 ",length($f008);
248 $marc->add_fields('008', $f008); # FIXME - mglavica check
251 if ( my $doi = $row->{doi} ) {
253 $marc->add_fields('024','7',' ',
262 ## marc 035a - System Number
263 ## polje moze sadrzavati slova i razmake
264 ## moguc problem u pretrazivanju ako ima zagrade, kako bi trebalo po standardu
266 $marc->add_fields('035',' ',' ',
267 a => join('', '(CROSBI)', $row->{id})
273 $marc->add_fields('040',' ',' ',
281 # i1=0 - Item not a translation/does not include a translation
282 # i1=1 - Item is or includes a translation
283 # i1=' ' - No information provided
286 # ponovljivo potpolje (041a) - marc_repeatable_subfield
287 # koristi se kad ima vise od jednog jezika, ili kad se radi o prijevodu
289 $marc->add_fields('041',' ',' ', map {
291 } split(/-/, $row->{jezik}));
296 ## i1 = 0 zza anonimne publikacije, i1 = 1 ako postoji 700 ili 710
297 ## i2 = pretpostavlja se na temelju clana na pocetku naslova i jezika
299 my ( $first_author, $authors ) = split(/ ;\s*/,$row->{autori});
301 $marc->add_fields(100,'1',' ','a' => $first_author );
305 my $naslov = $row->{naslov}; # XXX title?
308 $naslov =~ m/^Eine / ? 5 :
309 $naslov =~ m/(Die|Das|Der|Ein|Les|Los|The) / ? 4 :
310 $naslov =~ m/^(Um|Un|An|La|Le|Lo|Il) / ? 3 :
311 $naslov =~ m/^(A|L) / ? 2 :
312 $naslov =~ m/^L'/ ? 2 :
315 $marc->add_fields(245,'1',$i2,
316 'a' => $naslov . ' /',
317 'c' => $row->{autori} . '.',
320 $marc->add_fields(246,'3',' ',
321 'i' => 'Naslov na engleskom:',
326 my ( $prefix, $from, $to ) = @_;
329 $out = $prefix . $from;
330 $out .= '-' . $to if $to;
335 # fake date for Koha import
336 $marc->add_fields(260,' ',' ',
340 $marc->add_fields(300,' ',' ',
341 a => page_range('',$row->{stranica_prva},$row->{stranica_zadnja}),
345 $marc->add_fields(363,' ',' ',
346 a => $row->{volumen},
351 # /data/FF/crosbi/2016-12-12/casopis-rad_napomena.sql
353 foreach my $napomena ( @{ $row->{rad_napomena} } ) {
354 $marc->add_fields(500,' ',' ',
355 a => substr($napomena, 0, 9999), # XXX marc limit for one subfield is 4 digits in dictionary
359 $marc->add_fields(520,' ',' ',
360 a => substr($row->{sazetak}, 0, 9999)
364 if ( $row->{rad_projekt} ) {
365 $marc->add_fields(536,' ',' ',
371 $marc->add_fields(546,' ',' ',
375 foreach my $v ( @{ $row->{rad_podrucje} } ) {
376 $marc->add_fields(690,' ',' ',
382 $marc->add_fields(693,' ',' ',
383 a => $row->{kljucne_rijeci},
387 $marc->add_fields(693,' ',' ',
388 a => $row->{key_words},
393 if ( $row->{autori} =~ m/ ; / ) {
394 my @a = split(/ ; /, $row->{autori});
395 shift @a; # skip first
396 $marc->add_fields(700,'1',' ',
402 $marc->add_fields(773,'0',' ',
403 t => $row->{casopis},
405 g => "$row->{volumen} ($row->{godina}), $row->{broj} ;" . page_range(' str. ',$row->{stranica_prva}, $row->{stranica_zadnja}),
408 if ( my $file = $row->{datoteka} ) {
409 $marc->add_fields(856,' ',' ',
410 u => "http://bib.irb.hr/datoteka/$file",
415 $marc->add_fields(856,' ',' ',
416 u => $row->{openurl},
417 ) if $row->{openurl};
419 foreach my $url ( @{ $row->{url} } ) {
420 $marc->add_fields(856,' ',' ',
426 c => $self->{_table} eq 'casopis' ? 'CLA' :
427 $self->{_table} eq 'preprint' ? 'PRE' :
430 if ( $row->{status_rada} ) {
433 g => $row->{status_rada}
436 push @f942, t => '1.01' if $row->{kategorija} =~ m/Znanstveni/;
437 push @f942, t => '1.04' if $row->{kategorija} =~ m/Strucni/;
439 $marc->add_fields(942,' ',' ',
442 z => join(' - ', $row->{kategorija}, $row->{vrsta_rada}),
446 $marc->add_fields(999,' ',' ',
452 # diag "# hash ",dump($hash);
453 diag "# marc\n", $marc->as_formatted if $ENV{DEBUG};
455 $self->save_marc( "$id.marc", $marc->as_usmarc );