Merge 'current' into 'back-compat'
Rafael Kitover [Sat, 28 Nov 2009 08:20:11 +0000 (08:20 +0000)]
r21183@hlagh (orig r7929):  caelum | 2009-11-22 06:30:22 -0500
fix default_value for MSSQL
r21184@hlagh (orig r7930):  caelum | 2009-11-22 07:03:31 -0500
$dbh->quote some things
r21186@hlagh (orig r7932):  caelum | 2009-11-22 09:46:34 -0500
redo AUTHOR sections to have one main CONTRIBUTORS section
r21589@hlagh (orig r7948):  caelum | 2009-11-24 07:57:25 -0500
fix MSSQL default detection to work with numeric/integer columns
r21590@hlagh (orig r7949):  caelum | 2009-11-24 08:11:02 -0500
handle un-parenthesized default numeric/integer values for some versions of MSSQL as well
r21610@hlagh (orig r7969):  caelum | 2009-11-28 02:36:00 -0500
add test for norewrite
r21611@hlagh (orig r7970):  caelum | 2009-11-28 02:44:01 -0500
added test to check for correct file count in common tests

1  2 
lib/DBIx/Class/Schema/Loader/Base.pm
lib/DBIx/Class/Schema/Loader/RelBuilder.pm

@@@ -50,10 -50,6 +50,10 @@@ __PACKAGE__->mk_ro_accessors(qw
                                  monikers
                               /);
  
 +__PACKAGE__->mk_accessors(qw/
 +                                version_to_dump
 +/);
 +
  =head1 NAME
  
  DBIx::Class::Schema::Loader::Base - Base DBIx::Class::Schema::Loader Implementation.
@@@ -77,55 -73,6 +77,55 @@@ L<DBIx::Class::Schema::Loader/loader_op
  Skip setting up relationships.  The default is to attempt the loading
  of relationships.
  
 +=head2 naming
 +
 +Static schemas (ones dumped to disk) will, by default, use the new-style 0.05XXX
 +relationship names and singularized Results, unless you're overwriting an
 +existing dump made by a 0.04XXX version of L<DBIx::Class::Schema::Loader>, in
 +which case the backward compatible RelBuilder will be activated, and
 +singularization will be turned off.
 +
 +Specifying
 +
 +    naming => 'v5'
 +
 +will disable the backward-compatible RelBuilder and use
 +the new-style relationship names along with singularized Results, even when
 +overwriting a dump made with an earlier version.
 +
 +The option also takes a hashref:
 +
 +    naming => { relationships => 'v5', results => 'v4' }
 +
 +The values can be:
 +
 +=over 4
 +
 +=item current
 +
 +Latest default style, whatever that happens to be.
 +
 +=item v5
 +
 +Version 0.05XXX style.
 +
 +=item v4
 +
 +Version 0.04XXX style.
 +
 +=back
 +
 +Dynamic schemas will always default to the 0.04XXX relationship names and won't
 +singularize Results for backward compatibility, to activate the new RelBuilder
 +and singularization put this in your C<Schema.pm> file:
 +
 +    __PACKAGE__->naming('current');
 +
 +Or if you prefer to use 0.05XXX features but insure that nothing breaks in the
 +next major version upgrade:
 +
 +    __PACKAGE__->naming('v5');
 +
  =head2 debug
  
  If set to true, each constructive L<DBIx::Class> statement the loader
