In the middle of making deploy_depends_on smarter.
[dbsrgits/DBIx-Class-Historic.git] / lib / DBIx / Class.pm
CommitLineData
ea2e61bf 1package DBIx::Class;
2
5d283305 3use strict;
4use warnings;
5
329d7385 6use MRO::Compat;
d38cd95c 7use mro 'c3';
329d7385 8
2527233b 9use DBIx::Class::Optional::Dependencies;
10
5d283305 11use vars qw($VERSION);
d38cd95c 12use base qw/DBIx::Class::Componentised Class::Accessor::Grouped/;
11736b4c 13use DBIx::Class::StartupCheck;
3e110410 14
ade0fe3b 15sub mk_classdata {
77d518d1 16 shift->mk_classaccessor(@_);
17}
18
19sub mk_classaccessor {
20 my $self = shift;
ade0fe3b 21 $self->mk_group_accessors('inherited', $_[0]);
77d518d1 22 $self->set_inherited(@_) if @_ > 1;
3e110410 23}
3c0068c1 24
7411204b 25sub component_base_class { 'DBIx::Class' }
227d4dee 26
95da6f35 27# Always remember to do all digits for the version even if they're 0
28# i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
29# brain damage and presumably various other packaging systems too
a3356adb 30$VERSION = '0.08121_01';
748ab0dc 31
033955f9 32$VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
b8777a0d 33
f0750722 34sub MODIFY_CODE_ATTRIBUTES {
b5d2c57f 35 my ($class,$code,@attrs) = @_;
36 $class->mk_classdata('__attr_cache' => {})
37 unless $class->can('__attr_cache');
38 $class->__attr_cache->{$code} = [@attrs];
39 return ();
f0750722 40}
41
da95b45f 42sub _attr_cache {
b5d2c57f 43 my $self = shift;
44 my $cache = $self->can('__attr_cache') ? $self->__attr_cache : {};
45 my $rest = eval { $self->next::method };
46 return $@ ? $cache : { %$cache, %$rest };
da95b45f 47}
48
ea2e61bf 491;
34d52be2 50
75d07914 51=head1 NAME
34d52be2 52
7e4b2f59 53DBIx::Class - Extensible and flexible object <-> relational mapper.
34d52be2 54
3b1c2bbd 55=head1 GETTING HELP/SUPPORT
56
57The community can be found via:
58
a06e1181 59=over
3b1c2bbd 60
a06e1181 61=item * IRC: L<irc.perl.org#dbix-class (click for instant chatroom login)
62|http://mibbit.com/chat/#dbix-class@irc.perl.org>
3b1c2bbd 63
a06e1181 64=item * Mailing list: L<http://lists.scsys.co.uk/mailman/listinfo/dbix-class>
3b1c2bbd 65
a06e1181 66=item * RT Bug Tracker: L<https://rt.cpan.org/Dist/Display.html?Queue=DBIx-Class>
67
68=item * SVNWeb: L<http://dev.catalyst.perl.org/svnweb/bast/browse/DBIx-Class/0.08>
69
70=item * SVN: L<http://dev.catalyst.perl.org/repos/bast/DBIx-Class/0.08>
71
72=back
3b1c2bbd 73
34d52be2 74=head1 SYNOPSIS
75
bd077b47 76Create a schema class called MyDB/Schema.pm:
34d52be2 77
bd077b47 78 package MyDB::Schema;
a0638a7b 79 use base qw/DBIx::Class::Schema/;
34d52be2 80
f0bb26f3 81 __PACKAGE__->load_namespaces();
daec44b8 82
a0638a7b 83 1;
daec44b8 84
30e1753a 85Create a result class to represent artists, who have many CDs, in
f0bb26f3 86MyDB/Schema/Result/Artist.pm:
daec44b8 87
30e1753a 88See L<DBIx::Class::ResultSource> for docs on defining result classes.
89
f0bb26f3 90 package MyDB::Schema::Result::Artist;
d88ecca6 91 use base qw/DBIx::Class::Core/;
daec44b8 92
a0638a7b 93 __PACKAGE__->table('artist');
94 __PACKAGE__->add_columns(qw/ artistid name /);
95 __PACKAGE__->set_primary_key('artistid');
f0bb26f3 96 __PACKAGE__->has_many(cds => 'MyDB::Schema::Result::CD');
daec44b8 97
a0638a7b 98 1;
daec44b8 99
30e1753a 100A result class to represent a CD, which belongs to an artist, in
f0bb26f3 101MyDB/Schema/Result/CD.pm:
39fe0e65 102
f0bb26f3 103 package MyDB::Schema::Result::CD;
d88ecca6 104 use base qw/DBIx::Class::Core/;
39fe0e65 105
d88ecca6 106 __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
a0638a7b 107 __PACKAGE__->table('cd');
bd077b47 108 __PACKAGE__->add_columns(qw/ cdid artistid title year /);
a0638a7b 109 __PACKAGE__->set_primary_key('cdid');
bd077b47 110 __PACKAGE__->belongs_to(artist => 'MyDB::Schema::Artist', 'artistid');
39fe0e65 111
a0638a7b 112 1;
39fe0e65 113
a0638a7b 114Then you can use these classes in your application's code:
39fe0e65 115
a0638a7b 116 # Connect to your database.
bd077b47 117 use MyDB::Schema;
118 my $schema = MyDB::Schema->connect($dbi_dsn, $user, $pass, \%dbi_params);
a0638a7b 119
120 # Query for all artists and put them in an array,
121 # or retrieve them as a result set object.
30e1753a 122 # $schema->resultset returns a DBIx::Class::ResultSet
2053ab2a 123 my @all_artists = $schema->resultset('Artist')->all;
124 my $all_artists_rs = $schema->resultset('Artist');
126042ee 125
30e1753a 126 # Output all artists names
4e8ffded 127 # $artist here is a DBIx::Class::Row, which has accessors
16ccb4fe 128 # for all its columns. Rows are also subclasses of your Result class.
85067746 129 foreach $artist (@all_artists) {
30e1753a 130 print $artist->name, "\n";
131 }
132
a0638a7b 133 # Create a result set to search for artists.
86beca1d 134 # This does not query the DB.
2053ab2a 135 my $johns_rs = $schema->resultset('Artist')->search(
6576ef54 136 # Build your WHERE using an SQL::Abstract structure:
2053ab2a 137 { name => { like => 'John%' } }
a0638a7b 138 );
39fe0e65 139
2053ab2a 140 # Execute a joined query to get the cds.
a0638a7b 141 my @all_john_cds = $johns_rs->search_related('cds')->all;
448c8424 142
f0bb26f3 143 # Fetch the next available row.
a0638a7b 144 my $first_john = $johns_rs->next;
448c8424 145
2053ab2a 146 # Specify ORDER BY on the query.
a0638a7b 147 my $first_john_cds_by_title_rs = $first_john->cds(
148 undef,
149 { order_by => 'title' }
150 );
448c8424 151
bd077b47 152 # Create a result set that will fetch the artist data
2053ab2a 153 # at the same time as it fetches CDs, using only one query.
884559b1 154 my $millennium_cds_rs = $schema->resultset('CD')->search(
a0638a7b 155 { year => 2000 },
156 { prefetch => 'artist' }
157 );
448c8424 158
880a1a0c 159 my $cd = $millennium_cds_rs->next; # SELECT ... FROM cds JOIN artists ...
bd077b47 160 my $cd_artist_name = $cd->artist->name; # Already has the data so no 2nd query
076652e8 161
264f1571 162 # new() makes a DBIx::Class::Row object but doesnt insert it into the DB.
163 # create() is the same as new() then insert().
884559b1 164 my $new_cd = $schema->resultset('CD')->new({ title => 'Spoon' });
f183eccd 165 $new_cd->artist($cd->artist);
f183eccd 166 $new_cd->insert; # Auto-increment primary key filled in after INSERT
f183eccd 167 $new_cd->title('Fork');
168
884559b1 169 $schema->txn_do(sub { $new_cd->update }); # Runs the update in a transaction
f183eccd 170
bd077b47 171 # change the year of all the millennium CDs at once
172 $millennium_cds_rs->update({ year => 2002 });
f183eccd 173
174=head1 DESCRIPTION
175
176This is an SQL to OO mapper with an object API inspired by L<Class::DBI>
bd077b47 177(with a compatibility layer as a springboard for porting) and a resultset API
f183eccd 178that allows abstract encapsulation of database operations. It aims to make
179representing queries in your code as perl-ish as possible while still
a0638a7b 180providing access to as many of the capabilities of the database as possible,
f183eccd 181including retrieving related records from multiple tables in a single query,
bd077b47 182JOIN, LEFT JOIN, COUNT, DISTINCT, GROUP BY, ORDER BY and HAVING support.
f183eccd 183
184DBIx::Class can handle multi-column primary and foreign keys, complex
185queries and database-level paging, and does its best to only query the
75d07914 186database in order to return something you've directly asked for. If a
187resultset is used as an iterator it only fetches rows off the statement
188handle as requested in order to minimise memory usage. It has auto-increment
2053ab2a 189support for SQLite, MySQL, PostgreSQL, Oracle, SQL Server and DB2 and is
190known to be used in production on at least the first four, and is fork-
75d07914 191and thread-safe out of the box (although your DBD may not be).
f183eccd 192
dfccde48 193This project is still under rapid development, so large new features may be
194marked EXPERIMENTAL - such APIs are still usable but may have edge bugs.
195Failing test cases are *always* welcome and point releases are put out rapidly
196as bugs are found and fixed.
197
198We do our best to maintain full backwards compatibility for published
199APIs, since DBIx::Class is used in production in many organisations,
200and even backwards incompatible changes to non-published APIs will be fixed
201if they're reported and doing so doesn't cost the codebase anything.
202
264f1571 203The test suite is quite substantial, and several developer releases
204are generally made to CPAN before the branch for the next release is
205merged back to trunk for a major release.
f183eccd 206
f183eccd 207=head1 WHERE TO GO NEXT
208
2ca930b4 209L<DBIx::Class::Manual::DocMap> lists each task you might want help on, and
210the modules where you will find documentation.
076652e8 211
3942ab4d 212=head1 AUTHOR
34d52be2 213
266bdcc3 214mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
34d52be2 215
dfccde48 216(I mostly consider myself "project founder" these days but the AUTHOR heading
217is traditional :)
218
3942ab4d 219=head1 CONTRIBUTORS
220
907ed671 221abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
84e3c114 222
6d84db2c 223aherzog: Adam Herzog <adam@herzogdesigns.com>
224
6ebf5cbb 225amiri: Amiri Barksdale <amiri@metalabel.com>
226
b703fec7 227amoore: Andrew Moore <amoore@cpan.org>
228
266bdcc3 229andyg: Andy Grundman <andy@hybridized.org>
3942ab4d 230
266bdcc3 231ank: Andres Kievsky
3942ab4d 232
624764ae 233arcanez: Justin Hunter <justin.d.hunter@gmail.com>
234
ce4c07df 235ash: Ash Berlin <ash@cpan.org>
236
3d5bd2af 237bert: Norbert Csongradi <bert@cpan.org>
238
967a4c40 239blblack: Brandon L. Black <blblack@gmail.com>
3942ab4d 240
62eb8fe8 241bluefeet: Aran Deltac <bluefeet@cpan.org>
242
f856fe01 243boghead: Bryan Beeley <cpan@beeley.org>
244
bcb8f3ed 245bricas: Brian Cassidy <bricas@cpan.org>
246
3d7e3e05 247brunov: Bruno Vecchi <vecchi.b@gmail.com>
248
281719d2 249caelum: Rafael Kitover <rkitover@cpan.org>
250
d3b0e369 251castaway: Jess Robinson
3942ab4d 252
266bdcc3 253claco: Christopher H. Laco
ccb9c9b1 254
266bdcc3 255clkao: CL Kao
3942ab4d 256
e21dfd6a 257da5id: David Jack Olrik <djo@cpan.org>
18360aed 258
13de943d 259debolaz: Anders Nor Berle <berle@cpan.org>
260
d1f542db 261dew: Dan Thomas <dan@godders.org>
262
266bdcc3 263dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
ccb9c9b1 264
9382ad07 265dnm: Justin Wheeler <jwheeler@datademons.com>
266
0818c9a7 267dpetrov: Dimitar Petrov <mitakaa@gmail.com>
268
266bdcc3 269dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
4685e006 270
5cffe785 271dyfrgi: Michael Leuchtenburg <michael@slashhome.org>
8fe164b9 272
ade0fe3b 273frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
274
b4987ed0 275goraxe: Gordon Irving <goraxe@cpan.org>
276
d3b0e369 277gphat: Cory G Watson <gphat@cpan.org>
ad3d2d7c 278
e758ffe6 279groditi: Guillermo Roditi <groditi@cpan.org>
280
157ce0cf 281hobbs: Andrew Rodland <arodland@cpan.org>
282
5d779578 283ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
284
bee21976 285jasonmay: Jason May <jason.a.may@gmail.com>
286
d3b0e369 287jesper: Jesper Krogh
5fb0c64c 288
4a743a00 289jgoulah: John Goulah <jgoulah@cpan.org>
290
102a2984 291jguenther: Justin Guenther <jguenther@cpan.org>
d7c4c15c 292
a14a46e2 293jhannah: Jay Hannah <jay@jays.net>
294
8b93a938 295jnapiorkowski: John Napiorkowski <jjn1056@yahoo.com>
296
11736b4c 297jon: Jon Schutz <jjschutz@cpan.org>
298
1aec4bac 299jshirley: J. Shirley <jshirley@gmail.com>
300
d3b0e369 301konobi: Scott McWhirter
535fc2ee 302
4367679a 303lukes: Luke Saunders <luke.saunders@gmail.com>
304
709ea492 305marcus: Marcus Ramberg <mramberg@cpan.org>
306
114780ee 307mattlaw: Matt Lawrence
308
58755bba 309michaelr: Michael Reddick <michael.reddick@gmail.com>
310
77e7e47d 311ned: Neil de Carteret
312
266bdcc3 313nigel: Nigel Metheringham <nigelm@cpan.org>
6565b410 314
d3b0e369 315ningu: David Kamholz <dkamholz@cpan.org>
316
66cf3a84 317Nniuq: Ron "Quinn" Straight" <quinnfazigu@gmail.org>
318
20b4c148 319norbi: Norbert Buchmuller <norbi@nix.hu>
320
48580715 321nuba: Nuba Princigalli <nuba@cpan.org>
322
d3b0e369 323Numa: Dan Sully <daniel@cpan.org>
324
dc571b76 325ovid: Curtis "Ovid" Poe <ovid@cpan.org>
326
bf356c54 327oyse: Øystein Torget <oystein.torget@dnv.com>
328
266bdcc3 329paulm: Paul Makepeace
4763f4b7 330
d3b0e369 331penguin: K J Cheetham
332
8cfef6f5 333perigrin: Chris Prather <chris@prather.org>
334
14899528 335peter: Peter Collingbourne <peter@pcc.me.uk>
caac1708 336
266bdcc3 337phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
a53b95f1 338
56fadd8f 339plu: Johannes Plunien <plu@cpan.org>
340
d3b0e369 341quicksilver: Jules Bean
022e0893 342
4ed01b34 343rafl: Florian Ragwitz <rafl@debian.org>
344
7ff0dace 345rbuels: Robert Buels <rmb32@cornell.edu>
346
0da8b7da 347rdj: Ryan D Johnson <ryan@innerfence.com>
348
66b1e361 349ribasushi: Peter Rabbitson <ribasushi@cpan.org>
d76e282a 350
b487918c 351rjbs: Ricardo Signes <rjbs@cpan.org>
352
6ffb5be5 353robkinyon: Rob Kinyon <rkinyon@cpan.org>
354
e4c9f3f0 355Roman: Roman Filippov <romanf@cpan.org>
356
d3b0e369 357sc_: Just Another Perl Hacker
ba606e58 358
266bdcc3 359scotty: Scotty Allen <scotty@scottyallen.com>
181a28f4 360
1c133e22 361semifor: Marc Mims <marc@questright.com>
362
20b4c148 363solomon: Jared Johnson <jaredj@nmgi.com>
364
88f937fb 365spb: Stephen Bennett <stephen@freenode.net>
366
637ca936 367sszabo: Stephan Szabo <sszabo@bigpanda.com>
368
386c2272 369teejay : Aaron Trevena <teejay@cpan.org>
370
84e3c114 371Todd Lipcon
e063fe2c 372
6eb6264e 373Tom Hukins
374
d15e3fc5 375triode: Pete Gamache <gamache@cpan.org>
376
d3b0e369 377typester: Daisuke Murase <typester@cpan.org>
c0e7b4e5 378
4740bdb7 379victori: Victor Igumnov <victori@cpan.org>
380
d3b0e369 381wdh: Will Hawes
4c248161 382
00c03ced 383willert: Sebastian Willert <willert@cpan.org>
384
66d2a14e 385wreis: Wallace Reis <wreis@cpan.org>
386
d3b0e369 387zamolxes: Bogdan Lucaciu <bogdan@wiz.ro>
78060df8 388
c1807ed5 389Possum: Daniel LeWarne <possum@cpan.org>
390
b38e10bd 391=head1 COPYRIGHT
392
48580715 393Copyright (c) 2005 - 2010 the DBIx::Class L</AUTHOR> and L</CONTRIBUTORS>
b38e10bd 394as listed above.
395
96154ef7 396=head1 LICENSE
397
398This library is free software and may be distributed under the same terms
399as perl itself.
400
34d52be2 401=cut