Couple things forgotten during 399b9455/b46b8537
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class.pm
1 package DBIx::Class;
2
3 # important to load early
4 use DBIx::Class::_Util;
5
6 use strict;
7 use warnings;
8
9 our $VERSION;
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
14 # $VERSION declaration must stay up here, ahead of any other package
15 # declarations, as to not confuse various modules attempting to determine
16 # this ones version, whether that be s.c.o. or Module::Metadata, etc
17 $VERSION = '0.082899_15';
18
19 $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
20
21 use mro 'c3';
22
23 use base qw/DBIx::Class::Componentised DBIx::Class::AccessorGroup/;
24 use DBIx::Class::Exception;
25
26 __PACKAGE__->mk_group_accessors(inherited => '_skip_namespace_frames');
27 __PACKAGE__->_skip_namespace_frames('^DBIx::Class|^SQL::Abstract|^Try::Tiny|^Class::Accessor::Grouped|^Context::Preserve|^Moose::Meta::');
28
29 # FIXME - this is not really necessary, and is in
30 # fact going to slow things down a bit
31 # However it is the right thing to do in order to get
32 # various install bases to highlight their brokenness
33 # Remove at some unknown point in the future
34 #
35 # The oddball BEGIN is there for... reason unknown
36 # It does make non-segfaulty difference on pre-5.8.5 perls, so shrug
37 BEGIN {
38   sub DESTROY { &DBIx::Class::_Util::detected_reinvoked_destructor };
39 }
40
41 sub component_base_class { 'DBIx::Class' }
42
43 sub MODIFY_CODE_ATTRIBUTES {
44   my ($class,$code,@attrs) = @_;
45   $class->mk_classaccessor('__attr_cache' => {})
46     unless $class->can('__attr_cache');
47   $class->__attr_cache->{$code} = [@attrs];
48   return ();
49 }
50
51 sub FETCH_CODE_ATTRIBUTES {
52   my ($class,$code) = @_;
53   @{ $class->_attr_cache->{$code} || [] }
54 }
55
56 sub _attr_cache {
57   my $self = shift;
58   my $cache = $self->can('__attr_cache') ? $self->__attr_cache : {};
59
60   return {
61     %$cache,
62     %{ $self->maybe::next::method || {} },
63   };
64 }
65
66 # *DO NOT* change this URL nor the identically named =head1 below
67 # it is linked throughout the ecosystem
68 sub DBIx::Class::_ENV_::HELP_URL () {
69   'http://p3rl.org/DBIx::Class#GETTING_HELP/SUPPORT'
70 }
71
72 1;
73
74 __END__
75
76 =head1 NAME
77
78 DBIx::Class - Extensible and flexible object <-> relational mapper.
79
80 =head1 WHERE TO START READING
81
82 See L<DBIx::Class::Manual::DocMap> for an overview of the exhaustive documentation.
83 To get the most out of DBIx::Class with the least confusion it is strongly
84 recommended to read (at the very least) the
85 L<Manuals|DBIx::Class::Manual::DocMap/Manuals> in the order presented there.
86
87 =cut
88
89 =head1 GETTING HELP/SUPPORT
90
91 Due to the sheer size of its problem domain, DBIx::Class is a relatively
92 complex framework. After you start using DBIx::Class questions will inevitably
93 arise. If you are stuck with a problem or have doubts about a particular
94 approach do not hesitate to contact us via any of the following options (the
95 list is sorted by "fastest response time"):
96
97 =over
98
99 =item * IRC: irc.perl.org#dbix-class
100
101 =for html
102 <a href="https://chat.mibbit.com/#dbix-class@irc.perl.org">(click for instant chatroom login)</a>
103
104 =item * Mailing list: L<http://lists.scsys.co.uk/mailman/listinfo/dbix-class>
105
106 =item * RT Bug Tracker: L<https://rt.cpan.org/NoAuth/Bugs.html?Dist=DBIx-Class>
107
108 =item * Twitter: L<https://www.twitter.com/dbix_class>
109
110 =item * Web Site: L<http://www.dbix-class.org/>
111
112 =back
113
114 =head1 SYNOPSIS
115
116 For the very impatient: L<DBIx::Class::Manual::QuickStart>
117
118 This code in the next step can be generated automatically from an existing
119 database, see L<dbicdump> from the distribution C<DBIx-Class-Schema-Loader>.
120
121 =head2 Schema classes preparation
122
123 Create a schema class called F<MyApp/Schema.pm>:
124
125   package MyApp::Schema;
126   use base qw/DBIx::Class::Schema/;
127
128   __PACKAGE__->load_namespaces();
129
130   1;
131
132 Create a result class to represent artists, who have many CDs, in
133 F<MyApp/Schema/Result/Artist.pm>:
134
135 See L<DBIx::Class::ResultSource> for docs on defining result classes.
136
137   package MyApp::Schema::Result::Artist;
138   use base qw/DBIx::Class::Core/;
139
140   __PACKAGE__->table('artist');
141   __PACKAGE__->add_columns(qw/ artistid name /);
142   __PACKAGE__->set_primary_key('artistid');
143   __PACKAGE__->has_many(cds => 'MyApp::Schema::Result::CD', 'artistid');
144
145   1;
146
147 A result class to represent a CD, which belongs to an artist, in
148 F<MyApp/Schema/Result/CD.pm>:
149
150   package MyApp::Schema::Result::CD;
151   use base qw/DBIx::Class::Core/;
152
153   __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
154   __PACKAGE__->table('cd');
155   __PACKAGE__->add_columns(qw/ cdid artistid title year /);
156   __PACKAGE__->set_primary_key('cdid');
157   __PACKAGE__->belongs_to(artist => 'MyApp::Schema::Result::Artist', 'artistid');
158
159   1;
160
161 =head2 API usage
162
163 Then you can use these classes in your application's code:
164
165   # Connect to your database.
166   use MyApp::Schema;
167   my $schema = MyApp::Schema->connect($dbi_dsn, $user, $pass, \%dbi_params);
168
169   # Query for all artists and put them in an array,
170   # or retrieve them as a result set object.
171   # $schema->resultset returns a DBIx::Class::ResultSet
172   my @all_artists = $schema->resultset('Artist')->all;
173   my $all_artists_rs = $schema->resultset('Artist');
174
175   # Output all artists names
176   # $artist here is a DBIx::Class::Row, which has accessors
177   # for all its columns. Rows are also subclasses of your Result class.
178   foreach $artist (@all_artists) {
179     print $artist->name, "\n";
180   }
181
182   # Create a result set to search for artists.
183   # This does not query the DB.
184   my $johns_rs = $schema->resultset('Artist')->search(
185     # Build your WHERE using an SQL::Abstract structure:
186     { name => { like => 'John%' } }
187   );
188
189   # Execute a joined query to get the cds.
190   my @all_john_cds = $johns_rs->search_related('cds')->all;
191
192   # Fetch the next available row.
193   my $first_john = $johns_rs->next;
194
195   # Specify ORDER BY on the query.
196   my $first_john_cds_by_title_rs = $first_john->cds(
197     undef,
198     { order_by => 'title' }
199   );
200
201   # Create a result set that will fetch the artist data
202   # at the same time as it fetches CDs, using only one query.
203   my $millennium_cds_rs = $schema->resultset('CD')->search(
204     { year => 2000 },
205     { prefetch => 'artist' }
206   );
207
208   my $cd = $millennium_cds_rs->next; # SELECT ... FROM cds JOIN artists ...
209   my $cd_artist_name = $cd->artist->name; # Already has the data so no 2nd query
210
211   # new() makes a Result object but doesn't insert it into the DB.
212   # create() is the same as new() then insert().
213   my $new_cd = $schema->resultset('CD')->new({ title => 'Spoon' });
214   $new_cd->artist($cd->artist);
215   $new_cd->insert; # Auto-increment primary key filled in after INSERT
216   $new_cd->title('Fork');
217
218   $schema->txn_do(sub { $new_cd->update }); # Runs the update in a transaction
219
220   # change the year of all the millennium CDs at once
221   $millennium_cds_rs->update({ year => 2002 });
222
223 =head1 DESCRIPTION
224
225 This is an SQL to OO mapper with an object API inspired by L<Class::DBI>
226 (with a compatibility layer as a springboard for porting) and a resultset API
227 that allows abstract encapsulation of database operations. It aims to make
228 representing queries in your code as perl-ish as possible while still
229 providing access to as many of the capabilities of the database as possible,
230 including retrieving related records from multiple tables in a single query,
231 C<JOIN>, C<LEFT JOIN>, C<COUNT>, C<DISTINCT>, C<GROUP BY>, C<ORDER BY> and
232 C<HAVING> support.
233
234 DBIx::Class can handle multi-column primary and foreign keys, complex
235 queries and database-level paging, and does its best to only query the
236 database in order to return something you've directly asked for. If a
237 resultset is used as an iterator it only fetches rows off the statement
238 handle as requested in order to minimise memory usage. It has auto-increment
239 support for SQLite, MySQL, PostgreSQL, Oracle, SQL Server and DB2 and is
240 known to be used in production on at least the first four, and is fork-
241 and thread-safe out of the box (although
242 L<your DBD may not be|DBI/Threads and Thread Safety>).
243
244 This project is still under rapid development, so large new features may be
245 marked B<experimental> - such APIs are still usable but may have edge bugs.
246 Failing test cases are I<always> welcome and point releases are put out rapidly
247 as bugs are found and fixed.
248
249 We do our best to maintain full backwards compatibility for published
250 APIs, since DBIx::Class is used in production in many organisations,
251 and even backwards incompatible changes to non-published APIs will be fixed
252 if they're reported and doing so doesn't cost the codebase anything.
253
254 The test suite is quite substantial, and several developer releases
255 are generally made to CPAN before the branch for the next release is
256 merged back to trunk for a major release.
257
258 =head1 HOW TO CONTRIBUTE
259
260 Contributions are always welcome, in all usable forms (we especially
261 welcome documentation improvements). The delivery methods include git-
262 or unified-diff formatted patches, GitHub pull requests, or plain bug
263 reports either via RT or the Mailing list. Contributors are generally
264 granted access to the official repository after their first several
265 patches pass successful review. Don't hesitate to
266 L<contact|/GETTING HELP/SUPPORT> either of the L</CAT HERDERS> with
267 any further questions you may have.
268
269 =for comment
270 FIXME: Getty, frew and jnap need to get off their asses and finish the contrib section so we can link it here ;)
271
272 This project is maintained in a git repository. The code and related tools are
273 accessible at the following locations:
274
275 =over
276
277 =item * Official repo: L<git://git.shadowcat.co.uk/dbsrgits/DBIx-Class.git>
278
279 =item * Official gitweb: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/DBIx-Class.git>
280
281 =item * GitHub mirror: L<https://github.com/dbsrgits/DBIx-Class>
282
283 =item * Authorized committers: L<ssh://dbsrgits@git.shadowcat.co.uk/DBIx-Class.git>
284
285 =item * Travis-CI log: L<https://travis-ci.org/dbsrgits/dbix-class/builds>
286
287 =for html
288 &#x21AA; Bleeding edge dev CI status: <img src="https://secure.travis-ci.org/dbsrgits/dbix-class.png?branch=master"></img>
289
290 =back
291
292 =head1 AUTHORS
293
294 Even though a large portion of the source I<appears> to be written by just a
295 handful of people, this library continues to remain a collaborative effort -
296 perhaps one of the most successful such projects on L<CPAN|http://cpan.org>.
297 It is important to remember that ideas do not always result in a direct code
298 contribution, but deserve acknowledgement just the same. Time and time again
299 the seemingly most insignificant questions and suggestions have been shown
300 to catalyze monumental improvements in consistency, accuracy and performance.
301
302 =for comment this line is replaced with the author list at dist-building time
303
304 The canonical source of authors and their details is the F<AUTHORS> file at
305 the root of this distribution (or repository). The canonical source of
306 per-line authorship is the L<git repository|/HOW TO CONTRIBUTE> history
307 itself.
308
309 =head1 CAT HERDERS
310
311 The fine folks nudging the project in a particular direction:
312
313 =over
314
315 B<ribasushi>: Peter Rabbitson <ribasushi@cpan.org>
316 (present day maintenance and controlled evolution)
317
318 B<castaway>: Jess Robinson <castaway@desert-island.me.uk>
319 (lions share of the reference documentation and manuals)
320
321 B<mst>: Matt S Trout <mst@shadowcat.co.uk> (project founder -
322 original idea, architecture and implementation)
323
324 =back
325
326 =head1 COPYRIGHT AND LICENSE
327
328 Copyright (c) 2005 by mst, castaway, ribasushi, and other DBIx::Class
329 L</AUTHORS> as listed above and in F<AUTHORS>.
330
331 This library is free software and may be distributed under the same terms
332 as perl5 itself. See F<LICENSE> for the complete licensing terms.