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
49 my $dbname = 'bibliografija';
52 my ( $self, $query ) = @_;
54 utf8::decode( $query );
55 warn "QUERY",dump( $query );
57 die "need query" unless defined $query;
59 my $fti = $1 if $query =~ s/^(fti_\w\w)://;
62 my $tsquery = join(' & ', split(/\s+/,$query) );
64 my $table = lc $self->{database};
65 $table =~ s/^crosbi-//g;
71 inner join rad_ustanova using (id)
72 left outer join rad_napomena using (id)
73 left outer join rad_projekt using (id)
74 left outer join rad_godina using (id)
75 left outer join rad_podrucje using (id)
76 left outer join url using (id)
77 where rad_ustanova.sifra = ?
78 and $fti @@ to_tsquery(?)
82 my $dbh = DBI->connect_cached("dbi:Pg:dbname=$dbname", '', '', {AutoCommit => 0});
84 warn "XXX SQL = ",$sql;
86 my $sth = $dbh->prepare( $sql );
94 my $hits = $sth->rows;
96 warn "# [$tsquery] $hits hits\n";
98 return $self->{hits} = $hits;
101 my $langrecode008 = {
106 'Esperanto' => 'epo',
114 'Madžarski' => 'hun',
115 'Makedonski' => 'mac',
116 'nizozemski' => 'dut',
119 'Portugalski' => 'por',
120 'portugalski' => 'por',
122 'Rumunjski' => 'rum',
123 'rumunjski' => 'rum',
126 'slovenski' => 'slv',
133 'ukrajinski' => 'ukr',
136 'hrvatsko-francuski' => 'mul',
140 my ($self,$format) = @_;
144 my $sth = $self->{_sth} || die "no _sth";
146 my $row = $sth->fetchrow_hashref;
148 die "no row" unless $row;
150 my $id = $row->{id} || die "no id";
152 my $marc = MARC::Record->new;
153 $marc->encoding('UTF-8');
155 my $leader = $marc->leader;
157 # /srv/webpac2/conf/crosbi/2016-12-12/casopis-dbi2marc.pl
160 ## LDR 06 - a - language material
161 ## LDR 07 - a - monographic component part
163 $leader =~ s/^(....)...(.+)/$1naa$2/;
165 ## LDR 17 - Encoding level ; 7 - minimal level, u - unknown
166 ## LDR 18 - i = isbd ; u = unknown
168 $leader =~ s/^(.{17})..(.+)/$1uu$2/;
170 $marc->leader( $leader );
171 warn "# leader [$leader]";
174 ### 008 - All materials
176 ## 008 - 00-05 - Date entered on file
178 my $f008 = $1 . $2 . $3 if $row->{time_date} =~ m/\d\d(\d\d)-(\d\d)-(\d\d)/;
180 ## 008 06 - Type of date/Publication status
184 ## 008 07-10 - Date 1
186 $f008 .= substr($row->{datum},0,4);
188 ## 008 11-14 - Date 2
192 $f008 .= ' ' x ( 15 - length($f008) ); # pad to 15 position
193 ## 008 15-17 - Place of publication, production, or execution - ako nema 102, popunjava se s |
196 ## 008 35-37 - Language
197 $f008 .= ' ' x ( 35 - length($f008) ); # pad to 35 position
198 if ( my $lng = $langrecode008->{ $row->{jezik} } ) {
201 warn "INFO unknown jezik [$row->{jezik}] insert into langrecode008!";
204 $f008 .= ' ' x ( 38 - length($f008) );
205 ## 008 38 - Modified record
207 ## 008 39 - Cataloging source - d (other)
210 warn "# 008 ",length($f008);
212 $marc->add_fields('008', $f008); # FIXME - mglavica check
215 if ( my $doi = $row->{doi} ) {
217 $marc->add_fields('024','7',' ',
226 ## marc 035a - System Number
227 ## polje moze sadrzavati slova i razmake
228 ## moguc problem u pretrazivanju ako ima zagrade, kako bi trebalo po standardu
230 $marc->add_fields('035',' ',' ',
231 a => join('', '(CROSBI)', $row->{id})
237 $marc->add_fields('040',' ',' ',
245 # i1=0 - Item not a translation/does not include a translation
246 # i1=1 - Item is or includes a translation
247 # i1=' ' - No information provided
250 # ponovljivo potpolje (041a) - marc_repeatable_subfield
251 # koristi se kad ima vise od jednog jezika, ili kad se radi o prijevodu
253 $marc->add_fields('041',' ',' ', map {
255 } split(/-/, $row->{jezik}));
260 ## i1 = 0 zza anonimne publikacije, i1 = 1 ako postoji 700 ili 710
261 ## i2 = pretpostavlja se na temelju clana na pocetku naslova i jezika
263 my ( $first_author, $authors ) = split(/ ;\s*/,$row->{autori});
265 $marc->add_fields(100,'1',' ','a' => $first_author );
269 my $naslov = $row->{naslov}; # XXX title?
272 $naslov =~ m/^Eine / ? 5 :
273 $naslov =~ m/(Die|Das|Der|Ein|Les|Los|The) / ? 4 :
274 $naslov =~ m/^(Um|Un|An|La|Le|Lo|Il) / ? 3 :
275 $naslov =~ m/^(A|L) / ? 2 :
276 $naslov =~ m/^L'/ ? 2 :
279 $marc->add_fields(245,'1',$i2,
280 'a' => $naslov . ' /',
281 'c' => $row->{autori} . '.',
284 $marc->add_fields(246,'3',' ',
285 'i' => 'Naslov na engleskom:',
290 my ( $prefix, $from, $to ) = @_;
293 $out = $prefix . $from;
294 $out .= '-' . $to if $to;
299 $marc->add_fields(300,' ',' ',
300 a => page_range('',$row->{stranica_prva},$row->{stranica_zadnja}),
304 $marc->add_fields(363,' ',' ',
305 a => $row->{volumen},
310 # /data/FF/crosbi/2016-12-12/casopis-rad_napomena.sql
312 $marc->add_fields(500,' ',' ',
313 a => substr($row->{napomena}, 0, 9999), # XXX marc limit for one subfield is 4 digits in dictionary
316 $marc->add_fields(520,' ',' ',
317 a => substr($row->{sazetak}, 0, 9999)
321 if ( $row->{rad_projekt} ) {
322 $marc->add_fields(536,' ',' ',
328 $marc->add_fields(546,' ',' ',
332 $marc->add_fields(690,' ',' ',
337 $marc->add_fields(693,' ',' ',
338 a => $row->{kljucne_rijeci},
342 $marc->add_fields(693,' ',' ',
343 a => $row->{key_words},
348 if ( $row->{autori} =~ m/ ; / ) {
349 my @a = split(/ ; /, $row->{autori});
350 shift @a; # skip first
351 $marc->add_fields(700,'1',' ',
357 $marc->add_fields(773,'0',' ',
358 t => $row->{casopis},
360 g => "$row->{volumen} ($row->{godina}), $row->{broj} ;" . page_range(' str. ',$row->{stranica_prva}, $row->{stranica_zadnja}),
363 if ( my $file = $row->{datoteka} ) {
364 $marc->add_fields(856,' ',' ',
365 u => "http://bib.irb.hr/datoteka/$file",
369 foreach my $name (qw( openurl url )) {
370 next if ! $row->{$name};
371 $marc->add_fields(856,' ',' ',
379 if ( $row->{status_rada} ) {
382 g => $row->{status_rada}
385 push @f942, t => '1.01' if $row->{kategorija} =~ m/Znanstveni/;
386 push @f942, t => '1.04' if $row->{kategorija} =~ m/Strucni/;
388 $marc->add_fields(942,' ',' ',
391 z => join(' - ', $row->{kategorija}, $row->{vrsta_rada}),
395 $marc->add_fields(999,' ',' ',
401 # diag "# hash ",dump($hash);
402 diag "# marc\n", $marc->as_formatted;
404 $self->save_marc( "$id.marc", $marc->as_usmarc );