The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use strict; use warnings;

BEGIN {
    my @required_modules = qw/ DBD::Oracle Class::DBI::Oracle Class::DBI::Loader /;
    my $use_statements = 'use ' . (join '; use ', @required_modules) . ';';
    my $skip_message =
	  "all: failed to load one or more of these required modules:\n"
	. (join "\n", @required_modules);
    eval $use_statements;
    plan skip_all => $skip_message if $@;

    use vars qw/ $dsn $user $dbh /;
    $dsn = 'dbi:Oracle:';
    $user = $ENV{ORACLE_USERID} || 'scott/tiger';
    eval { $dbh = DBI->connect($dsn, $user, '') or die $DBI::errstr };
    plan skip_all => 'all: failed to connect to Oracle. Try setting ORACLE_USERID=user/pass@sid.' if $@;

    plan tests => 6;
}

$dbh->do(<<'SQL');
 CREATE TABLE loader_test1 (
     id INTEGER PRIMARY KEY,
     dat VARCHAR2(10)
 )
SQL

my $sth = $dbh->prepare(<<"SQL");
 INSERT INTO loader_test1 (id,dat) VALUES(?,?)
SQL

my %test1 = (1 => 'foo', 2 => 'bar', 3 => 'baz');
while (my ($id,$dat) = each %test1) {
    $sth->execute($id,$dat);
    $sth->finish;
}

$dbh->do(<<'SQL');
 CREATE TABLE loader_test2 (
     id INTEGER PRIMARY KEY,
     dat VARCHAR2(10)
 )
SQL

$sth = $dbh->prepare(<<"SQL");
 INSERT INTO loader_test2 (id,dat) VALUES(?,?)
SQL

my %test2 = (1 => 'aaa', 2 => 'bbb', 3 => 'ccc', 4 => 'ddd');
while (my ($id,$dat) = each %test2) {
    $sth->execute($id,$dat);
    $sth->finish;
}

my $loader = Class::DBI::Loader->new
(
 dsn        => $dsn,
 user       => $user,
 #password   => $password,
 namespace  => 'OracleTest',
 constraint => '^loader_test.*'
);

is( $loader->find_class("loader_test1"), "OracleTest::LoaderTest1" );
is( $loader->find_class("loader_test2"), "OracleTest::LoaderTest2" );
my $class1 = $loader->find_class("loader_test1");
my $obj    = $class1->retrieve(1);
is( $obj->id,  1 );
is( $obj->dat, "foo" );
my $class2 = $loader->find_class("loader_test2");
is( $class2->retrieve_all, 4 );
my ($obj2) = $class2->search( dat => 'bbb' );
is( $obj2->id, 2 );

$class1->db_Main->disconnect;
$class2->db_Main->disconnect;

END {
    if ($dbh) {
        $dbh->do("DROP TABLE loader_test1");
        $dbh->do("DROP TABLE loader_test2");
        $dbh->disconnect;
     }
}