revert the too-much-change
[Evergreen.git] / Open-ILS / src / extras / import / pg_loader.pl
index 86a9f1a..679f44e 100755 (executable)
@@ -7,21 +7,23 @@ use OpenSRF::System;
 use OpenSRF::EX qw/:try/;
 use OpenSRF::Utils::SettingsClient;
 use OpenILS::Utils::Fieldmapper;
-use JSON;
+use OpenSRF::Utils::JSON;
 use FileHandle;
 
 use Time::HiRes qw/time/;
 use Getopt::Long;
 
 my @files;
-my ($config, $output, @auto, @order) =
-       ('/openils/conf/bootstrap.conf');
+my ($config, $output, @auto, @order, @wipe, $quiet) =
+       ('/openils/conf/opensrf_core.xml');
 
 GetOptions(
        'config=s'      => \$config,
        'output=s'      => \$output,
+       'wipe=s'        => \@wipe,
        'autoprimary=s' => \@auto,
        'order=s'       => \@order,
+       'quiet'         => \$quiet,
 );
 
 my %lineset;
@@ -37,12 +39,12 @@ while ( my $rec = <> ) {
 
        my $row;
        try {
-               $row = JSON->JSON2perl($rec);
+               $row = OpenSRF::Utils::JSON->JSON2perl($rec);
        } catch Error with {
                my $e = shift;
                warn "\n\n !!! Error : $e \n\n at or around line $count\n";
        };
-       die unless ($row);
+       next unless ($row);
 
        my $class = $row->class_name;
        my $hint = $row->json_hint;
@@ -56,20 +58,22 @@ while ( my $rec = <> ) {
 
                $fieldcache{$hint} =
                        { table => $class->Table,
+                         sequence => $class->Sequence,
+                         pkey => $class->Identity,
                          fields => \@cols,
                        };
        }
 
        push @{ $lineset{$hint} }, [map { $row->$_ } @{ $fieldcache{$hint}{fields} }];
 
-       if (!($count % 500)) {
+       if (!$quiet && !($count % 500)) {
                print STDERR "\r$count\t". $count / (time - $starttime);
        }
 
        $count++;
 }
 
-print STDERR "\nWriting file ...\n";
+print STDERR "\nWriting file ...\n" if (!$quiet);
 
 $output = '&STDOUT' unless ($output);
 $output = FileHandle->new(">$output") if ($output);
@@ -77,24 +81,43 @@ $output = FileHandle->new(">$output") if ($output);
 binmode($output,'utf8');
 
 $output->print("SET CLIENT_ENCODING TO 'UNICODE';\n\n");
+$output->print("BEGIN;\n\n");
 
 for my $h (@order) {
+       # continue if there was no data for this table
+       next unless ($fieldcache{$h});
+
        my $fields = join(',', @{ $fieldcache{$h}{fields} });
+       $output->print( "DELETE FROM $fieldcache{$h}{table};\n" ) if (grep {$_ eq $h } @wipe);
        $output->print( "COPY $fieldcache{$h}{table} ($fields) FROM STDIN;\n" );
 
        for my $line (@{ $lineset{$h} }) {
                my @data;
+               my $x = 0;
                for my $d (@$line) {
                        if (!defined($d)) {
                                $d = '\N';
                        } else {
-                               $d =~ s/\t/\\t/go;
-                               $d =~ s/\\/\\\\/go;
+                               $d =~ s/\f/\\f/gos;
+                               $d =~ s/\n/\\n/gos;
+                               $d =~ s/\r/\\r/gos;
+                               $d =~ s/\t/\\t/gos;
+                               $d =~ s/\\/\\\\/gos;
+                       }
+                       if ($h eq 'bre' and $fieldcache{$h}{fields}[$x] eq 'quality') {
+                               $d = int($d);
                        }
                        push @data, $d;
+                       $x++;
                }
                $output->print( join("\t", @data)."\n" );
        }
 
        $output->print('\.'."\n\n");
+       
+       $output->print("SELECT setval('$fieldcache{$h}{sequence}'::TEXT, (SELECT MAX($fieldcache{$h}{pkey}) FROM $fieldcache{$h}{table}), TRUE);\n\n")
+               if (!grep { $_ eq $h} @auto);
 }
+
+$output->print("COMMIT;\n\n");
+$output->close;