Commit | Line | Data |
18fca96a |
1 | package DBIx::Class::Schema::Loader; |
a78e3fed |
2 | |
3 | use strict; |
a4a19f3c |
4 | use warnings; |
3385ac62 |
5 | use Carp; |
a78e3fed |
6 | use UNIVERSAL::require; |
7 | |
8a6b44ef |
8 | use base qw/DBIx::Class::Schema/; |
9 | use base qw/Class::Data::Accessor/; |
10 | |
11 | __PACKAGE__->mk_classaccessor('loader'); |
12 | |
3980d69c |
13 | use vars qw($VERSION); |
14 | |
a4a19f3c |
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 |
a4a19f3c |
18 | $VERSION = '0.01000'; |
a78e3fed |
19 | |
20 | =head1 NAME |
21 | |
18fca96a |
22 | DBIx::Class::Schema::Loader - Dynamic definition of a DBIx::Class::Schema |
a78e3fed |
23 | |
24 | =head1 SYNOPSIS |
25 | |
a4a19f3c |
26 | package My::Schema; |
27 | use base qw/DBIx::Class::Schema::Loader/; |
a78e3fed |
28 | |
a4a19f3c |
29 | __PACKAGE__->load_from_connection( |
a78e3fed |
30 | dsn => "dbi:mysql:dbname", |
31 | user => "root", |
32 | password => "", |
a78e3fed |
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 | ); |
af6c2665 |
42 | |
a4a19f3c |
43 | # in seperate application code ... |
a78e3fed |
44 | |
a4a19f3c |
45 | use My::Schema; |
a78e3fed |
46 | |
a4a19f3c |
47 | my $schema1 = My::Schema->connect( $dsn, $user, $password, $attrs); |
48 | # -or- |
fbd83464 |
49 | my $schema1 = "My::Schema"; |
a4a19f3c |
50 | # ^^ defaults to dsn/user/pass from load_from_connection() |
a78e3fed |
51 | |
3980d69c |
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 | |
a78e3fed |
67 | =head1 DESCRIPTION |
68 | |
fbd83464 |
69 | DBIx::Class::Schema::Loader automates the definition of a |
18fca96a |
70 | DBIx::Class::Schema by scanning table schemas and setting up |
71 | columns and primary keys. |
a78e3fed |
72 | |
18fca96a |
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. |
a78e3fed |
77 | |
3385ac62 |
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. |
a78e3fed |
80 | |
81 | =cut |
82 | |
83 | =head1 METHODS |
84 | |
fbd83464 |
85 | =head2 load_from_connection |
a78e3fed |
86 | |
87 | Example in Synopsis above demonstrates the available arguments. For |
88 | detailed information on the arguments, see the |
18fca96a |
89 | L<DBIx::Class::Schema::Loader::Generic> documentation. |
a78e3fed |
90 | |
91 | =cut |
92 | |
a4a19f3c |
93 | sub load_from_connection { |
a78e3fed |
94 | my ( $class, %args ) = @_; |
af6c2665 |
95 | |
3385ac62 |
96 | croak 'dsn argument is required' if ! $args{dsn}; |
a78e3fed |
97 | my $dsn = $args{dsn}; |
98 | my ($driver) = $dsn =~ m/^dbi:(\w*?)(?:\((.*?)\))?:/i; |
99 | $driver = 'SQLite' if $driver eq 'SQLite2'; |
18fca96a |
100 | my $impl = "DBIx::Class::Schema::Loader::" . $driver; |
af6c2665 |
101 | |
a78e3fed |
102 | $impl->require or |
3385ac62 |
103 | croak qq/Couldn't require loader class "$impl",/ . |
104 | qq/"$UNIVERSAL::require::ERROR"/; |
af6c2665 |
105 | |
3980d69c |
106 | $args{schema} = $class; |
107 | |
108 | $class->loader($impl->new(%args)); |
2a4b8262 |
109 | $class->loader->load; |
a78e3fed |
110 | } |
111 | |
112 | =head1 AUTHOR |
113 | |
fbd83464 |
114 | Brandon Black, C<bblack@gmail.com> |
115 | |
8a6b44ef |
116 | Based on L<DBIx::Class::Loader> by Sebastian Riedel |
a78e3fed |
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; |