add asset.copy_alert to default base staging tables
[migration-tools.git] / mig-bin / mig-loadbibs
index cb03158..119a1ec 100755 (executable)
@@ -39,6 +39,8 @@ use MARC::Record;
 use MARC::Batch;
 use MARC::File;
 use MARC::File::XML;
+use MARC::Charset 'marc8_to_utf8';
+#binmode STDIN, ':bytes';
 use Env qw(
     HOME PGHOST PGPORT PGUSER PGDATABASE MIGSCHEMA
     MIGBASEWORKDIR MIGBASEGITDIR MIGGITDIR MIGWORKDIR
@@ -57,8 +59,10 @@ pod2usage(-verbose => 2) if defined $ARGV[0] && $ARGV[0] eq '--help';
 pod2usage(-verbose => 1) if ! $ARGV[1];
 
 my $next_arg_is_file = 0;
-my $append_is_false = 1;
+my $append = 0;
 my $next_arg_is_source = 0;
+my $next_arg_is_stage = 0;
+my $stage_table = 'biblio_record_entry_legacy';
 my $source = 'default';
 my $file_is_xml = 0;
 my $dbh = Mig::db_connect();
@@ -67,6 +71,9 @@ my $i = 0;
 my $batch;
 binmode STDIN, ':utf8';
 
+#MARC::Charset->assume_unicode(1); 
+MARC::Charset->ignore_errors(1);
+
 foreach my $arg (@ARGV) {
     if ($arg eq '--stage_file') {
         $next_arg_is_file = 1;
@@ -81,13 +88,22 @@ foreach my $arg (@ARGV) {
         $next_arg_is_source = 1;
         next;
     }
-    if ($next_arg_is_file) {
+    if ($next_arg_is_source) {
         $source = $arg;
         $next_arg_is_source = 0;
         next;
     }
+    if ($arg eq '--stage_table') {
+        $next_arg_is_stage = 1;
+        next;
+    }
+    if ($next_arg_is_stage) {
+        $stage_table = $arg;
+        $next_arg_is_stage = 0;
+        next;
+    }
        if ($arg eq '--append') {
-               $append_is_false = 0;
+               $append = 1;
                next;
        }
     if ($arg eq '--xml') {
@@ -96,21 +112,13 @@ foreach my $arg (@ARGV) {
     }
 }
 
-create_child_table($dbh);
+create_child_table($dbh); #and test to see if it exists 
 
 # normal stage table creation
-if ($append_is_false) { create_stage_table($dbh); }
-
-#sanity check and create stage table if it doesn't exist 
-my $query = "SELECT EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = '$MIGSCHEMA' AND table_name = 'biblio_record_entry_stage')";
-my $qsth = $dbh->prepare($query);
-$qsth->execute();
-my $f;
-while (my @row = $qsth->fetchrow_array) { $f = $row[0]; }
-if ($f eq 'f') { create_stage_table($dbh); }
-
-if ($append_is_false == 0) { create_stage_table($dbh); }
-
+if ($append == 0) { 
+    drop_stage_table($dbh,$stage_table); 
+    create_stage_table($dbh,$stage_table);
+    }
 if ($file_is_xml) {
        $batch = MARC::Batch->new('XML',$infile);
 } else {
@@ -118,34 +126,47 @@ if ($file_is_xml) {
 } 
 $batch->strict_off();
 
-while ( my $record = $batch->next() ) {
-       my $xml;
-       if ($file_is_xml) { $xml = $record; } 
-               else { $xml = $record->as_xml_record(); } 
+my $record;
+#while ( my $record = $batch->next() ) {
+while ( eval {$record = $batch->next()} or do { if (!$record and !$@) { last; } else { next; }} ) {
+       my $xml = $record->as_xml_record();
+    $xml = marc8_to_utf8($xml);
        $i++;
        $xml = clean_marc($xml);
        $xml = '$_$' . $xml . '$_$';
        my @warnings = $batch->warnings();
        my $warning_string;
        if (@warnings) { $warning_string = "'" . join(':',@warnings) . "'"; } else { $warning_string = "'none'"; }
-       my $sql = "INSERT INTO $MIGSCHEMA.biblio_record_entry_stage (marc,x_source,x_warnings) VALUES ($xml,$source,$warning_string);";
+       my $sql = "INSERT INTO $MIGSCHEMA.$stage_table (marc,x_source,x_warnings) VALUES ($xml,'$source',$warning_string);";
     my $sth = $dbh->prepare($sql);
-    $sth->execute();
+    eval { $sth->execute() };
        report_progress("Records staged", $i) if 0 != $i % 100;
 }
 
 $dbh->do(qq/
-    CREATE INDEX ${MIGSCHEMA}_biblio_record_entry_stage_idx ON
-        $MIGSCHEMA.biblio_record_entry_stage (id);
+    CREATE INDEX ${MIGSCHEMA}_biblio_record_entry_legacy_idx ON
+        $MIGSCHEMA.biblio_record_entry_legacy (id);
 /);
 
 print "Finis.\n";
 
+
+sub drop_stage_table {
+    my $dbh = shift;
+    my $stage_table = shift;
+    my $tablecheck = check_for_mig_table($dbh,$stage_table);
+    my $answer = 'null';
+    if ($tablecheck == 1) { $answer = prompt('Do you want to drop $MIGSCHEMA.$stage_table? This will not remove any bibs loaded to production. y/n'); }
+    if ($tablecheck == 1 and $answer eq 'y') { $dbh->do("DROP TABLE IF EXISTS $MIGSCHEMA.$stage_table;"); } 
+    if ($tablecheck == 1 and $answer ne 'y') { abort('Table not dropped, bib load aborted.'); }
+    return();
+}
+
 sub create_stage_table {
        my $dbh = shift;
+    my $stage_table = shift;
 
-    $dbh->do("DROP TABLE IF EXISTS $MIGSCHEMA.biblio_record_entry_stage;");
-    $dbh->do("CREATE UNLOGGED TABLE $MIGSCHEMA.biblio_record_entry_stage (
+    $dbh->do("CREATE UNLOGGED TABLE $MIGSCHEMA.$stage_table (
             l_bib_id    TEXT,
             x_source    TEXT,
             x_warnings  TEXT,
@@ -173,6 +194,7 @@ sub create_child_table {
 
 sub clean_marc {
     my $xml = shift;
+    $xml = marc8_to_utf8($xml);
     $xml =~ s/\n//sog;
     $xml =~ s/^<\?xml.+\?\s*>//go;
     $xml =~ s/>\s+</></go;
@@ -199,3 +221,24 @@ sub report_progress {
         print STDERR "$msg\n";
     }
 }
+
+sub check_for_mig_table {
+    my $dbh = shift;
+    my $table = shift;
+    my $sql = "SELECT 1 FROM information_schema.tables WHERE table_schema = '$MIGSCHEMA' AND table_name = '$table';";
+    my $sth = $dbh->prepare($sql);
+    $sth->execute();
+    my @sqlresult = $sth->fetchrow_array;
+    my $r = pop @sqlresult;
+    if ($r) { return $r; } else { return 0; }
+}
+
+sub prompt {
+  my ($query) = @_; 
+  local $| = 1; 
+  print $query;
+  chomp(my $answer = <STDIN>);
+  return $answer;
+}
+
+