moving tlc init file
[migration-tools.git] / dump_oracle_table_for_pg
index 93a2312..ebd7eb6 100755 (executable)
@@ -24,6 +24,8 @@ use warnings;
 use Carp;
 use DBI;
 use Getopt::Long;
+use Encode;
+use MARC::Charset qw/marc8_to_utf8/;
 
 my $host = 'localhost';
 my $sid = $ENV{ORACLE_SID};
@@ -36,6 +38,7 @@ my $pg_table;
 my $base_table;
 my $column_prefix = '';
 my $show_help;
+my $src_charset;
 
 my $result = GetOptions(
     'sid=s'             => \$sid,
@@ -48,6 +51,7 @@ my $result = GetOptions(
     'pg-table=s'        => \$pg_table,
     'column-prefix=s'   => \$column_prefix,
     'inherits-from=s'   => \$base_table,
+    'source-charset=s'  => \$src_charset,
     'help'              => \$show_help,
 );
 
@@ -94,7 +98,7 @@ sub export_table {
         my @data = map { normalize_value_for_tsv($_) } @$row;
         my $str = join("\t", @data);
         $str =~ s/\0//g;
-        print $fh "$str\n";
+        print $fh encode('utf8', "$str\n");
     }
     $sth->finish();
 
@@ -120,7 +124,15 @@ sub normalize_value_for_tsv {
         $val =~ s/\n/\\n/g;
         $val =~ s/\t/\\t/g;
         $val =~ s/\v/\\v/g;
-        return $val;
+        if ($src_charset) {
+            if ($src_charset eq 'marc8') {
+                return marc8_to_utf8($val);
+            } else {
+                return decode($src_charset, $val);
+            }
+        } else {
+            return $val;
+        }
     } else {
         return '\N';
     }
@@ -129,7 +141,7 @@ sub normalize_value_for_tsv {
 sub get_columns {
     my $table = shift;
     my $sth_cols = $dbh->prepare('
-        SELECT column_name, data_type, data_precision, data_scale, nullable 
+        SELECT column_name, data_type, data_precision, data_scale, data_length, nullable 
         FROM user_tab_columns WHERE table_name = ? ORDER BY column_id
     ');
     $sth_cols->execute($table);
@@ -147,11 +159,13 @@ sub get_pg_column_type {
     } elsif ($column_def->{DATA_TYPE} eq 'DATE') {
         $type = 'TIMESTAMP';
     } elsif ($column_def->{DATA_TYPE} eq 'NUMBER') {
-        if ($column_def->{DATA_SCALE} == 0) {
+        if (!defined($column_def->{DATA_SCALE}) || $column_def->{DATA_SCALE} == 0) {
             $type = 'INTEGER';
         } else {
             $type = "NUMERIC($column_def->{DATA_PRECISION},$column_def->{DATA_SCALE})";
         }
+    } elsif ($column_def->{DATA_TYPE} eq 'CHAR') {
+        $type = "CHAR($column_def->{DATA_LENGTH})";
     }
     if (defined $type) {
         $type .= " NOT NULL" if $column_def->{NULLABLE} eq 'N';