1#!/usr/bin/perl -w 2 3use strict; 4 5use Test::More tests => 2 + (1 * 1); 6 7BEGIN 8{ 9 require 't/test-lib.pl'; 10 use_ok('Rose::DB'); 11 use_ok('Rose::DB::Object::Loader'); 12} 13 14our %Have; 15 16our @Tables = qw(attribute_types datatypes); 17our $Include_Tables = join('|', @Tables); 18 19# 20# Tests 21# 22 23my $i = 1; 24 25foreach my $db_type (qw(mysql)) 26{ 27 SKIP: 28 { 29 skip("$db_type tests", 1) unless($Have{$db_type}); 30 } 31 32 next unless($Have{$db_type}); 33 34 $i++; 35 36 37 my $class_prefix = ucfirst($db_type); 38 39 #$Rose::DB::Object::Metadata::Debug = 1; 40 41 my $db = Rose::DB->new($db_type); 42 43 my $loader = 44 Rose::DB::Object::Loader->new( 45 db => $db, 46 class_prefix => $class_prefix); 47 48 # This call used to die prior to 0.7663 49 my @classes = $loader->make_classes(include_tables => $Include_Tables); 50 51 is(scalar @classes, 4, "make_classes - $db_type"); 52 53 #foreach my $class (@classes) 54 #{ 55 # if($class->can('meta')) 56 # { 57 # print $class->meta->perl_class_definition; 58 # } 59 # else 60 # { 61 # print $class->perl_class_definition; 62 # } 63 #} 64 65 #$DB::single = 1; 66 #$Rose::DB::Object::Debug = 1; 67} 68 69BEGIN 70{ 71 our %Have; 72 73 my $dbh; 74 75 # 76 # MySQL 77 # 78 79 eval 80 { 81 my $db = Rose::DB->new('mysql_admin'); 82 $dbh = $db->retain_dbh or die Rose::DB->error; 83 84 die "MySQL version too old" unless($db->database_version >= 4_000_000); 85 86 # Drop existing tables, ignoring errors 87 { 88 local $dbh->{'RaiseError'} = 0; 89 local $dbh->{'PrintError'} = 0; 90 91 $dbh->do('ALTER TABLE attribute_types DROP FOREIGN KEY attribute_types_ibfk_1'); 92 $dbh->do('ALTER TABLE datatypes DROP FOREIGN KEY datatypes_ibfk_1'); 93 $dbh->do('DROP TABLE attribute_types CASCADE'); 94 $dbh->do('DROP TABLE datatypes CASCADE'); 95 } 96 97 # Foreign key stuff requires InnoDB support 98 $dbh->do(<<"EOF"); 99CREATE TABLE attribute_types 100( 101 id BIGINT(20) UNSIGNED NOT NULL auto_increment, 102 name VARCHAR(255) NOT NULL, 103 table_name VARCHAR(255) NOT NULL, 104 datatype_id BIGINT(20) UNSIGNED NOT NULL, 105 106 PRIMARY KEY (id), 107 KEY name (name), 108 KEY datatype_id (datatype_id) 109) 110ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 111EOF 112 113 # MySQL will silently ignore the "ENGINE=InnoDB" part and create 114 # a MyISAM table instead. MySQL is evil! Now we have to manually 115 # check to make sure an InnoDB table was really created. 116 my $db_name = $db->database; 117 my $sth = $dbh->prepare("SHOW TABLE STATUS FROM `$db_name` LIKE ?"); 118 $sth->execute('attribute_types'); 119 my $info = $sth->fetchrow_hashref; 120 121 no warnings 'uninitialized'; 122 unless(lc $info->{'Type'} eq 'innodb' || lc $info->{'Engine'} eq 'innodb') 123 { 124 die "Missing InnoDB support"; 125 } 126 }; 127 128 if(!$@ && $dbh) 129 { 130 $Have{'mysql'} = 1; 131 132 $dbh->do(<<"EOF"); 133CREATE TABLE datatypes 134( 135 id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 136 name VARCHAR(255) NOT NULL, 137 format VARCHAR(255) NOT NULL default '.*', 138 139 PRIMARY KEY (id), 140 UNIQUE KEY name (name) 141) 142ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 143EOF 144 145$dbh->do(<<"EOF"); 146ALTER TABLE attribute_types ADD CONSTRAINT attribute_types_ibfk_1 147 FOREIGN KEY (datatype_id) REFERENCES datatypes (id) 148EOF 149 150$dbh->do(<<"EOF"); 151ALTER TABLE datatypes ADD CONSTRAINT datatypes_ibfk_1 152 FOREIGN KEY (id) REFERENCES attribute_types (datatype_id) 153 ON DELETE CASCADE ON UPDATE NO ACTION 154EOF 155 156 $dbh->disconnect; 157 } 158} 159 160END 161{ 162 # Delete test table 163 164 if($Have{'mysql'}) 165 { 166 # MySQL 167 my $dbh = Rose::DB->new('mysql_admin')->retain_dbh() 168 or die Rose::DB->error; 169 170 $dbh->do('ALTER TABLE attribute_types DROP FOREIGN KEY attribute_types_ibfk_1'); 171 $dbh->do('ALTER TABLE datatypes DROP FOREIGN KEY datatypes_ibfk_1'); 172 $dbh->do('DROP TABLE attribute_types CASCADE'); 173 $dbh->do('DROP TABLE datatypes CASCADE'); 174 175 $dbh->disconnect; 176 } 177} 178