some shuffling/refactoring of the relationship code, and a TODO file added
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader / mysql.pm
index 9c045ba..f94b159 100644 (file)
@@ -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<DBIx::Class::Schema::Loader>.
 
 =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->storage->connect_info->[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) || q{`};
+
     foreach my $table (@tables) {
         my $query = "SHOW CREATE TABLE ${dbname}.${table}";
         my $sth   = $dbh->prepare($query)
@@ -51,35 +51,45 @@ 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 `(.*)` \(`(.*)`\)/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 { $class->_belongs_to_many( $table, $column, $remote_table, $remote_column) };
-            warn qq/\# belongs_to_many failed "$@"\n\n/ if $@ && $class->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 {
+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 {
+sub _loader_table_info {
     my ( $class, $table ) = @_;
     my $dbh    = $class->storage->dbh;