use Carp;
use DBI;
use Getopt::Long;
+use Encode;
+use MARC::Charset qw/marc8_to_utf8/;
my $host = 'localhost';
my $sid = $ENV{ORACLE_SID};
my $base_table;
my $column_prefix = '';
my $show_help;
+my $src_charset;
my $result = GetOptions(
'sid=s' => \$sid,
'pg-table=s' => \$pg_table,
'column-prefix=s' => \$column_prefix,
'inherits-from=s' => \$base_table,
+ 'source-charset=s' => \$src_charset,
'help' => \$show_help,
);
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();
$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';
}
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);
} 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';