Merge 'view_support' into 'views'
Jess Robinson [Wed, 11 Feb 2009 14:38:08 +0000 (14:38 +0000)]
Original code

1  2 
lib/SQL/Translator/Parser/DBIx/Class.pm
t/lib/DBICTest/Schema.pm

@@@ -1,4 -1,5 +1,4 @@@
 -package # hide from PAUSE
 -    SQL::Translator::Parser::DBIx::Class;
 +package SQL::Translator::Parser::DBIx::Class;
  
  # AUTHOR: Jess Robinson
  
@@@ -8,8 -9,7 +8,8 @@@
  
  use strict;
  use warnings;
 -use vars qw($DEBUG @EXPORT_OK);
 +use vars qw($DEBUG $VERSION @EXPORT_OK);
 +$VERSION = '1.10';
  $DEBUG = 0 unless defined $DEBUG;
  
  use Exporter;
@@@ -45,7 -45,7 +45,7 @@@ sub parse 
      my $schema      = $tr->schema;
      my $table_no    = 0;
  
 -    $schema->name( ref($dbicschema) . " v" . ($dbicschema->VERSION || '1.x'))
 +    $schema->name( ref($dbicschema) . " v" . ($dbicschema->schema_version || '1.x'))
        unless ($schema->name);
  
      my %seen_tables;
          @monikers = grep { $sources->{$_} } @monikers;
      }
  
 +
-     foreach my $moniker (sort @monikers)
+     my(@table_monikers, @view_monikers);
+     for my $moniker (@monikers){
+       my $source = $dbicschema->source($moniker);
+       next if $source->is_virtual;
+        if ( $source->isa('DBIx::Class::ResultSource::Table') ) {
+          push(@table_monikers, $moniker);
+       } elsif( $source->isa('DBIx::Class::ResultSource::View') ){
+          push(@view_monikers, $moniker);
+       }
+     }
+     foreach my $moniker (sort @table_monikers)
      {
          my $source = $dbicschema->source($moniker);
          
                  $fk_constraint = $rel_info->{attrs}{is_foreign_key_constraint};
              }
              # it can not be multi
 -            elsif ( $rel_info->{attrs}{accessor} eq 'multi' ) {
 +            elsif ( $rel_info->{attrs}{accessor}
 +                    && $rel_info->{attrs}{accessor} eq 'multi' ) {
                  $fk_constraint = 0;
              }
              # if indeed single, check if all self.columns are our primary keys.
              }
          }
                
 -        if ($source->result_class->can('sqlt_deploy_hook')) {
 -          $source->result_class->sqlt_deploy_hook($table);
 -        }
 +        $source->_invoke_sqlt_deploy_hook($table);
      }
  
+     foreach my $moniker (sort @view_monikers)
+     {
+         my $source = $dbicschema->source($moniker);
+         # Skip custom query sources
+         next if ref($source->name);
+         # Its possible to have multiple DBIC source using same table
+         next if $seen_tables{$source->name}++;
+         my $view = $schema->add_view(
+           name => $source->name,
+           fields => [ $source->columns ],
+           $source->view_definition ? ( 'sql' => $source->view_definition ) : ()
+         );
+         if ($source->result_class->can('sqlt_deploy_hook')) {
+           $source->result_class->sqlt_deploy_hook($view);
+         }
+     }
 -
      if ($dbicschema->can('sqlt_deploy_hook')) {
        $dbicschema->sqlt_deploy_hook($schema);
      }
  }
  
  1;
 +
 +=head1 NAME
 +
 +SQL::Translator::Parser::DBIx::Class - Create a SQL::Translator schema
 +from a DBIx::Class::Schema instance
 +
 +=head1 SYNOPSIS
 +
 + ## Via DBIx::Class
 + use MyApp::Schema;
 + my $schema = MyApp::Schema->connect("dbi:SQLite:something.db");
 + $schema->create_ddl_dir();
 + ## or
 + $schema->deploy();
 +
 + ## Standalone
 + use MyApp::Schema;
 + use SQL::Translator;
 + 
 + my $schema = MyApp::Schema->connect;
 + my $trans  = SQL::Translator->new (
 +      parser      => 'SQL::Translator::Parser::DBIx::Class',
 +      parser_args => { package => $schema },
 +      producer    => 'SQLite',
 +     ) or die SQL::Translator->error;
 + my $out = $trans->translate() or die $trans->error;
 +
 +=head1 DESCRIPTION
 +
 +This class requires L<SQL::Translator> installed to work.
 +
 +C<SQL::Translator::Parser::DBIx::Class> reads a DBIx::Class schema,
 +interrogates the columns, and stuffs it all in an $sqlt_schema object.
 +
 +It's primary use is in deploying database layouts described as a set
 +of L<DBIx::Class> classes, to a database. To do this, see the
 +L<DBIx::Class::Schema/deploy> method.
 +
 +This can also be achieved by having DBIx::Class export the schema as a
 +set of SQL files ready for import into your database, or passed to
 +other machines that need to have your application installed but don't
 +have SQL::Translator installed. To do this see the
 +L<DBIx::Class::Schema/create_ddl_dir> method.
 +
 +=head1 SEE ALSO
 +
 +L<SQL::Translator>, L<DBIx::Class::Schema>
 +
 +=head1 AUTHORS
 +
 +Jess Robinson
 +
 +Matt S Trout
 +
 +Ash Berlin
diff --combined t/lib/DBICTest/Schema.pm
@@@ -8,23 -8,18 +8,24 @@@ no warnings qw/qw/
  __PACKAGE__->load_classes(qw/
    Artist
    SequenceTest
 +  BindType
    Employee
    CD
    FileColumn
 +  Genre
    Link
    Bookmark
    #dummy
    Track
    Tag
+   Year2000CDs
    /,
    { 'DBICTest::Schema' => [qw/
      LinerNotes
 +    Artwork
 +    Image
 +    Lyrics
 +    LyricVersion
      OneKey
      #dummy
      TwoKeys
      'ArtistSubclass',
      'Producer',
      'CD_to_Producer',
 +    'Dummy',    # this is a real result class we remove in the hook below
    ),
    qw/SelfRefAlias TreeLike TwoKeyTreeLike Event EventTZ NoPrimaryKey/,
    qw/Collection CollectionObject TypedObject Owners BooksInLibrary/,
 -  qw/ForceForeign/,
 +  qw/ForceForeign Encoded/,
  );
  
  sub sqlt_deploy_hook {