Updating rebuild_zebra.pl : now uses etc config files
[koha_fer] / misc / migration_tools / rebuild_zebra.pl
index 1cb9618..02f50b7 100755 (executable)
@@ -177,44 +177,44 @@ if ($authorities) {
     # the record model, depending on marc flavour
     unless (-f "$authorityserverdir/tab/record.abs") {
         if (C4::Context->preference("marcflavour") eq "UNIMARC") {
-            system("cp -f $kohadir/misc/zebra/record_authorities_unimarc.abs $authorityserverdir/tab/record.abs");
+            system("cp -f $kohadir/etc/zebradb/authorities/etc/record_unimarc.abs $authorityserverdir/tab/record.abs");
             print "Info: copied record.abs for UNIMARC\n";
         } else {
-            system("cp -f $kohadir/misc/zebra/record_authorities_usmarc.abs $authorityserverdir/tab/record.abs");
+            system("cp -f $kohadir/etc/zebradb/authorities/etc/record.abs $authorityserverdir/tab/record.abs");
             print "Info: copied record.abs for USMARC\n";
         }
         $created_dir_or_file++;
     }
     unless (-f "$authorityserverdir/tab/sort-string-utf.chr") {
-        system("cp -f $kohadir/misc/zebra/sort-string-utf_french.chr $authorityserverdir/tab/sort-string-utf.chr");
+        system("cp -f $kohadir/etc/zebradb/etc/sort-string-utf_french.chr $authorityserverdir/tab/sort-string-utf.chr");
         print "Info: copied sort-string-utf.chr\n";
         $created_dir_or_file++;
     }
     unless (-f "$authorityserverdir/tab/word-phrase-utf.chr") {
-        system("cp -f $kohadir/misc/zebra/sort-string-utf_french.chr $authorityserverdir/tab/word-phrase-utf.chr");
+        system("cp -f $kohadir/etc/zebradb/etc/sort-string-utf_french.chr $authorityserverdir/tab/word-phrase-utf.chr");
         print "Info: copied word-phase-utf.chr\n";
         $created_dir_or_file++;
     }
     unless (-f "$authorityserverdir/tab/auth1.att") {
-        system("cp -f $kohadir/misc/zebra/bib1_authorities.att $authorityserverdir/tab/auth1.att");
+        system("cp -f $kohadir/etc/zebradb/authorities/etc/bib1.att $authorityserverdir/tab/auth1.att");
         print "Info: copied auth1.att\n";
         $created_dir_or_file++;
     }
     unless (-f "$authorityserverdir/tab/default.idx") {
-        system("cp -f $kohadir/misc/zebra/default.idx $authorityserverdir/tab/default.idx");
+        system("cp -f $kohadir/etc/zebradb/etc/default.idx $authorityserverdir/tab/default.idx");
         print "Info: copied default.idx\n";
         $created_dir_or_file++;
     }
     
     unless (-f "$authorityserverdir/etc/ccl.properties") {
-#         system("cp -f $kohadir/misc/zebra/ccl.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
-        system("cp -f $kohadir/misc/zebra/ccl.properties $authorityserverdir/etc/ccl.properties");
+#         system("cp -f $kohadir/etc/zebradb/ccl.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
+        system("cp -f $kohadir/etc/zebradb/ccl.properties $authorityserverdir/etc/ccl.properties");
         print "Info: copied ccl.properties\n";
         $created_dir_or_file++;
     }
     unless (-f "$authorityserverdir/etc/pqf.properties") {
-#         system("cp -f $kohadir/misc/zebra/pqf.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
-        system("cp -f $kohadir/misc/zebra/pqf.properties $authorityserverdir/etc/pqf.properties");
+#         system("cp -f $kohadir/etc/zebradb/pqf.properties ".C4::Context->zebraconfig('authorityserver')->{ccl2rpn});
+        system("cp -f $kohadir/etc/zebradb/pqf.properties $authorityserverdir/etc/pqf.properties");
         print "Info: copied pqf.properties\n";
         $created_dir_or_file++;
     }
@@ -388,43 +388,43 @@ if ($biblios) {
     # the record model, depending on marc flavour
     unless (-f "$biblioserverdir/tab/record.abs") {
         if (C4::Context->preference("marcflavour") eq "UNIMARC") {
-            system("cp -f $kohadir/misc/zebra/record_biblios_unimarc.abs $biblioserverdir/tab/record.abs");
+            system("cp -f $kohadir/etc/zebradb/biblios/etc/record_unimarc.abs $biblioserverdir/tab/record.abs");
             print "Info: copied record.abs for UNIMARC\n";
         } else {
-            system("cp -f $kohadir/misc/zebra/record_biblios_usmarc.abs $biblioserverdir/tab/record.abs");
+            system("cp -f $kohadir/etc/zebradb/biblios/etc/record.abs $biblioserverdir/tab/record.abs");
             print "Info: copied record.abs for USMARC\n";
         }
         $created_dir_or_file++;
     }
     unless (-f "$biblioserverdir/tab/sort-string-utf.chr") {
-        system("cp -f $kohadir/misc/zebra/sort-string-utf_french.chr $biblioserverdir/tab/sort-string-utf.chr");
+        system("cp -f $kohadir/etc/zebradb/etc/sort-string-utf_french.chr $biblioserverdir/tab/sort-string-utf.chr");
         print "Info: copied sort-string-utf.chr\n";
         $created_dir_or_file++;
     }
     unless (-f "$biblioserverdir/tab/word-phrase-utf.chr") {
-        system("cp -f $kohadir/misc/zebra/sort-string-utf_french.chr $biblioserverdir/tab/word-phrase-utf.chr");
+        system("cp -f $kohadir/etc/zebradb/etc/sort-string-utf_french.chr $biblioserverdir/tab/word-phrase-utf.chr");
         print "Info: copied word-phase-utf.chr\n";
         $created_dir_or_file++;
     }
     unless (-f "$biblioserverdir/tab/bib1.att") {
-        system("cp -f $kohadir/misc/zebra/bib1_biblios.att $biblioserverdir/tab/bib1.att");
+        system("cp -f $kohadir/etc/zebradb/biblios/etc/bib1.att $biblioserverdir/tab/bib1.att");
         print "Info: copied bib1.att\n";
         $created_dir_or_file++;
     }
     unless (-f "$biblioserverdir/tab/default.idx") {
-        system("cp -f $kohadir/misc/zebra/default.idx $biblioserverdir/tab/default.idx");
+        system("cp -f $kohadir/etc/zebradb/etc/default.idx $biblioserverdir/tab/default.idx");
         print "Info: copied default.idx\n";
         $created_dir_or_file++;
     }
     unless (-f "$biblioserverdir/etc/ccl.properties") {
-#         system("cp -f $kohadir/misc/zebra/ccl.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
-        system("cp -f $kohadir/misc/zebra/ccl.properties $biblioserverdir/etc/ccl.properties");
+#         system("cp -f $kohadir/etc/zebradb/ccl.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
+        system("cp -f $kohadir/etc/zebradb/ccl.properties $biblioserverdir/etc/ccl.properties");
         print "Info: copied ccl.properties\n";
         $created_dir_or_file++;
     }
     unless (-f "$biblioserverdir/etc/pqf.properties") {
-#         system("cp -f $kohadir/misc/zebra/pqf.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
-        system("cp -f $kohadir/misc/zebra/pqf.properties $biblioserverdir/etc/pqf.properties");
+#         system("cp -f $kohadir/etc/zebradb/pqf.properties ".C4::Context->zebraconfig('biblioserver')->{ccl2rpn});
+        system("cp -f $kohadir/etc/zebradb/pqf.properties $biblioserverdir/etc/pqf.properties");
         print "Info: copied pqf.properties\n";
         $created_dir_or_file++;
     }
@@ -569,10 +569,12 @@ rank:rank-1
         }
         close (OUT);
     } else {
-        $sth=$dbh->prepare("select biblionumber from biblioitems order by biblionumber $limit");
+        $sth=$dbh->prepare("SELECT biblionumber FROM biblioitems ORDER BY biblionumber $limit");
         $sth->execute();
         my $i=0;
         while (my ($biblionumber) = $sth->fetchrow) {
+            print ".";
+            print "\r$i" unless ($i++ %100);
             my $record;
             eval {
                 $record = GetMarcBiblio($biblionumber);
@@ -582,16 +584,19 @@ rank:rank-1
                 next;
             }
             next unless $record;
-#             warn $record->as_formatted;
 # die if $record->subfield('090','9') eq 11;
     #         print $record;
             # check that biblionumber & biblioitemnumber are stored in the MARC record, otherwise, add them & update the biblioitems.marcxml data.
             my $record_correct=1;
             # skip uncorrect records : isn't this bogus, as just after we reintroduce biblionumber if it's missing ?
             # FIXME next unless $record->field($biblionumbertagfield);
-            # check if biblionumber is present, otherwise, add it on the fly
+            #
+            #
+            # CHECK  biblionumber
+            #
+            #
             if ($biblionumbertagfield eq '001') {
-                unless ($record->field($biblionumbertagfield)->data()) {
+                unless ($record->field($biblionumbertagfield) && $record->field($biblionumbertagfield)->data()) {
                     $record_correct=0;
                     my $field;
                     # if the field where biblionumber is already exist, just update it, otherwise create it
@@ -606,6 +611,7 @@ rank:rank-1
                 }
             } else {
                 unless ($record->subfield($biblionumbertagfield,$biblionumbertagsubfield)) {
+#                 warn "fixing biblionumber for $biblionumbertagfield,$biblionumbertagsubfield = $biblionumber";
                     $record_correct=0;
                     my $field;
                     # if the field where biblionumber is already exist, just update it, otherwise create it
@@ -618,11 +624,16 @@ rank:rank-1
                         $record->append_fields($newfield);
                     }
                 }
-    #             warn "FIXED BIBLIONUMBER".$record->as_formatted;
+#                 warn "FIXED BIBLIONUMBER".$record->as_formatted;
             }
+            #
+            #
+            # CHECK BIBLIOITEMNUMBER
+            #
+            #
             unless ($record->subfield($biblioitemnumbertagfield,$biblioitemnumbertagsubfield)) {
+#                 warn "fixing biblioitemnumber for $biblioitemnumbertagfield,$biblioitemnumbertagsubfield = $biblionumber";
                 $record_correct=0;
-    #             warn "INCORRECT BIBLIOITEMNUMBER :".$record->as_formatted;
                 my $field;
                 # if the field where biblionumber is already exist, just update it, otherwise create it
                 if ($record->field($biblioitemnumbertagfield)) {
@@ -643,13 +654,37 @@ rank:rank-1
                 }
     #             warn "FIXED BIBLIOITEMNUMBER".$record->as_formatted;
             }
+            #
+            #
+            # CHECK FIELD 100
+            #
+            #
+            my $encoding = C4::Context->preference("marcflavour");
+            # deal with UNIMARC field 100 (encoding) : create it if needed & set encoding to unicode
+            if ( $encoding eq "UNIMARC" ) {
+                my $string;
+                if ( length($record->subfield( 100, "a" )) == 35 ) {
+                    $string = $record->subfield( 100, "a" );
+                    my $f100 = $record->field(100);
+                    $record->delete_field($f100);
+                }
+                else {
+                    $string = POSIX::strftime( "%Y%m%d", localtime );
+                    $string =~ s/\-//g;
+                    $string = sprintf( "%-*s", 35, $string );
+                }
+                substr( $string, 22, 6, "frey50" );
+                unless ( length($record->subfield( 100, "a" )) == 35 ) {
+                    $record->delete_field($record->field(100));
+                    $record->insert_grouped_field(
+                        MARC::Field->new( 100, "", "", "a" => $string ) );
+                }
+            }
             unless ($record_correct) {
                 my $update_xml = $dbh->prepare("update biblioitems set marcxml=? where biblionumber=?");
                 warn "UPDATING $biblionumber (missing biblionumber or biblioitemnumber in MARC record : ".$record->as_xml;
                 $update_xml->execute($record->as_xml,$biblionumber);
             }
-            print ".";
-            print "\r$i" unless ($i++ %100);
             # remove leader length, that could be wrong, it will be calculated automatically by as_usmarc
             # otherwise, if it's wron, zebra will fail miserabily (and never index what is after the failing record)
             my $leader=$record->leader;