skip empty records (new GetMarcRecord behaviour that returns empty string and not...
[koha.git] / misc / migration_tools / rebuild_zebra.pl
1 #!/usr/bin/perl
2
3 use C4::Context;
4 use Getopt::Long;
5 use C4::Biblio;
6 use C4::AuthoritiesMarc;
7
8 use strict;
9
10 # script that checks zebradir structure & create directories & mandatory files if needed
11 #
12 #
13
14 $|=1; # flushes output
15
16 # limit for database dumping
17 my $limit;# = "LIMIT 1";
18 my $directory;
19 my $skip_export;
20 my $keep_export;
21 my $reset;
22 my $biblios;
23 my $authorities;
24 my $noxml;
25 GetOptions(
26         'd:s'      => \$directory,
27         'reset'      => \$reset,
28         's'        => \$skip_export,
29         'k'        => \$keep_export,
30         'b'        => \$biblios,
31         'noxml'        => \$noxml,
32         'a'        => \$authorities,
33         );
34
35 $directory = "export" unless $directory;
36
37
38 my $biblioserverdir = C4::Context->zebraconfig('biblioserver')->{directory};
39 my $authorityserverdir = C4::Context->zebraconfig('authorityserver')->{directory};
40
41 my $kohadir = C4::Context->config('intranetdir');
42 my $dbh = C4::Context->dbh;
43 my ($biblionumbertagfield,$biblionumbertagsubfield) = &GetMarcFromKohaField("biblio.biblionumber","");
44 my ($biblioitemnumbertagfield,$biblioitemnumbertagsubfield) = &GetMarcFromKohaField("biblioitems.biblioitemnumber","");
45
46 print "some informations\n";
47 print "=================\n";
48 print "Zebra biblio directory =>$biblioserverdir\n";
49 print "Zebra authorities directory =>$authorityserverdir\n";
50 print "Koha directory =>$kohadir\n";
51 print "BIBLIONUMBER in : $biblionumbertagfield\$$biblionumbertagsubfield\n";
52 print "BIBLIOITEMNUMBER in : $biblioitemnumbertagfield\$$biblioitemnumbertagsubfield\n";
53 print "=================\n";
54 #
55 # creating zebra-biblios.cfg depending on system
56 #
57
58 # getting zebraidx directory
59 my $zebraidxdir;
60 foreach (qw(/usr/local/bin/zebraidx
61         /opt/bin/zebraidx
62         /usr/bin/zebraidx
63         )) {
64     if ( -f $_ ) {
65         $zebraidxdir=$_;
66     }
67 }
68
69 unless ($zebraidxdir) {
70     print qq|
71     ERROR: could not find zebraidx directory
72     ERROR: Either zebra is not installed,
73     ERROR: or it's in a directory I don't checked.
74     ERROR: do a which zebraidx and edit this file to add the result you get
75 |;
76     exit;
77 }
78 $zebraidxdir =~ s/\/bin\/.*//;
79 print "Info : zebra is in $zebraidxdir \n";
80
81 # getting modules directory
82 my $modulesdir;
83 foreach (qw(/usr/local/lib/idzebra-2.0/modules/mod-grs-xml.so
84             /usr/local/lib/idzebra/modules/mod-grs-xml.so
85             /usr/lib/idzebra/modules/mod-grs-xml.so
86             /usr/lib/idzebra-2.0/modules/mod-grs-xml.so
87         )) {
88     if ( -f $_ ) {
89         $modulesdir=$_;
90     }
91 }
92
93 unless ($modulesdir) {
94     print qq|
95     ERROR: could not find mod-grs-xml.so directory
96     ERROR: Either zebra is not properly compiled (libxml2 is not setup and you don t have mod-grs-xml.so,
97     ERROR: or it's in a directory I don't checked.
98     ERROR: find where mod-grs-xml.so is and edit this file to add the result you get
99 |;
100     exit;
101 }
102 $modulesdir =~ s/\/modules\/.*//;
103 print "Info: zebra modules dir : $modulesdir\n";
104
105 # getting tab directory
106 my $tabdir;
107 foreach (qw(/usr/local/share/idzebra/tab/explain.att
108             /usr/local/share/idzebra-2.0/tab/explain.att
109             /usr/share/idzebra/tab/explain.att
110             /usr/share/idzebra-2.0/tab/explain.att
111         )) {
112     if ( -f $_ ) {
113         $tabdir=$_;
114     }
115 }
116
117 unless ($tabdir) {
118     print qq|
119     ERROR: could not find explain.att directory
120     ERROR: Either zebra is not properly compiled,
121     ERROR: or it's in a directory I don't checked.
122     ERROR: find where explain.att is and edit this file to add the result you get
123 |;
124     exit;
125 }
126 $tabdir =~ s/\/tab\/.*//;
127 print "Info: tab dir : $tabdir\n";
128
129 #
130 # AUTHORITIES creating directory structure
131 #
132 my $created_dir_or_file = 0;
133 if ($authorities) {
134     print "====================\n";
135     print "checking directories & files for authorities\n";
136     print "====================\n";
137     unless (-d "$authorityserverdir") {
138         system("mkdir -p $authorityserverdir");
139         print "Info: created $authorityserverdir\n";
140         $created_dir_or_file++;
141     }
142     unless (-d "$authorityserverdir/lock") {
143         mkdir "$authorityserverdir/lock";
144         print "Info: created $authorityserverdir/lock\n";
145         $created_dir_or_file++;
146     }
147     unless (-d "$authorityserverdir/register") {
148         mkdir "$authorityserverdir/register";
149         print "Info: created $authorityserverdir/register\n";
150         $created_dir_or_file++;
151     }
152     unless (-d "$authorityserverdir/shadow") {
153         mkdir "$authorityserverdir/shadow";
154         print "Info: created $authorityserverdir/shadow\n";
155         $created_dir_or_file++;
156     }
157     unless (-d "$authorityserverdir/tab") {
158         mkdir "$authorityserverdir/tab";
159         print "Info: created $authorityserverdir/tab\n";
160         $created_dir_or_file++;
161     }
162     unless (-d "$authorityserverdir/key") {
163         mkdir "$authorityserverdir/key";
164         print "Info: created $authorityserverdir/key\n";
165         $created_dir_or_file++;
166     }
167     
168     unless (-d "$authorityserverdir/etc") {
169         mkdir "$authorityserverdir/etc";
170         print "Info: created $authorityserverdir/etc\n";
171         $created_dir_or_file++;
172     }
173     
174     #
175     # AUTHORITIES : copying mandatory files
176     #
177     # the record model, depending on marc flavour
178     unless (-f "$authorityserverdir/tab/record.abs") {
179         if (C4::Context->preference("marcflavour") eq "UNIMARC") {
180             system("cp -f $kohadir/misc/zebra/record_authorities_unimarc.abs $authorityserverdir/tab/record.abs");
181             print "Info: copied record.abs for UNIMARC\n";
182         } else {
183             system("cp -f $kohadir/misc/zebra/record_authorities_usmarc.abs $authorityserverdir/tab/record.abs");
184             print "Info: copied record.abs for USMARC\n";
185         }
186         $created_dir_or_file++;
187     }
188     unless (-f "$authorityserverdir/tab/sort-string-utf.chr") {
189         system("cp -f $kohadir/misc/zebra/sort-string-utf_french.chr $authorityserverdir/tab/sort-string-utf.chr");
190         print "Info: copied sort-string-utf.chr\n";
191         $created_dir_or_file++;
192     }
193     unless (-f "$authorityserverdir/tab/word-phrase-utf.chr") {
194         system("cp -f $kohadir/misc/zebra/sort-string-utf_french.chr $authorityserverdir/tab/word-phrase-utf.chr");
195         print "Info: copied word-phase-utf.chr\n";
196         $created_dir_or_file++;
197     }
198     unless (-f "$authorityserverdir/tab/auth1.att") {
199         system("cp -f $kohadir/misc/zebra/bib1_authorities.att $authorityserverdir/tab/auth1.att");
200         print "Info: copied auth1.att\n";
201         $created_dir_or_file++;
202     }
203     unless (-f "$authorityserverdir/tab/default.idx") {
204         system("cp -f $kohadir/misc/zebra/default.idx $authorityserverdir/tab/default.idx");
205         print "Info: copied default.idx\n";
206         $created_dir_or_file++;
207     }
208     
209     unless (-f "$authorityserverdir/etc/ccl.properties") {
210 #         system("cp -f $kohadir/misc/zebra/ccl.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
211         system("cp -f $kohadir/misc/zebra/ccl.properties $authorityserverdir/etc/ccl.properties");
212         print "Info: copied ccl.properties\n";
213         $created_dir_or_file++;
214     }
215     unless (-f "$authorityserverdir/etc/pqf.properties") {
216 #         system("cp -f $kohadir/misc/zebra/pqf.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
217         system("cp -f $kohadir/misc/zebra/pqf.properties $authorityserverdir/etc/pqf.properties");
218         print "Info: copied pqf.properties\n";
219         $created_dir_or_file++;
220     }
221     
222     #
223     # AUTHORITIES : copying mandatory files
224     #
225     unless (-f C4::Context->zebraconfig('authorityserver')->{config}) {
226     open ZD,">:utf8 ",C4::Context->zebraconfig('authorityserver')->{config};
227     print ZD "
228 # generated by KOHA/misc/migration_tools/rebuild_zebra.pl 
229 profilePath:\${srcdir:-.}:$authorityserverdir/tab/:$tabdir/tab/:\${srcdir:-.}/tab/
230
231 encoding: UTF-8
232 # Files that describe the attribute sets supported.
233 attset: auth1.att
234 attset: explain.att
235 attset: gils.att
236
237 modulePath:$modulesdir/modules/
238 # Specify record type
239 iso2709.recordType:grs.marcxml.record
240 recordType:grs.xml
241 recordId: (auth1,Local-Number)
242 storeKeys:1
243 storeData:1
244
245
246 # Lock File Area
247 lockDir: $authorityserverdir/lock
248 perm.anonymous:r
249 perm.kohaadmin:rw
250 passw.passwd
251 shadow
252 register: $authorityserverdir/register:4G
253 shadow: $authorityserverdir/shadow:4G
254
255 # Temp File area for result sets
256 setTmpDir: $authorityserverdir/tmp
257
258 # Temp File area for index program
259 keyTmpDir: $authorityserverdir/key
260
261 # Approx. Memory usage during indexing
262 memMax: 40M
263 rank:rank-1
264     ";
265         print "Info: creating zebra-authorities.cfg\n";
266         $created_dir_or_file++;
267     }
268     
269     if ($created_dir_or_file) {
270         print "Info: created : $created_dir_or_file directories & files\n";
271     } else {
272         print "Info: file & directories OK\n";
273     }
274     
275     #
276     # exporting authorities
277     #
278     if ($skip_export) {
279         print "====================\n";
280         print "SKIPPING authorities export\n";
281         print "====================\n";
282     } else {
283         print "====================\n";
284         print "exporting authorities\n";
285         print "====================\n";
286         mkdir "$directory" unless (-d $directory);
287         mkdir "$directory/authorities" unless (-d "$directory/authorities");
288         open(OUT,">:utf8","$directory/authorities/authorities.iso2709") or die $!;
289         my $dbh=C4::Context->dbh;
290         my $sth;
291         $sth=$dbh->prepare("select authid,marc from auth_header $limit");
292         $sth->execute();
293         my $i=0;
294         while (my ($authid,$record) = $sth->fetchrow) {
295             # FIXME : we retrieve the iso2709 record. if the GetAuthority (that uses the XML) fails
296             # due to some MARC::File::XML failure, then try the iso2709, 
297             # (add authid & authtype if needed)
298             my $record;
299             eval {
300                 $record = GetAuthority($authid);
301             };
302             if($@){
303                 print "  There was some pb getting authority : ".$authid."\n";
304             next;
305             }
306                 
307             print ".";
308             print "\r$i" unless ($i++ %100);
309 #            # remove leader length, that could be wrong, it will be calculated automatically by as_usmarc
310 #            # otherwise, if it's wron, zebra will fail miserabily (and never index what is after the failing record)
311             my $leader=$record->leader;
312             substr($leader,0,5)='     ';
313             substr($leader,10,7)='22     ';
314             $record->leader(substr($leader,0,24));
315             print OUT $record->as_usmarc;
316         }
317         close(OUT);
318     }
319     
320     #
321     # and reindexing everything
322     #
323     print "====================\n";
324     print "REINDEXING zebra\n";
325     print "====================\n";
326     system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities init") if ($reset);
327     system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities update $directory/authorities");
328     system("zebraidx -c ".C4::Context->zebraconfig('authorityserver')->{config}." -g iso2709 -d authorities commit");
329 } else {
330     print "skipping authorities\n";
331 }
332 #################################################################################################################
333 #                        BIBLIOS 
334 #################################################################################################################
335
336 if ($biblios) {
337     print "====================\n";
338     print "checking directories & files for biblios\n";
339     print "====================\n";
340     
341     #
342     # BIBLIOS : creating directory structure
343     #
344     unless (-d "$biblioserverdir") {
345         system("mkdir -p $biblioserverdir");
346         print "Info: created $biblioserverdir\n";
347         $created_dir_or_file++;
348     }
349     unless (-d "$biblioserverdir/lock") {
350         mkdir "$biblioserverdir/lock";
351         print "Info: created $biblioserverdir/lock\n";
352         $created_dir_or_file++;
353     }
354     unless (-d "$biblioserverdir/register") {
355         mkdir "$biblioserverdir/register";
356         print "Info: created $biblioserverdir/register\n";
357         $created_dir_or_file++;
358     }
359     unless (-d "$biblioserverdir/shadow") {
360         mkdir "$biblioserverdir/shadow";
361         print "Info: created $biblioserverdir/shadow\n";
362         $created_dir_or_file++;
363     }
364     unless (-d "$biblioserverdir/tab") {
365         mkdir "$biblioserverdir/tab";
366         print "Info: created $biblioserverdir/tab\n";
367         $created_dir_or_file++;
368     }
369     unless (-d "$biblioserverdir/key") {
370         mkdir "$biblioserverdir/key";
371         print "Info: created $biblioserverdir/key\n";
372         $created_dir_or_file++;
373     }
374     unless (-d "$biblioserverdir/etc") {
375         mkdir "$biblioserverdir/etc";
376         print "Info: created $biblioserverdir/etc\n";
377         $created_dir_or_file++;
378     }
379     
380     #
381     # BIBLIOS : copying mandatory files
382     #
383     # the record model, depending on marc flavour
384     unless (-f "$biblioserverdir/tab/record.abs") {
385         if (C4::Context->preference("marcflavour") eq "UNIMARC") {
386             system("cp -f $kohadir/misc/zebra/record_biblios_unimarc.abs $biblioserverdir/tab/record.abs");
387             print "Info: copied record.abs for UNIMARC\n";
388         } else {
389             system("cp -f $kohadir/misc/zebra/record_biblios_usmarc.abs $biblioserverdir/tab/record.abs");
390             print "Info: copied record.abs for USMARC\n";
391         }
392         $created_dir_or_file++;
393     }
394     unless (-f "$biblioserverdir/tab/sort-string-utf.chr") {
395         system("cp -f $kohadir/misc/zebra/sort-string-utf_french.chr $biblioserverdir/tab/sort-string-utf.chr");
396         print "Info: copied sort-string-utf.chr\n";
397         $created_dir_or_file++;
398     }
399     unless (-f "$biblioserverdir/tab/word-phrase-utf.chr") {
400         system("cp -f $kohadir/misc/zebra/sort-string-utf_french.chr $biblioserverdir/tab/word-phrase-utf.chr");
401         print "Info: copied word-phase-utf.chr\n";
402         $created_dir_or_file++;
403     }
404     unless (-f "$biblioserverdir/tab/bib1.att") {
405         system("cp -f $kohadir/misc/zebra/bib1_biblios.att $biblioserverdir/tab/bib1.att");
406         print "Info: copied bib1.att\n";
407         $created_dir_or_file++;
408     }
409     unless (-f "$biblioserverdir/tab/default.idx") {
410         system("cp -f $kohadir/misc/zebra/default.idx $biblioserverdir/tab/default.idx");
411         print "Info: copied default.idx\n";
412         $created_dir_or_file++;
413     }
414     unless (-f "$biblioserverdir/etc/ccl.properties") {
415 #         system("cp -f $kohadir/misc/zebra/ccl.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
416         system("cp -f $kohadir/misc/zebra/ccl.properties $biblioserverdir/etc/ccl.properties");
417         print "Info: copied ccl.properties\n";
418         $created_dir_or_file++;
419     }
420     unless (-f "$biblioserverdir/etc/pqf.properties") {
421 #         system("cp -f $kohadir/misc/zebra/pqf.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
422         system("cp -f $kohadir/misc/zebra/pqf.properties $biblioserverdir/etc/pqf.properties");
423         print "Info: copied pqf.properties\n";
424         $created_dir_or_file++;
425     }
426     
427     #
428     # BIBLIOS : copying mandatory files
429     #
430     unless (-f C4::Context->zebraconfig('biblioserver')->{config}) {
431     open ZD,">:utf8 ",C4::Context->zebraconfig('biblioserver')->{config};
432     print ZD "
433 # generated by KOHA/misc/migrtion_tools/rebuild_zebra.pl 
434 profilePath:\${srcdir:-.}:$biblioserverdir/tab/:$tabdir/tab/:\${srcdir:-.}/tab/
435
436 encoding: UTF-8
437 # Files that describe the attribute sets supported.
438 attset:bib1.att
439 attset:explain.att
440 attset:gils.att
441
442 modulePath:$modulesdir/modules/
443 # Specify record type
444 iso2709.recordType:grs.marcxml.record
445 recordType:grs.xml
446 recordId: (bib1,Local-Number)
447 storeKeys:1
448 storeData:1
449
450
451 # Lock File Area
452 lockDir: $biblioserverdir/lock
453 perm.anonymous:r
454 perm.kohaadmin:rw
455 passw.passwd
456 shadow
457 register: $biblioserverdir/register:4G
458 shadow: $biblioserverdir/shadow:4G
459
460 # Temp File area for result sets
461 setTmpDir: $biblioserverdir/tmp
462
463 # Temp File area for index program
464 keyTmpDir: $biblioserverdir/key
465
466 # Approx. Memory usage during indexing
467 memMax: 40M
468 rank:rank-1
469     ";
470         print "Info: creating zebra-biblios.cfg\n";
471         $created_dir_or_file++;
472     }
473     
474     if ($created_dir_or_file) {
475         print "Info: created : $created_dir_or_file directories & files\n";
476     } else {
477         print "Info: file & directories OK\n";
478     }
479     
480     # die;
481     #
482     # exporting biblios
483     #
484     if ($skip_export) {
485         print "====================\n";
486         print "SKIPPING biblio export\n";
487         print "====================\n";
488     } else {
489         print "====================\n";
490         print "exporting biblios\n";
491         print "====================\n";
492         mkdir "$directory" unless (-d $directory);
493         mkdir "$directory/biblios" unless (-d "$directory/biblios");
494         open(OUT,">:utf8 ","$directory/biblios/export") or die $!;
495         my $dbh=C4::Context->dbh;
496         my $sth;
497         if ($noxml){
498           $sth=$dbh->prepare("select biblionumber,marc from biblioitems order by biblionumber $limit");
499           $sth->execute();
500           my $i=0;
501           while (my ($biblionumber,$marc) = $sth->fetchrow) {
502             my $record;
503             $record=MARC::Record->new_from_usmarc($marc);
504             my $record_correct=1;
505             next unless $record->field($biblionumbertagfield);
506             if ($biblionumbertagfield eq '001') {
507                 unless ($record->field($biblionumbertagfield)->data()) {
508                     $record_correct=0;
509                     my $field;
510                     # if the field where biblionumber is already exist, just update it, otherwise create it
511                             if ($record->field($biblionumbertagfield)) {
512                                 $field =  $record->field($biblionumbertagfield);
513                                 $field->update($biblionumber);
514                             } else {
515                                 my $newfield;
516                                 $newfield = MARC::Field->new( $biblionumbertagfield, $biblionumber);
517                                 $record->append_fields($newfield);
518                             }
519                         }
520                     } else {
521                         unless ($record->subfield($biblionumbertagfield,$biblionumbertagsubfield)) {
522                             $record_correct=0;
523                             my $field;
524                             # if the field where biblionumber is already exist, just update it, otherwise create it
525                             if ($record->field($biblionumbertagfield)) {
526                                 $field =  $record->field($biblionumbertagfield);
527                                 $field->add_subfields($biblionumbertagsubfield => $biblionumber);
528                             } else {
529                                 my $newfield;
530                                 $newfield = MARC::Field->new( $biblionumbertagfield,'','', $biblionumbertagsubfield => $biblionumber);
531                                 $record->append_fields($newfield);
532                             }
533                         }
534     #             warn "FIXED BIBLIONUMBER".$record->as_formatted;
535                     }
536                     unless ($record->subfield($biblioitemnumbertagfield,$biblioitemnumbertagsubfield)) {
537                                 $record_correct=0;
538                     #             warn "INCORRECT BIBLIOITEMNUMBER :".$record->as_formatted;
539                         my $field;
540                                 # if the field where biblionumber is already exist, just update it, otherwise create it
541                                 if ($record->field($biblioitemnumbertagfield)) {
542                                     $field =  $record->field($biblioitemnumbertagfield);
543                                     if ($biblioitemnumbertagfield <10) {
544                                         $field->update($biblionumber);
545                                     } else {
546                                         $field->add_subfields($biblioitemnumbertagsubfield => $biblionumber);
547                                     }
548                                 } else {
549                                     my $newfield;
550                                     if ($biblioitemnumbertagfield <10) {
551                                         $newfield = MARC::Field->new( $biblioitemnumbertagfield, $biblionumber);
552                                     } else {
553                                         $newfield = MARC::Field->new( $biblioitemnumbertagfield,'','', $biblioitemnumbertagsubfield => $biblionumber);
554                                     }
555                                     $record->insert_grouped_field($newfield);
556                         }
557             #             warn "FIXED BIBLIOITEMNUMBER".$record->as_formatted;
558                     }
559                     my $leader=$record->leader;
560                     substr($leader,0,5)='     ';
561                     substr($leader,10,7)='22     ';
562                     $record->leader(substr($leader,0,24));
563                     print OUT $record->as_usmarc();
564                 }
565                 close (OUT);
566         } else {
567         $sth=$dbh->prepare("select biblionumber from biblioitems order by biblionumber $limit");
568         $sth->execute();
569         my $i=0;
570         while (my ($biblionumber) = $sth->fetchrow) {
571             my $record;
572             eval {
573                 $record = GetMarcBiblio($biblionumber);
574             };
575             if($@){
576                 print "  There was some pb getting biblio : #".$biblionumber."\n";
577                 next;
578             }
579             next unless $record;
580 #             warn $record->as_formatted;
581 # die if $record->subfield('090','9') eq 11;
582     #         print $record;
583             # check that biblionumber & biblioitemnumber are stored in the MARC record, otherwise, add them & update the biblioitems.marcxml data.
584             my $record_correct=1;
585             next unless $record->field($biblionumbertagfield);
586             if ($biblionumbertagfield eq '001') {
587                 unless ($record->field($biblionumbertagfield)->data()) {
588                     $record_correct=0;
589                     my $field;
590                     # if the field where biblionumber is already exist, just update it, otherwise create it
591                     if ($record->field($biblionumbertagfield)) {
592                         $field =  $record->field($biblionumbertagfield);
593                         $field->update($biblionumber);
594                     } else {
595                         my $newfield;
596                         $newfield = MARC::Field->new( $biblionumbertagfield, $biblionumber);
597                         $record->append_fields($newfield);
598                     }
599                 }
600             } else {
601                 unless ($record->subfield($biblionumbertagfield,$biblionumbertagsubfield)) {
602                     $record_correct=0;
603                     my $field;
604                     # if the field where biblionumber is already exist, just update it, otherwise create it
605                     if ($record->field($biblionumbertagfield)) {
606                         $field =  $record->field($biblionumbertagfield);
607                         $field->add_subfields($biblionumbertagsubfield => $biblionumber);
608                     } else {
609                         my $newfield;
610                         $newfield = MARC::Field->new( $biblionumbertagfield,'','', $biblionumbertagsubfield => $biblionumber);
611                         $record->append_fields($newfield);
612                     }
613                 }
614     #             warn "FIXED BIBLIONUMBER".$record->as_formatted;
615             }
616             unless ($record->subfield($biblioitemnumbertagfield,$biblioitemnumbertagsubfield)) {
617                 $record_correct=0;
618     #             warn "INCORRECT BIBLIOITEMNUMBER :".$record->as_formatted;
619                 my $field;
620                 # if the field where biblionumber is already exist, just update it, otherwise create it
621                 if ($record->field($biblioitemnumbertagfield)) {
622                     $field =  $record->field($biblioitemnumbertagfield);
623                     if ($biblioitemnumbertagfield <10) {
624                         $field->update($biblionumber);
625                     } else {
626                         $field->add_subfields($biblioitemnumbertagsubfield => $biblionumber);
627                     }
628                 } else {
629                     my $newfield;
630                     if ($biblioitemnumbertagfield <10) {
631                         $newfield = MARC::Field->new( $biblioitemnumbertagfield, $biblionumber);
632                     } else {
633                         $newfield = MARC::Field->new( $biblioitemnumbertagfield,'','', $biblioitemnumbertagsubfield => $biblionumber);
634                     }
635                     $record->insert_grouped_field($newfield);
636                 }
637     #             warn "FIXED BIBLIOITEMNUMBER".$record->as_formatted;
638             }
639             unless ($record_correct) {
640                 my $update_xml = $dbh->prepare("update biblioitems set marcxml=? where biblionumber=?");
641                 warn "UPDATING $biblionumber (missing biblionumber or biblioitemnumber in MARC record : ".$record->as_xml;
642                 $update_xml->execute($record->as_xml,$biblionumber);
643             }
644             print ".";
645             print "\r$i" unless ($i++ %100);
646             # remove leader length, that could be wrong, it will be calculated automatically by as_usmarc
647             # otherwise, if it's wron, zebra will fail miserabily (and never index what is after the failing record)
648             my $leader=$record->leader;
649             substr($leader,0,5)='     ';
650             substr($leader,10,7)='22     ';
651             $record->leader(substr($leader,0,24));
652             print OUT $record->as_usmarc();
653         }
654         close(OUT);
655         }
656     }
657     
658     #
659     # and reindexing everything
660     #
661     print "====================\n";
662     print "REINDEXING zebra\n";
663     print "====================\n";
664     system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios init") if ($reset);
665     system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios update $directory/biblios");
666     system("zebraidx -g iso2709 -c ".C4::Context->zebraconfig('biblioserver')->{config}." -d biblios commit");
667 } else {
668     print "skipping biblios\n";
669 }
670
671 print "====================\n";
672 print "CLEANING\n";
673 print "====================\n";
674 if ($keep_export) {
675     print "NOTHING cleaned : the $directory has been kept. You can re-run this script with the -s parameter if you just want to rebuild zebra after changing the record.abs or another zebra config file\n";
676 } else {
677     system("rm -rf $directory");
678     print "directory $directory deleted\n";
679 }