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