'Scalar::Util' => 0,
'Data::Dump' => 1.06,
'UNIVERSAL::require' => 0.10,
- 'Lingua::EN::Inflect' => 1.89,
'Lingua::EN::Inflect::Number' => 1.1,
'Text::Balanced' => 0,
- 'Class::Accessor' => 0.22,
+ 'Class::Accessor' => 0.27,
'Class::Data::Accessor' => 0.02,
'Class::C3' => 0.11,
'Carp::Clan' => 0,
Revision history for Perl extension DBIx::Class::Schema::Loader
+ - columns_info_for imported from DBIx::Class
+ - relationships are now on by default, use skip_relationships
+ to disable them
+ - Removed previously deprecated methods/options
+ - Added $VERSION to all packages in this dist
+
0.03009 Wed Nov 15 14:03:37 UTC 2006
- fix for rt.cpan.org #22425 (use File::Spec where appropriate)
- use full instead of short classnames in relationships (from victori)
# Always remember to do all digits for the version even if they're 0
# i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
# brain damage and presumably various other packaging systems too
-our $VERSION = '0.03009';
+our $VERSION = '0.03999_01';
__PACKAGE__->mk_classaccessor('dump_to_dir');
-__PACKAGE__->mk_classaccessor('loader');
-__PACKAGE__->mk_classaccessor('_loader_args');
+__PACKAGE__->mk_classaccessor('_loader_args' => {});
+__PACKAGE__->mk_classaccessor('_loader_invoked');
=head1 NAME
use base qw/DBIx::Class::Schema::Loader/;
__PACKAGE__->loader_options(
- relationships => 1,
constraint => '^foo.*',
# debug => 1,
);
That being said, transitioning your code from a Schema generated by this
module to one that doesn't use this module should be straightforward and
-painless (as long as you're not using any methods that are now deprecated
-in this document), so don't shy away from it just for fears of the
-transition down the road.
+painless, so don't shy away from it just for fears of the transition down
+the road.
=head1 METHODS
only useful in fairly complex scenarios, see the
L<DBIx::Class::Schema::Loader::Base> documentation.
-This method is *required* at this time, for backwards compatibility
-reasons. If you do not wish to change any options, just call it
-with an empty argument list during schema class initialization.
-
-Setting these options explicitly via this method B<after> calling
-C<connection> is deprecated and will stop working in version 0.04000.
-For now the code merely warns about this condition.
-
-The preferred way of doing things is to either call C<loader_options>
-before any connection is made, or embed the C<loader_options> in
-the connection information itself as shown below.
+One must call C<loader_options> before any connection is made,
+or embed the C<loader_options> in the connection information itself
+as shown below. Setting C<loader_options> after the connection has
+already been made is useless.
=cut
my $self = shift;
my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
-
- my $class = ref $self || $self;
- $args{schema} = $self;
- $args{schema_class} = $class;
- weaken($args{schema}) if ref $self;
-
$self->_loader_args(\%args);
- if($self->storage && !$class->loader) {
- warn "Do not set loader_options after specifying the connection info,"
- . " this will be unsupported in 0.04000";
- $self->_invoke_loader;
- }
$self;
}
my $self = shift;
my $class = ref $self || $self;
- $self->_loader_args->{dump_directory} ||= $self->dump_to_dir;
+ my $args = $self->_loader_args;
+
+ # set up the schema/schema_class arguments
+ $args->{schema} = $self;
+ $args->{schema_class} = $class;
+ weaken($args->{schema}) if ref $self;
+ $args->{dump_directory} ||= $self->dump_to_dir;
# XXX this only works for relative storage_type, like ::DBI ...
my $impl = "DBIx::Class::Schema::Loader" . $self->storage_type;
croak qq/Could not load storage_type loader "$impl": / .
qq/"$UNIVERSAL::require::ERROR"/;
- # XXX in the future when we get rid of ->loader, the next two
- # lines can be replaced by "$impl->new(%{$self->_loader_args})->load;"
- $class->loader($impl->new(%{$self->_loader_args}));
- $class->loader->load;
+ $impl->new(%$args)->load;
+ $self->_loader_invoked(1);
$self;
}
$self = $self->next::method(@_);
my $class = ref $self || $self;
- if($self->_loader_args && !$class->loader) {
+ if(!$class->_loader_invoked) {
$self->_invoke_loader
}
use DBIx::Class::Schema::Loader qw/ make_schema_at /;
make_schema_at(
'New::Schema::Name',
- { relationships => 1, debug => 1 },
+ { debug => 1 },
[ 'dbi:Pg:dbname="foo"','postgres' ],
);
# Complex: dump loaded schema to disk, all from the commandline:
- perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at("New::Schema::Name", { relationships => 1 }, [ "dbi:Pg:dbname=foo","postgres" ])'
+ perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib -e 'make_schema_at("New::Schema::Name", { debug => 1 }, [ "dbi:Pg:dbname=foo","postgres" ])'
# Same, but inside a script, and using a different way to specify the
# dump directory:
use DBIx::Class::Schema::Loader qw/ make_schema_at /;
make_schema_at(
'New::Schema::Name',
- { relationships => 1, debug => 1, dump_directory => './lib' },
+ { debug => 1, dump_directory => './lib' },
[ 'dbi:Pg:dbname="foo"','postgres' ],
);
use base qw/DBIx::Class::Schema::Loader/;
__PACKAGE__->loader_options(
- relationships => 1,
debug => 1,
);
__PACKAGE__->connection('dbi:SQLite:example.db');
and remove the Main directory tree (optional). Every thing else
should work the same
-=head1 DEPRECATED METHODS
-
-You don't need to read anything in this section unless you're upgrading
-code that was written against pre-0.03 versions of this module. This
-version is intended to be backwards-compatible with pre-0.03 code, but
-will issue warnings about your usage of deprecated features/methods.
-
-B<All of these deprecated methods will dissappear in version 0.04000>,
-and converting code that uses these methods should be trivial.
-
-=head2 load_from_connection
-
-This deprecated method is now roughly an alias for L</loader_options>.
-
-For now, using this method will invoke the legacy behavior for
-backwards compatibility, and merely emit a warning about upgrading
-your code.
-
-It also reverts the default inflection scheme to
-use L<Lingua::EN::Inflect> just like pre-0.03 versions of this
-module did.
-
-You can force these legacy inflections with the
-option L<DBIx::Class::Schema::Loader::Base/legacy_default_inflections>,
-even after switch over to the preferred L</loader_options> way of doing
-things. That option will not go away until at least 0.05.
-
-See the source of this method for more details.
-
-=cut
-
-sub load_from_connection {
- my ($self, %args) = @_;
-
- my $cmds_ver = $Catalyst::Model::DBIC::Schema::VERSION;
- if($cmds_ver) {
- if($cmds_ver < 0.14) {
- warn 'You should upgrade your installation of'
- . ' Catalyst::Model::DBIC::Schema to 0.14 or higher, then:';
- }
- warn 'You should regenerate your Model files, which may eliminate'
- . ' the following deprecation warning:';
- }
- warn 'load_from_connection deprecated, and will dissappear in 0.04000, '
- . 'please [re-]read the [new] DBIx::Class::Schema::Loader '
- . 'documentation';
-
- # Support the old connect_info / dsn / etc args...
- $args{connect_info} = [
- delete $args{dsn},
- delete $args{user},
- delete $args{password},
- delete $args{options},
- ] if $args{dsn};
-
- $self->connection(@{delete $args{connect_info}})
- if $args{connect_info};
-
- $self->loader_options('legacy_default_inflections' => 1, %args);
-}
-
-=head2 loader
-
-This is an accessor in the generated Schema class for accessing
-the L<DBIx::Class::Schema::Loader::Base> -based loader object
-that was used during construction. See the
-L<DBIx::Class::Schema::Loader::Base> docs for more information
-on the available loader methods there.
-
-This accessor is deprecated. Do not use it. Anything you can
-get from C<loader>, you can get via the normal L<DBIx::Class::Schema>
-methods, and your code will be more robust and forward-thinking
-for doing so.
-
-If you're already using C<loader> in your code, make an effort
-to get rid of it. If you think you've found a situation where it
-is necessary, let me know and we'll see what we can do to remedy
-that situation.
-
-In some future version, this accessor *will* disappear. It was
-apparently quite a design/API mistake to ever have exposed it to
-user-land in the first place, all things considered.
-
=head1 KNOWN ISSUES
=head2 Multiple Database Schemas
use File::Spec qw//;
require DBIx::Class;
+our $VERSION = '0.03999_01';
+
__PACKAGE__->mk_ro_accessors(qw/
schema
schema_class
left_base_classes
components
resultset_components
- relationships
+ skip_relationships
moniker_map
inflect_singular
inflect_plural
dump_directory
dump_overwrite
- legacy_default_inflections
-
db_schema
_tables
classes
These constructor options are the base options for
L<DBIx::Class::Schema::Loader/loader_opts>. Available constructor options are:
-=head2 relationships
+=head2 skip_relationships
-Try to automatically detect/setup has_a and has_many relationships.
+Skip setting up relationships. The default is to attempt the loading
+of relationships.
=head2 debug
C<ResultSetManager> will be automatically added to the above
C<components> list if this option is set.
-=head2 legacy_default_inflections
-
-Setting this option changes the default fallback for L</inflect_plural> to
-utilize L<Lingua::EN::Inflect/PL>, and L</inflect_singular> to a no-op.
-Those choices produce substandard results, but might be necessary to support
-your existing code if you started developing on a version prior to 0.03 and
-don't wish to go around updating all your relationship names to the new
-defaults.
-
-This option will continue to be supported until at least version 0.05xxx,
-but may dissappear sometime thereafter. It is recommended that you update
-your code to use the newer-style inflections when you have the time.
-
=head2 dump_directory
This option is designed to be a tool to help you transition from this
The default is false, which means the dumping code will skip the already
existing files.
-=head1 DEPRECATED CONSTRUCTOR OPTIONS
-
-B<These will be removed in version 0.04000 !!!>
-
-=head2 inflect_map
-
-Equivalent to L</inflect_plural>.
-
-=head2 inflect
-
-Equivalent to L</inflect_plural>.
-
-=head2 connect_info, dsn, user, password, options
-
-You connect these schemas the same way you would any L<DBIx::Class::Schema>,
-which is by calling either C<connect> or C<connection> on a schema class
-or object. These options are only supported via the deprecated
-C<load_from_connection> interface, which is also being removed in 0.04000.
-
=head1 METHODS
None of these methods are intended for direct invocation by regular
$self->{monikers} = {};
$self->{classes} = {};
- # Support deprecated arguments
- for(qw/inflect_map inflect/) {
- warn "Argument $_ is deprecated in favor of 'inflect_plural'"
- . ", and will be removed in 0.04000"
- if $self->{$_};
- }
- $self->{inflect_plural} ||= $self->{inflect_map} || $self->{inflect};
-
$self->{schema_class} ||= ( ref $self->{schema} || $self->{schema} );
$self->{schema} ||= $self->{schema_class};
my $self = shift;
$self->_load_classes;
- $self->_load_relationships if $self->relationships;
+ $self->_load_relationships if ! $self->skip_relationships;
$self->_load_external;
$self->_dump_to_dir if $self->dump_directory;
my $cols = $self->_table_columns($table);
my $col_info;
- eval { $col_info = $schema->storage->columns_info_for($table) };
+ eval { $col_info = $self->_columns_info_for($table) };
if($@) {
$self->_dbic_stmt($table_class,'add_columns',@$cols);
}
use strict;
use warnings;
-use base qw/DBIx::Class::Schema::Loader::Base Class::Accessor::Fast/;
+use base qw/DBIx::Class::Schema::Loader::Base/;
use Class::C3;
use Carp::Clan qw/^DBIx::Class/;
use UNIVERSAL::require;
+our $VERSION = '0.03999_01';
+
=head1 NAME
DBIx::Class::Schema::Loader::DBI - DBIx::Class::Schema::Loader DBI Implementation.
return @tables;
}
+=head2 load
+
+We override L<DBIx::Class::Schema::Loader::Base/load> here to hook in our localized settings for C<$dbh> error handling.
+
+=cut
+
+sub load {
+ my $self = shift;
+
+ local $self->schema->storage->dbh->{RaiseError} = 1;
+ local $self->schema->storage->dbh->{PrintError} = 0;
+ $self->next::method(@_);
+}
+
# Returns an arrayref of column names
sub _table_columns {
my ($self, $table) = @_;
return \@rels;
}
+# ported in from DBIx::Class::Storage::DBI:
+sub _columns_info_for {
+ my ($self, $table) = @_;
+
+ my $dbh = $self->schema->storage->dbh;
+
+ if ($dbh->can('column_info')) {
+ my %result;
+ eval {
+ my $sth = $dbh->column_info( undef, $self->db_schema, $table, '%' );
+ $sth->execute();
+ while ( my $info = $sth->fetchrow_hashref() ){
+ my %column_info;
+ $column_info{data_type} = $info->{TYPE_NAME};
+ $column_info{size} = $info->{COLUMN_SIZE};
+ $column_info{is_nullable} = $info->{NULLABLE} ? 1 : 0;
+ $column_info{default_value} = $info->{COLUMN_DEF};
+ my $col_name = $info->{COLUMN_NAME};
+ $col_name =~ s/^\"(.*)\"$/$1/;
+
+ $result{$col_name} = \%column_info;
+ }
+ };
+ return \%result if !$@ && scalar keys %result;
+ }
+
+ if($self->db_schema) {
+ $table = $self->db_schema . $self->{_namesep} . $table;
+ }
+ my %result;
+ my $sth = $dbh->prepare("SELECT * FROM $table WHERE 1=0");
+ $sth->execute;
+ my @columns = @{$sth->{NAME_lc}};
+ for my $i ( 0 .. $#columns ){
+ my %column_info;
+ my $type_num = $sth->{TYPE}->[$i];
+ my $type_name;
+ if(defined $type_num && $dbh->can('type_info')) {
+ my $type_info = $dbh->type_info($type_num);
+ $type_name = $type_info->{TYPE_NAME} if $type_info;
+ }
+ $column_info{data_type} = $type_name ? $type_name : $type_num;
+ $column_info{size} = $sth->{PRECISION}->[$i];
+ $column_info{is_nullable} = $sth->{NULLABLE}->[$i] ? 1 : 0;
+
+ if ($column_info{data_type} =~ m/^(.*?)\((.*?)\)$/) {
+ $column_info{data_type} = $1;
+ $column_info{size} = $2;
+ }
+
+ $result{$columns[$i]} = \%column_info;
+ }
+
+ return \%result;
+}
+
+
=head1 SEE ALSO
L<DBIx::Class::Schema::Loader>
use Carp::Clan qw/^DBIx::Class/;
use Class::C3;
+our $VERSION = '0.03999_01';
+
=head1 NAME
DBIx::Class::Schema::Loader::DBI::DB2 - DBIx::Class::Schema::Loader::DBI DB2 Implementation.
package My::Schema;
use base qw/DBIx::Class::Schema::Loader/;
- __PACKAGE__->loader_options(
- relationships => 1,
- db_schema => "MYSCHEMA",
- );
+ __PACKAGE__->loader_options( db_schema => "MYSCHEMA" );
1;
use Carp::Clan qw/^DBIx::Class/;
use Class::C3;
+our $VERSION = '0.03999_01';
+
=head1 NAME
DBIx::Class::Schema::Loader::DBI::Pg - DBIx::Class::Schema::Loader::DBI
package My::Schema;
use base qw/DBIx::Class::Schema::Loader/;
- __PACKAGE__->loader_options(
- relationships => 1,
- );
+ __PACKAGE__->loader_options( debug => 1 );
1;
use Text::Balanced qw( extract_bracketed );
use Class::C3;
+our $VERSION = '0.03999_01';
+
=head1 NAME
DBIx::Class::Schema::Loader::DBI::SQLite - DBIx::Class::Schema::Loader::DBI SQLite Implementation.
package My::Schema;
use base qw/DBIx::Class::Schema::Loader/;
- __PACKAGE__->loader_optoins( relationships => 1 );
+ __PACKAGE__->loader_options( debug => 1 );
1;
package DBIx::Class::Schema::Loader::DBI::Writing;
use strict;
+our $VERSION = '0.03999_01';
+
# Empty. POD only.
1;
use Carp::Clan qw/^DBIx::Class/;
use Class::C3;
+our $VERSION = '0.03999_01';
+
=head1 NAME
DBIx::Class::Schema::Loader::DBI::mysql - DBIx::Class::Schema::Loader::DBI mysql Implementation.
package My::Schema;
use base qw/DBIx::Class::Schema::Loader/;
- __PACKAGE__->load_from_connection(
- relationships => 1,
- );
+ __PACKAGE__->loader_options( debug => 1 );
1;
use strict;
use warnings;
use Carp::Clan qw/^DBIx::Class/;
-use Lingua::EN::Inflect ();
use Lingua::EN::Inflect::Number ();
+our $VERSION = '0.03999_01';
+
=head1 NAME
DBIx::Class::Schema::Loader::RelBuilder - Builds relationships for DBIx::Class::Schema::Loader
return $inflected if $inflected;
}
- return $self->{legacy_default_inflections}
- ? Lingua::EN::Inflect::PL($relname)
- : Lingua::EN::Inflect::Number::to_PL($relname);
+ return Lingua::EN::Inflect::Number::to_PL($relname);
}
# Singularize a relationship name
return $inflected if $inflected;
}
- return $self->{legacy_default_inflections}
- ? $relname
- : Lingua::EN::Inflect::Number::to_S($relname);
+ return Lingua::EN::Inflect::Number::to_S($relname);
}
sub generate_code {
use lib qw(t/lib);
use make_dbictest_db;
-$SIG{__WARN__} = sub { }; # Suppress warnings, as we test a lot of deprecated stuff here
-
# Takes a $schema as input, runs 4 basic tests
sub test_schema {
my ($testname, $schema) = @_;
}
my @invocations = (
- 'deprecated_one' => sub {
- package DBICTest::Schema::1;
- use base qw/ DBIx::Class::Schema::Loader /;
- __PACKAGE__->connection($make_dbictest_db::dsn);
- __PACKAGE__->load_from_connection( relationships => 1 );
- __PACKAGE__;
- },
- 'deprecated_two' => sub {
- package DBICTest::Schema::2;
- use base qw/ DBIx::Class::Schema::Loader /;
- __PACKAGE__->load_from_connection(
- relationships => 1,
- connect_info => [ $make_dbictest_db::dsn ],
- );
- __PACKAGE__;
- },
- 'deprecated_three' => sub {
- package DBICTest::Schema::3;
- use base qw/ DBIx::Class::Schema::Loader /;
- __PACKAGE__->load_from_connection(
- relationships => 1,
- dsn => $make_dbictest_db::dsn,
- );
- __PACKAGE__;
- },
- 'deprecated_four' => sub {
- package DBICTest::Schema::4;
- use base qw/ DBIx::Class::Schema::Loader /;
- __PACKAGE__->connection($make_dbictest_db::dsn);
- __PACKAGE__->loader_options( relationships => 1 );
- __PACKAGE__;
- },
'hardcode' => sub {
package DBICTest::Schema::5;
use base qw/ DBIx::Class::Schema::Loader /;
- __PACKAGE__->loader_options( relationships => 1 );
__PACKAGE__->connection($make_dbictest_db::dsn);
__PACKAGE__;
},
'normal' => sub {
package DBICTest::Schema::6;
use base qw/ DBIx::Class::Schema::Loader /;
- __PACKAGE__->loader_options( relationships => 1 );
+ __PACKAGE__->loader_options();
__PACKAGE__->connect($make_dbictest_db::dsn);
},
'make_schema_at' => sub {
eval { DBICTest::Schema::1->connect($make_dbictest_db::dsn) };
ok(!$@, 'no death with dump_directory set') or diag "Dump failed: $@";
-DBICTest::Schema::1->loader(undef);
+DBICTest::Schema::1->_loader_invoked(undef);
SKIP: {
skip "ActiveState perl produces additional warnings", 5
ok(!$@, 'no death with dump_directory set (overwrite1)')
or diag "Dump failed: $@";
-DBICTest::Schema::2->loader(undef);
+DBICTest::Schema::2->_loader_invoked(undef);
eval { DBICTest::Schema::2->connect($make_dbictest_db::dsn) };
ok(!$@, 'no death with dump_directory set (overwrite2)')
or diag "Dump failed: $@";
}
my $conn = $schema_class->clone;
- my $monikers = $schema_class->loader->monikers;
- my $classes = $schema_class->loader->classes;
+ my $monikers = {};
+ my $classes = {};
+ foreach my $source_name ($schema_class->sources) {
+ my $table_name = $schema_class->source($source_name)->from;
+ $monikers->{$table_name} = $source_name;
+ $classes->{$table_name} = $schema_class . q{::} . $source_name;
+ }
my $moniker1 = $monikers->{loader_test1};
my $class1 = $classes->{loader_test1};