#!perl -w
use strict;
use Encode;
use Devel::Peek;
use DBI;
use DBD::Oracle qw(ORA_OCI);
use Test::More;
unshift @INC ,'t';
require 'nchar_test_lib.pl';
my $tdata = {
cols => [
[ 'ch', 'varchar2(20)', ],
[ 'nch', 'nvarchar2(20)', ],
[ 'descr', 'varchar2(50)', ],
],
'dump' => 'DUMP(%s)',
rows => [
[
"\xb0",
"\xb0",
'DEGREE SIGN',
],
],
};
my $table = table();
my $utf8_charset = (ORA_OCI >= 9.2) ? 'AL32UTF8' : 'UTF8';
my $eight_bit_charset = 'WE8ISO8859P1';
my $dbh_utf8;
my $dbh;
SKIP: {
plan skip_all => "Oracle 9.2 or newer required" unless ORA_OCI >= 9.2;
if ($ENV{ORA_CHARSET_FAIL}) {
# Connecting up here breaks because of the charset and ncharset
# global variables defined in dbdimp.c
$dbh_utf8 = db_connect(1);
}
$dbh = db_connect(0);
plan skip_all => "Not connected to oracle" if not $dbh;
my $testcount = 8 + insert_test_count( $tdata );
plan tests => $testcount;
show_test_data( $tdata ,0 );
drop_table($dbh);
create_table($dbh, $tdata);
insert_rows( $dbh, $tdata);
my ($ch, $nch) = $dbh->selectrow_array("select ch, nch from $table");
check($ch, $nch, 0);
unless ($ENV{ORA_CHARSET_FAIL}) {
$dbh_utf8 = db_connect(1);
}
($ch, $nch) = $dbh_utf8->selectrow_array("select ch, nch from $table");
check($ch, $nch, 1);
};
sub check {
my $ch = shift;
my $nch = shift;
my $is_utf8 = shift;
if ($is_utf8) {
ok(Encode::is_utf8($ch));
ok(Encode::is_utf8($nch));
}
else {
ok(!Encode::is_utf8($ch));
ok(!Encode::is_utf8($nch));
}
is($ch, "\xb0", "match char");
is($nch, "\xb0", "match char");
}
sub db_connect
{
my $utf8 = shift;
# Make sure we really are overriding the environment settings.
my ($charset, $ncharset);
if ($utf8) {
set_nls_lang_charset($eight_bit_charset);
set_nls_nchar($eight_bit_charset);
$charset = $utf8_charset;
$ncharset = $utf8_charset;
}
else {
set_nls_lang_charset($utf8_charset);
set_nls_nchar($utf8_charset);
$charset = $eight_bit_charset;
$ncharset = $eight_bit_charset;
}
my $dsn = oracle_test_dsn();
my $dbuser = $ENV{ORACLE_USERID} || 'scott/tiger';
my $p = {
AutoCommit => 1,
PrintError => 1,
FetchHashKeyName => 'NAME_lc',
ora_envhp => 0, # force fresh environment (with current NLS env vars)
};
$p->{ora_charset} = $charset if $charset;
$p->{ora_ncharset} = $ncharset if $ncharset;
my $dbh = DBI->connect($dsn, $dbuser, '', $p);
$dbh->ora_nls_parameters ()->{NLS_CHARACTERSET} =~ m/US7ASCII/ and plan skip_all => "Database is set up as US7ASCII";
return $dbh;
}
END {
eval {
local $dbh->{PrintError} = 0;
drop_table( $dbh ) if $dbh and not $ENV{'DBD_SKIP_TABLE_DROP'};
};
}
1;