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