use strict;
use base 'DBIx::Class::Schema::Loader::Generic';
-use DBI;
use Carp;
=head1 NAME
dsn => "dbi:mysql:dbname",
user => "root",
password => "",
- namespace => "Data",
);
=head1 DESCRIPTION
=cut
-sub _db_classes {
+sub _loader_db_classes {
return qw/DBIx::Class::PK::Auto::MySQL/;
}
-# Very experimental and untested!
-sub _relationships {
- my $self = shift;
- my @tables = $self->tables;
- my $dbh = $self->{_storage}->dbh;
- my $dsn = $self->{_datasource}[0];
+sub _loader_relationships {
+ my $class = shift;
+ my @tables = $class->tables;
+ my $dbh = $class->storage->dbh;
+ my $dsn = $class->storage->connect_info->[0];
my %conn =
$dsn =~ m/\Adbi:\w+(?:\(.*?\))?:(.+)\z/i
&& index( $1, '=' ) >= 0
my $dbname = $conn{database} || $conn{dbname} || $conn{db};
die("Can't figure out the table name automatically.") if !$dbname;
+ my $quoter = $dbh->get_info(29) || q{`};
+
foreach my $table (@tables) {
my $query = "SHOW CREATE TABLE ${dbname}.${table}";
my $sth = $dbh->prepare($query)
$sth->execute;
my $table_def = $sth->fetchrow_arrayref->[1] || '';
- my (@cols) = ($table_def =~ /CONSTRAINT `.*` FOREIGN KEY \(`(.*)`\) REFERENCES `(.*)` \(`(.*)`\)/g);
+ my (@reldata) = ($table_def =~ /CONSTRAINT `.*` FOREIGN KEY \(`(.*)`\) REFERENCES `(.*)` \(`(.*)`\)/ig);
+
+ while (scalar @reldata > 0) {
+ my $cols = shift @reldata;
+ my $f_table = shift @reldata;
+ my $f_cols = shift @reldata;
- while (scalar @cols > 0) {
- my $column = shift @cols;
- my $remote_table = shift @cols;
- my $remote_column = shift @cols;
+ my @cols = map { s/$quoter//; $_ } split(/\s*,\s*/,$cols);
+ my @f_cols = map { s/$quoter//; $_ } split(/\s*,\s*/,$f_cols);
+ die "Mismatched column count in rel for $table => $f_table"
+ if @cols != @f_cols;
- eval { $self->_belongs_to_many( $table, $column, $remote_table, $remote_column) };
- warn qq/\# belongs_to_many failed "$@"\n\n/ if $@ && $self->debug;
+ my $cond = {};
+ for(my $i = 0; $i < @cols; $i++) {
+ $cond->{$f_cols[$i]} = $cols[$i];
+ }
+
+ eval { $class->_loader_make_cond_rel( $table, $f_table, $cond) };
+ warn qq/\# belongs_to_many failed "$@"\n\n/ if $@ && $class->_loader_debug;
}
$sth->finish;
}
}
-sub _tables {
- my $self = shift;
- my $dbh = $self->{_storage}->dbh;
+sub _loader_tables {
+ my $class = shift;
+ my $dbh = $class->storage->dbh;
my @tables;
+ my $quoter = $dbh->get_info(29) || q{`};
foreach my $table ( $dbh->tables ) {
- my $quoter = $dbh->get_info(29);
- $table =~ s/$quoter//g if ($quoter);
+ $table =~ s/$quoter//g;
push @tables, $1
if $table =~ /\A(\w+)\z/;
}
return @tables;
}
-sub _table_info {
- my ( $self, $table ) = @_;
- my $dbh = $self->{_storage}->dbh;
+sub _loader_table_info {
+ my ( $class, $table ) = @_;
+ my $dbh = $class->storage->dbh;
# MySQL 4.x doesn't support quoted tables
my $query = "DESCRIBE $table";