#!/usr/bin/perl -w use strict; use Test::More tests => 2 + (4 * 1); BEGIN { require 't/test-lib.pl'; use_ok('Rose::DB::Object'); use_ok('Rose::DB::Object::Loader'); } our(%Have); # # Tests # #$Rose::DB::Object::Manager::Debug = 1; foreach my $db_type (qw(mysql pg informix sqlite)) { SKIP: { skip("$db_type tests", 1) unless($Have{$db_type}); } next unless($Have{$db_type}); Rose::DB->default_type($db_type); my $class_prefix = ucfirst($db_type); my $loader = Rose::DB::Object::Loader->new( db => Rose::DB->new, class_prefix => $class_prefix); my @classes = $loader->make_classes(include_tables => 'rose_db_object.*'); #foreach my $class (@classes) #{ # print $class->meta->perl_class_definition(braces => 'k&r', indent => 2) # if($class->can('meta')); #} my $a_class = $class_prefix . '::RoseDbObjectA'; my $b_class = $class_prefix . '::RoseDbObjectB'; my $a = $a_class->new(id => 1, name => 'A')->save; my $b = $b_class->new(id => 1, name => 'B')->save; $b = $b_class->new(id => 1)->load; $b->rose_db_object_a(undef); eval { $b->save }; ok(!$@, "pk fk column - $db_type"); } BEGIN { our %Have; # # PostgreSQL # my $dbh; eval { $dbh = Rose::DB->new('pg_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { $Have{'pg'} = 1; $Have{'pg_with_schema'} = 1; # Drop existing tables and create schema, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE rose_db_object_b'); $dbh->do('DROP TABLE rose_db_object_a'); } $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_a ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255) ) EOF $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_b ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255), FOREIGN KEY (id) REFERENCES rose_db_object_a (id) ) EOF $dbh->disconnect; } # # MySQL # eval { my $db = Rose::DB->new('mysql_admin'); $dbh = $db->retain_dbh or die Rose::DB->error; die "MySQL version too old" unless($db->database_version >= 4_000_000 && mysql_supports_innodb()); # Drop existing tables, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE rose_db_object_b'); $dbh->do('DROP TABLE rose_db_object_a'); } $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_a ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255) ) ENGINE=InnoDB EOF }; if(!$@ && $dbh) { $Have{'mysql'} = 1; $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_b ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255), FOREIGN KEY (id) REFERENCES rose_db_object_a (id) ) ENGINE=InnoDB EOF $dbh->disconnect; } # # Informix # eval { $dbh = Rose::DB->new('informix_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { $Have{'informix'} = 1; # Drop existing tables, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE rose_db_object_b'); $dbh->do('DROP TABLE rose_db_object_a'); } $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_a ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255) ) EOF $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_b ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255), FOREIGN KEY (id) REFERENCES rose_db_object_a (id) ) EOF $dbh->disconnect; } # # SQLite # eval { $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() or die Rose::DB->error; }; if(!$@ && $dbh) { $Have{'sqlite'} = 1; # Drop existing tables, ignoring errors { local $dbh->{'RaiseError'} = 0; local $dbh->{'PrintError'} = 0; $dbh->do('DROP TABLE rose_db_object_b'); $dbh->do('DROP TABLE rose_db_object_a'); } $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_a ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255) ) EOF $dbh->do(<<"EOF"); CREATE TABLE rose_db_object_b ( id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(255), FOREIGN KEY (id) REFERENCES rose_db_object_a (id) ) EOF $dbh->disconnect; } } END { # Delete test table if($Have{'pg'}) { # PostgreSQL my $dbh = Rose::DB->new('pg_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE rose_db_object_b'); $dbh->do('DROP TABLE rose_db_object_a'); $dbh->disconnect; } 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_b'); $dbh->do('DROP TABLE rose_db_object_a'); $dbh->disconnect; } if($Have{'informix'}) { # Informix my $dbh = Rose::DB->new('informix_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE rose_db_object_b'); $dbh->do('DROP TABLE rose_db_object_a'); $dbh->disconnect; } if($Have{'sqlite'}) { # Informix my $dbh = Rose::DB->new('sqlite_admin')->retain_dbh() or die Rose::DB->error; $dbh->do('DROP TABLE rose_db_object_b'); $dbh->do('DROP TABLE rose_db_object_a'); $dbh->disconnect; } }