The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;

use Test::More tests => 2 + (1 * 1);

BEGIN 
{
  require 't/test-lib.pl';
  use_ok('Rose::DB');
  use_ok('Rose::DB::Object::Loader');
}

our %Have;

our @Tables = qw(attribute_types datatypes);
our $Include_Tables = join('|', @Tables);

#
# Tests
#

my $i = 1;

foreach my $db_type (qw(mysql))
{
  SKIP:
  {
    skip("$db_type tests", 1)  unless($Have{$db_type});
  }

  next  unless($Have{$db_type});

  $i++;


  my $class_prefix = ucfirst($db_type);

  #$Rose::DB::Object::Metadata::Debug = 1;

  my $db = Rose::DB->new($db_type);

  my $loader = 
    Rose::DB::Object::Loader->new(
      db           => $db,
      class_prefix => $class_prefix);

  # This call used to die prior to 0.7663
  my @classes = $loader->make_classes(include_tables => $Include_Tables);

  is(scalar @classes, 4, "make_classes - $db_type");

  #foreach my $class (@classes)
  #{
  #  if($class->can('meta'))
  #  {
  #    print $class->meta->perl_class_definition;
  #  }
  #  else
  #  {
  #    print $class->perl_class_definition;
  #  }
  #}

  #$DB::single = 1;
  #$Rose::DB::Object::Debug = 1;
}

BEGIN
{
  our %Have;

  my $dbh;

  #
  # 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);

    # Drop existing tables, ignoring errors
    {
      local $dbh->{'RaiseError'} = 0;
      local $dbh->{'PrintError'} = 0;

      $dbh->do('ALTER TABLE attribute_types DROP FOREIGN KEY attribute_types_ibfk_1');
      $dbh->do('ALTER TABLE datatypes DROP FOREIGN KEY datatypes_ibfk_1');
      $dbh->do('DROP TABLE attribute_types CASCADE');
      $dbh->do('DROP TABLE datatypes CASCADE');
    }

    # Foreign key stuff requires InnoDB support
    $dbh->do(<<"EOF");
CREATE TABLE attribute_types
(
  id           BIGINT(20) UNSIGNED NOT NULL auto_increment,
  name         VARCHAR(255) NOT NULL,
  table_name   VARCHAR(255) NOT NULL,
  datatype_id  BIGINT(20) UNSIGNED NOT NULL,

  PRIMARY KEY (id),
  KEY name (name),
  KEY datatype_id (datatype_id)
)
ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1
EOF

    # MySQL will silently ignore the "ENGINE=InnoDB" part and create
    # a MyISAM table instead.  MySQL is evil!  Now we have to manually
    # check to make sure an InnoDB table was really created.
    my $db_name = $db->database;
    my $sth = $dbh->prepare("SHOW TABLE STATUS FROM `$db_name` LIKE ?");
    $sth->execute('attribute_types');
    my $info = $sth->fetchrow_hashref;

    no warnings 'uninitialized';
    unless(lc $info->{'Type'} eq 'innodb' || lc $info->{'Engine'} eq 'innodb')
    {
      die "Missing InnoDB support";
    }
  };

  if(!$@ && $dbh)
  {
    $Have{'mysql'} = 1;

    $dbh->do(<<"EOF");
CREATE TABLE datatypes
(
  id      BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  name    VARCHAR(255) NOT NULL,
  format  VARCHAR(255) NOT NULL default '.*',

  PRIMARY KEY (id),
  UNIQUE KEY name (name)
)
ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1
EOF

$dbh->do(<<"EOF");
ALTER TABLE attribute_types ADD CONSTRAINT attribute_types_ibfk_1 
  FOREIGN KEY (datatype_id) REFERENCES datatypes (id)
EOF

$dbh->do(<<"EOF");
ALTER TABLE datatypes ADD CONSTRAINT datatypes_ibfk_1 
  FOREIGN KEY (id) REFERENCES attribute_types (datatype_id) 
  ON DELETE CASCADE ON UPDATE NO ACTION
EOF

    $dbh->disconnect;
  }
}

END
{
  # Delete test table

  if($Have{'mysql'})
  {
    # MySQL
    my $dbh = Rose::DB->new('mysql_admin')->retain_dbh()
      or die Rose::DB->error;

    $dbh->do('ALTER TABLE attribute_types DROP FOREIGN KEY attribute_types_ibfk_1');
    $dbh->do('ALTER TABLE datatypes DROP FOREIGN KEY datatypes_ibfk_1');
    $dbh->do('DROP TABLE attribute_types CASCADE');
    $dbh->do('DROP TABLE datatypes CASCADE');

    $dbh->disconnect;
  }
}