schema-loader now uses Class::C3, and ::Pg uses that to override ::Generic->new(...
[dbsrgits/DBIx-Class-Schema-Loader.git] / lib / DBIx / Class / Schema / Loader.pm
1 package DBIx::Class::Schema::Loader;
2
3 use strict;
4 use warnings;
5 use Carp;
6 use UNIVERSAL::require;
7
8 use base qw/DBIx::Class::Schema/;
9 use base qw/Class::Data::Accessor/;
10
11 __PACKAGE__->mk_classaccessor('loader');
12
13 use vars qw($VERSION);
14
15 # Always remember to do all digits for the version even if they're 0
16 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
17 # brain damage and presumably various other packaging systems too
18 $VERSION = '0.01000';
19
20 =head1 NAME
21
22 DBIx::Class::Schema::Loader - Dynamic definition of a DBIx::Class::Schema
23
24 =head1 SYNOPSIS
25
26   package My::Schema;
27   use base qw/DBIx::Class::Schema::Loader/;
28
29   __PACKAGE__->load_from_connection(
30     dsn                     => "dbi:mysql:dbname",
31     user                    => "root",
32     password                => "",
33     additional_classes      => [qw/DBIx::Class::Foo/],
34     additional_base_classes => [qw/My::Stuff/],
35     left_base_classes       => [qw/DBIx::Class::Bar/],
36     constraint              => '^foo.*',
37     relationships           => 1,
38     options                 => { AutoCommit => 1 }, 
39     inflect                 => { child => 'children' },
40     debug                   => 1,
41   );
42
43   # in seperate application code ...
44
45   use My::Schema;
46
47   my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs);
48   # -or-
49   my $schema1 = "My::Schema";
50   # ^^ defaults to dsn/user/pass from load_from_connection()
51
52   # Get a list of the original (database) names of the tables that
53   #  were loaded
54   my @tables = $schema1->loader->tables;
55
56   # Get a hashref of table_name => 'TableName' table-to-moniker
57   #   mappings.
58   my $monikers = $schema1->loader->monikers;
59
60   # Get a hashref of table_name => 'My::Schema::TableName'
61   #   table-to-classname mappings.
62   my $classes = $schema1->loader->classes;
63
64   # Use the schema as per normal for L<DBIx::Class::Schema>
65   my $rs = $schema1->resultset($monikers->{table_table})->search(...);
66
67 =head1 DESCRIPTION
68
69 DBIx::Class::Schema::Loader automates the definition of a
70 DBIx::Class::Schema by scanning table schemas and setting up
71 columns and primary keys.
72
73 DBIx::Class::Schema::Loader supports MySQL, Postgres, SQLite and DB2.  See
74 L<DBIx::Class::Schema::Loader::Generic> for more, and
75 L<DBIx::Class::Schema::Loader::Writing> for notes on writing your own
76 db-specific subclass for an unsupported db.
77
78 This module requires DBIx::Class::Loader 0.5 or later, and obsoletes
79 L<DBIx::Class::Loader> for L<DBIx::Class> version 0.5 and later.
80
81 =cut
82
83 =head1 METHODS
84
85 =head2 load_from_connection
86
87 Example in Synopsis above demonstrates the available arguments.  For
88 detailed information on the arguments, see the
89 L<DBIx::Class::Schema::Loader::Generic> documentation.
90
91 =cut
92
93 sub load_from_connection {
94     my ( $class, %args ) = @_;
95
96     croak 'dsn argument is required' if ! $args{dsn};
97     my $dsn = $args{dsn};
98     my ($driver) = $dsn =~ m/^dbi:(\w*?)(?:\((.*?)\))?:/i;
99     $driver = 'SQLite' if $driver eq 'SQLite2';
100     my $impl = "DBIx::Class::Schema::Loader::" . $driver;
101
102     $impl->require or
103       croak qq/Couldn't require loader class "$impl",/ .
104             qq/"$UNIVERSAL::require::ERROR"/;
105
106     $args{schema} = $class;
107
108     $class->loader($impl->new(%args));
109     $class->loader->load;
110 }
111
112 =head1 AUTHOR
113
114 Brandon Black, C<bblack@gmail.com>
115
116 Based on L<DBIx::Class::Loader> by Sebastian Riedel
117
118 Based upon the work of IKEBE Tomohiro
119
120 =head1 THANK YOU
121
122 Adam Anderson, Andy Grundman, Autrijus Tang, Dan Kubb, David Naughton,
123 Randal Schwartz, Simon Flack and all the others who've helped.
124
125 =head1 LICENSE
126
127 This library is free software; you can redistribute it and/or modify it under
128 the same terms as Perl itself.
129
130 =head1 SEE ALSO
131
132 L<DBIx::Class>
133
134 =cut
135
136 1;