X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader%2Fmysql.pm;h=834d895bae8af4b67b812f363e400b4bccf56dc1;hb=66742793d9a84c20778f2b6925d6a499a81469d3;hp=8c941f8c2f1c933466dfef7d09073dadcd59c169;hpb=fbd834649351808228912ceb798f0832af58a30c;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader/mysql.pm b/lib/DBIx/Class/Schema/Loader/mysql.pm index 8c941f8..834d895 100644 --- a/lib/DBIx/Class/Schema/Loader/mysql.pm +++ b/lib/DBIx/Class/Schema/Loader/mysql.pm @@ -17,7 +17,6 @@ DBIx::Class::Schema::Loader::mysql - DBIx::Schema::Class::Loader mysql Implement dsn => "dbi:mysql:dbname", user => "root", password => "", - namespace => "Data", ); =head1 DESCRIPTION @@ -26,16 +25,15 @@ See L. =cut -sub _db_classes { +sub _loader_db_classes { return qw/DBIx::Class::PK::Auto::MySQL/; } -# Very experimental and untested! -sub _relationships { +sub _loader_relationships { my $class = shift; my @tables = $class->tables; my $dbh = $class->storage->dbh; - my $dsn = $class->loader_data->{_datasource}[0]; + my $dsn = $class->_loader_data->{datasource}[0]; my %conn = $dsn =~ m/\Adbi:\w+(?:\(.*?\))?:(.+)\z/i && index( $1, '=' ) >= 0 @@ -44,6 +42,8 @@ sub _relationships { 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); + foreach my $table (@tables) { my $query = "SHOW CREATE TABLE ${dbname}.${table}"; my $sth = $dbh->prepare($query) @@ -51,22 +51,32 @@ sub _relationships { $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 `(.*)` \(`(.*)`\)/g); + + 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 { $class->_belongs_to_many( $table, $column, $remote_table, $remote_column) }; - warn qq/\# belongs_to_many failed "$@"\n\n/ if $@ && $class->debug_loader; + my $cond = {}; + for(my $i = 0; $i < @cols; $i++) { + $cond->{$f_cols[$i]} = $cols[$i]; + } + + eval { $class->_loader_make_relations( $table, $f_table, $cond) }; + warn qq/\# belongs_to_many failed "$@"\n\n/ if $@ && $class->_loader_debug; } $sth->finish; } } -sub _tables { +sub _loader_tables { my $class = shift; my $dbh = $class->storage->dbh; my @tables; @@ -79,7 +89,7 @@ sub _tables { return @tables; } -sub _table_info { +sub _loader_table_info { my ( $class, $table ) = @_; my $dbh = $class->storage->dbh;