#!/usr/bin/perl -w
use strict;
use Test::More tests => 3;
BEGIN
{
require 't/test-lib.pl';
use_ok('Rose::DB::Object');
use_ok('Rose::DB::Object::Manager');
}
if(defined $ENV{'RDBO_NESTED_JOINS'} && Rose::DB::Object::Manager->can('default_nested_joins'))
{
Rose::DB::Object::Manager->default_nested_joins($ENV{'RDBO_NESTED_JOINS'});
}
our %Have;
#
# Tests
#
foreach my $db_type (qw(mysql))
{
SKIP:
{
skip("$db_type tests", 1) unless($Have{$db_type});
}
next unless($Have{$db_type});
Rose::DB->default_type($db_type);
my $class = ucfirst($db_type) . '::A';
my $as =
Rose::DB::Object::Manager->get_objects(
#debug => 1,
object_class => $class,
with_objects => [ 'bs.c' ]);
is(scalar @$as, 2, "check count - $db_type");
}
BEGIN
{
our %Have;
#
# MySQL
#
my $dbh;
eval
{
my $db = Rose::DB->new('mysql_admin');
$dbh = $db->retain_dbh or die Rose::DB->error;
# Drop existing tables, ignoring errors
{
local $dbh->{'RaiseError'} = 0;
local $dbh->{'PrintError'} = 0;
$dbh->do('DROP TABLE rose_db_object_test_b');
$dbh->do('DROP TABLE rose_db_object_test_a');
$dbh->do('DROP TABLE rose_db_object_test_c');
}
};
if(!$@ && $dbh)
{
$Have{'mysql'} = 1;
$dbh->do(<<"EOF");
CREATE TABLE rose_db_object_test_a
(
id INT PRIMARY KEY,
name VARCHAR(255)
)
EOF
$dbh->do(<<"EOF");
CREATE TABLE rose_db_object_test_c
(
id INT PRIMARY KEY,
name VARCHAR(255));
EOF
$dbh->do(<<"EOF");
CREATE TABLE rose_db_object_test_b
(
id INT PRIMARY KEY,
name VARCHAR(255),
a_id INT NOT NULL REFERENCES a (id),
c_id INT NOT NULL REFERENCES c (id)
)
EOF
Rose::DB->default_type('mysql');
package Mysql::A;
our @ISA = qw(Rose::DB::Object);
__PACKAGE__->meta->setup
(
table => 'rose_db_object_test_a',
columns => [ qw(id name) ],
relationships =>
[
bs =>
{
type => 'one to many',
class => 'Mysql::B',
column_map => { id => 'a_id' },
},
],
);
package Mysql::B;
our @ISA = qw(Rose::DB::Object);
__PACKAGE__->meta->setup
(
table => 'rose_db_object_test_b',
columns =>
[
id => { type => 'serial', primary_key => 1 },
name => { type => 'varchar', length => 255 },
a_id => { type => 'integer', not_null => 1 },
c_id => { type => 'integer', not_null => 1 },
],
foreign_keys =>
[
a =>
{
class => 'Mysql::A',
key_columns => { a_id => 'id' },
},
c =>
{
class => 'Mysql::C',
key_columns => { a_id => 'id' },
}
],
);
package Mysql::C;
our @ISA = qw(Rose::DB::Object);
__PACKAGE__->meta->setup
(
table => 'rose_db_object_test_c',
columns =>
[
id => { type => 'serial', primary_key => 1 },
name => { type => 'varchar', length => 255 },
]
);
$dbh->do("insert into rose_db_object_test_a (id, name) values (1, 'one')");
$dbh->do("insert into rose_db_object_test_a (id, name) values (2, 'two')");
$dbh->do("insert into rose_db_object_test_c (id, name) values (1, 'c one')");
$dbh->do("insert into rose_db_object_test_c (id, name) values (2, 'c two')");
$dbh->do("insert into rose_db_object_test_b (id, name, a_id, c_id) values (1, 'b one', 1, 1)");
$dbh->disconnect;
}
}
END
{
# Delete test tables
if($Have{'mysql'})
{
# MySQL
my $dbh = Rose::DB->new('mysql_admin')->retain_dbh()
or die Rose::DB->error;
$dbh->do('DROP TABLE rose_db_object_test_b');
$dbh->do('DROP TABLE rose_db_object_test_a');
$dbh->do('DROP TABLE rose_db_object_test_c');
$dbh->disconnect;
}
}