@@@ -325,55 -272,13 +325,55 @@@ sub new 
  
      $self->{dump_directory} ||= $self->{temp_directory};
  
 -    $self->{relbuilder} = DBIx::Class::Schema::Loader::RelBuilder->new(
 -        $self->schema, $self->inflect_plural, $self->inflect_singular
 -    ) if !$self->{skip_relationships};
 +    $self->version_to_dump($DBIx::Class::Schema::Loader::VERSION);
 +
 +    $self->_check_back_compat;
  
      $self;
  }
  
 +sub _check_back_compat {
 +    my ($self) = @_;
 +
 +# dynamic schemas will always be in 0.04006 mode
 +    if ($self->{dynamic}) {
 +        no strict 'refs';
 +        my $class = ref $self || $self;
 +        unshift @{"${class}::ISA"},
 +            'DBIx::Class::Schema::Loader::Compat::v0_040';
 +        Class::C3::reinitialize;
 +        return;
 +    }
 +
 +# otherwise check if we need backcompat mode for a static schema
 +    my $filename = $self->_get_dump_filename($self->schema_class);
 +    return unless -e $filename;
 +
 +    open(my $fh, '<', $filename)
 +        or croak "Cannot open '$filename' for reading: $!";
 +
 +    while (<$fh>) {
 +        if (/^# Created by DBIx::Class::Schema::Loader v((\d+)\.(\d+))/) {
 +            my $real_ver = $1;
 +            my $ver      = "v${2}_${3}";
 +            while (1) {
 +                my $compat_class = "DBIx::Class::Schema::Loader::Compat::${ver}";
 +                if ($self->load_optional_class($compat_class)) {
 +                    no strict 'refs';
 +                    my $class = ref $self || $self;
 +                    unshift @{"${class}::ISA"}, $compat_class;
 +                    Class::C3::reinitialize;
 +                    $self->version_to_dump($real_ver);
 +                    last;
 +                }
 +                $ver =~ s/\d\z// or last;
 +            }
 +            last;
 +        }
 +    }
 +    close $fh;
 +}
 +
  sub _find_file_in_inc {
      my ($self, $file) = @_;
  
@@@ -457,7 -362,7 +457,7 @@@ sub rescan 
      my ($self, $schema) = @_;
  
      $self->{schema} = $schema;
 -    $self->{relbuilder}{schema} = $schema;
 +    $self->_relbuilder->{schema} = $schema;
  
      my @created;
      my @current = $self->_tables_list;
      return map { $self->monikers->{$_} } @$loaded;
  }
  
 +sub _relbuilder {
 +    my ($self) = @_;
 +
 +    return if $self->{skip_relationships};
 +
 +    $self->{relbuilder} ||= DBIx::Class::Schema::Loader::RelBuilder->new(
 +        $self->schema, $self->inflect_plural, $self->inflect_singular
 +    );
 +}
 +
  sub _load_tables {
      my ($self, @tables) = @_;
  
  sub _reload_classes {
      my ($self, @tables) = @_;
  
+     # so that we don't repeat custom sections
+     @INC = grep $_ ne $self->dump_directory, @INC;
      $self->_dump_to_dir(map { $self->classes->{$_} } @tables);
  
      unshift @INC, $self->dump_directory;
@@@ -682,7 -580,7 +685,7 @@@ sub _write_classfile 
      }
  
      $text .= $self->_sig_comment(
 -      $DBIx::Class::Schema::Loader::VERSION, 
 +      $self->version_to_dump,
        POSIX::strftime('%Y-%m-%d %H:%M:%S', localtime)
      );
  
@@@ -923,7 -821,7 +926,7 @@@ sub _load_relationships 
      my $tbl_uniq_info = $self->_table_uniq_info($table);
  
      my $local_moniker = $self->monikers->{$table};
 -    my $rel_stmts = $self->{relbuilder}->generate_code($local_moniker, $tbl_fk_info, $tbl_uniq_info);
 +    my $rel_stmts = $self->_relbuilder->generate_code($local_moniker, $tbl_fk_info, $tbl_uniq_info);
  
      foreach my $src_class (sort keys %$rel_stmts) {
          my $src_stmts = $rel_stmts->{$src_class};
@@@ -1012,6 -910,15 +1015,15 @@@ names, as above in L</monikers>
  
  L<DBIx::Class::Schema::Loader>
  
+ =head1 AUTHOR
+ See L<DBIx::Class::Schema::Loader/CONTRIBUTORS>.
+ =head1 LICENSE
+ This library is free software; you can redistribute it and/or modify it under
+ the same terms as Perl itself.
  =cut
  
  1;
@@@ -2,7 -2,6 +2,7 @@@ package DBIx::Class::Schema::Loader::Re
  
  use strict;
  use warnings;
 +use Class::C3;
  use Carp::Clan qw/^DBIx::Class/;
  use Lingua::EN::Inflect::Number ();
  
@@@ -260,4 -259,15 +260,15 @@@ sub generate_code 
      return $all_code;
  }
  
+ =head1 AUTHOR
+ See L<DBIx::Class::Schema::Loader/CONTRIBUTORS>.
+ =head1 LICENSE
+ This library is free software; you can redistribute it and/or modify it under
+ the same terms as Perl itself.
+ =cut
  1;