Many improvements of bigint handling across various DBD::SQLite versions
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class.pm
1 package DBIx::Class;
2
3 use strict;
4 use warnings;
5
6 our $VERSION;
7 # Always remember to do all digits for the version even if they're 0
8 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports
9 # brain damage and presumably various other packaging systems too
10
11 # $VERSION declaration must stay up here, ahead of any other package
12 # declarations, as to not confuse various modules attempting to determine
13 # this ones version, whether that be s.c.o. or Module::Metadata, etc
14 $VERSION = '0.08250';
15
16 $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
17
18 BEGIN {
19   package # hide from pause
20     DBIx::Class::_ENV_;
21
22   use Config;
23
24   use constant {
25
26     # but of course
27     BROKEN_FORK => ($^O eq 'MSWin32') ? 1 : 0,
28
29     HAS_ITHREADS => $Config{useithreads} ? 1 : 0,
30
31     # ::Runmode would only be loaded by DBICTest, which in turn implies t/
32     DBICTEST => eval { DBICTest::RunMode->is_author } ? 1 : 0,
33
34     # During 5.13 dev cycle HELEMs started to leak on copy
35     PEEPEENESS =>
36       # request for all tests would force "non-leaky" illusion and vice-versa
37       defined $ENV{DBICTEST_ALL_LEAKS}                                              ? !$ENV{DBICTEST_ALL_LEAKS}
38       # otherwise confess that this perl is busted ONLY on smokers
39     : eval { DBICTest::RunMode->is_smoker } && ($] >= 5.013005 and $] <= 5.013006)  ? 1
40       # otherwise we are good
41                                                                                     : 0
42     ,
43
44     ASSERT_NO_INTERNAL_WANTARRAY => $ENV{DBIC_ASSERT_NO_INTERNAL_WANTARRAY} ? 1 : 0,
45
46     IV_SIZE => $Config{ivsize},
47   };
48
49   if ($] < 5.009_005) {
50     require MRO::Compat;
51     constant->import( OLD_MRO => 1 );
52   }
53   else {
54     require mro;
55     constant->import( OLD_MRO => 0 );
56   }
57 }
58
59 use mro 'c3';
60
61 use DBIx::Class::Optional::Dependencies;
62
63 use base qw/DBIx::Class::Componentised DBIx::Class::AccessorGroup/;
64 use DBIx::Class::StartupCheck;
65 use DBIx::Class::Exception;
66
67 __PACKAGE__->mk_group_accessors(inherited => '_skip_namespace_frames');
68 __PACKAGE__->_skip_namespace_frames('^DBIx::Class|^SQL::Abstract|^Try::Tiny|^Class::Accessor::Grouped|^Context::Preserve');
69
70 sub mk_classdata {
71   shift->mk_classaccessor(@_);
72 }
73
74 sub mk_classaccessor {
75   my $self = shift;
76   $self->mk_group_accessors('inherited', $_[0]);
77   $self->set_inherited(@_) if @_ > 1;
78 }
79
80 sub component_base_class { 'DBIx::Class' }
81
82 sub MODIFY_CODE_ATTRIBUTES {
83   my ($class,$code,@attrs) = @_;
84   $class->mk_classdata('__attr_cache' => {})
85     unless $class->can('__attr_cache');
86   $class->__attr_cache->{$code} = [@attrs];
87   return ();
88 }
89
90 sub _attr_cache {
91   my $self = shift;
92   my $cache = $self->can('__attr_cache') ? $self->__attr_cache : {};
93
94   return {
95     %$cache,
96     %{ $self->maybe::next::method || {} },
97   };
98 }
99
100 1;
101
102 __END__
103
104 =encoding UTF-8
105
106 =head1 NAME
107
108 DBIx::Class - Extensible and flexible object <-> relational mapper.
109
110 =head1 WHERE TO START READING
111
112 See L<DBIx::Class::Manual::DocMap> for an overview of the exhaustive documentation.
113 To get the most out of DBIx::Class with the least confusion it is strongly
114 recommended to read (at the very least) the
115 L<Manuals|DBIx::Class::Manual::DocMap/Manuals> in the order presented there.
116
117 =head1 HOW TO GET HELP
118
119 Due to the complexity of its problem domain, DBIx::Class is a relatively
120 complex framework. After you start using DBIx::Class questions will inevitably
121 arise. If you are stuck with a problem or have doubts about a particular
122 approach do not hesitate to contact the community with your questions. The
123 list below is sorted by "fastest response time":
124
125 =over
126
127 =item * IRC: irc.perl.org#dbix-class
128
129 =for html
130 <a href="https://chat.mibbit.com/#dbix-class@irc.perl.org">(click for instant chatroom login)</a>
131
132 =item * Mailing list: L<http://lists.scsys.co.uk/mailman/listinfo/dbix-class>
133
134 =item * RT Bug Tracker: L<https://rt.cpan.org/NoAuth/Bugs.html?Dist=DBIx-Class>
135
136 =item * Twitter: L<https://www.twitter.com/dbix_class>
137
138 =item * Web Site: L<http://www.dbix-class.org/>
139
140 =back
141
142 =head1 SYNOPSIS
143
144 For the very impatient: L<DBIx::Class::Manual::QuickStart>
145
146 This code in the next step can be generated automatically from an existing
147 database, see L<dbicdump> from the distribution C<DBIx-Class-Schema-Loader>.
148
149 =head2 Schema classes preparation
150
151 Create a schema class called F<MyApp/Schema.pm>:
152
153   package MyApp::Schema;
154   use base qw/DBIx::Class::Schema/;
155
156   __PACKAGE__->load_namespaces();
157
158   1;
159
160 Create a result class to represent artists, who have many CDs, in
161 F<MyApp/Schema/Result/Artist.pm>:
162
163 See L<DBIx::Class::ResultSource> for docs on defining result classes.
164
165   package MyApp::Schema::Result::Artist;
166   use base qw/DBIx::Class::Core/;
167
168   __PACKAGE__->table('artist');
169   __PACKAGE__->add_columns(qw/ artistid name /);
170   __PACKAGE__->set_primary_key('artistid');
171   __PACKAGE__->has_many(cds => 'MyApp::Schema::Result::CD', 'artistid');
172
173   1;
174
175 A result class to represent a CD, which belongs to an artist, in
176 F<MyApp/Schema/Result/CD.pm>:
177
178   package MyApp::Schema::Result::CD;
179   use base qw/DBIx::Class::Core/;
180
181   __PACKAGE__->load_components(qw/InflateColumn::DateTime/);
182   __PACKAGE__->table('cd');
183   __PACKAGE__->add_columns(qw/ cdid artistid title year /);
184   __PACKAGE__->set_primary_key('cdid');
185   __PACKAGE__->belongs_to(artist => 'MyApp::Schema::Result::Artist', 'artistid');
186
187   1;
188
189 =head2 API usage
190
191 Then you can use these classes in your application's code:
192
193   # Connect to your database.
194   use MyApp::Schema;
195   my $schema = MyApp::Schema->connect($dbi_dsn, $user, $pass, \%dbi_params);
196
197   # Query for all artists and put them in an array,
198   # or retrieve them as a result set object.
199   # $schema->resultset returns a DBIx::Class::ResultSet
200   my @all_artists = $schema->resultset('Artist')->all;
201   my $all_artists_rs = $schema->resultset('Artist');
202
203   # Output all artists names
204   # $artist here is a DBIx::Class::Row, which has accessors
205   # for all its columns. Rows are also subclasses of your Result class.
206   foreach $artist (@all_artists) {
207     print $artist->name, "\n";
208   }
209
210   # Create a result set to search for artists.
211   # This does not query the DB.
212   my $johns_rs = $schema->resultset('Artist')->search(
213     # Build your WHERE using an SQL::Abstract structure:
214     { name => { like => 'John%' } }
215   );
216
217   # Execute a joined query to get the cds.
218   my @all_john_cds = $johns_rs->search_related('cds')->all;
219
220   # Fetch the next available row.
221   my $first_john = $johns_rs->next;
222
223   # Specify ORDER BY on the query.
224   my $first_john_cds_by_title_rs = $first_john->cds(
225     undef,
226     { order_by => 'title' }
227   );
228
229   # Create a result set that will fetch the artist data
230   # at the same time as it fetches CDs, using only one query.
231   my $millennium_cds_rs = $schema->resultset('CD')->search(
232     { year => 2000 },
233     { prefetch => 'artist' }
234   );
235
236   my $cd = $millennium_cds_rs->next; # SELECT ... FROM cds JOIN artists ...
237   my $cd_artist_name = $cd->artist->name; # Already has the data so no 2nd query
238
239   # new() makes a Result object but doesnt insert it into the DB.
240   # create() is the same as new() then insert().
241   my $new_cd = $schema->resultset('CD')->new({ title => 'Spoon' });
242   $new_cd->artist($cd->artist);
243   $new_cd->insert; # Auto-increment primary key filled in after INSERT
244   $new_cd->title('Fork');
245
246   $schema->txn_do(sub { $new_cd->update }); # Runs the update in a transaction
247
248   # change the year of all the millennium CDs at once
249   $millennium_cds_rs->update({ year => 2002 });
250
251 =head1 DESCRIPTION
252
253 This is an SQL to OO mapper with an object API inspired by L<Class::DBI>
254 (with a compatibility layer as a springboard for porting) and a resultset API
255 that allows abstract encapsulation of database operations. It aims to make
256 representing queries in your code as perl-ish as possible while still
257 providing access to as many of the capabilities of the database as possible,
258 including retrieving related records from multiple tables in a single query,
259 C<JOIN>, C<LEFT JOIN>, C<COUNT>, C<DISTINCT>, C<GROUP BY>, C<ORDER BY> and
260 C<HAVING> support.
261
262 DBIx::Class can handle multi-column primary and foreign keys, complex
263 queries and database-level paging, and does its best to only query the
264 database in order to return something you've directly asked for. If a
265 resultset is used as an iterator it only fetches rows off the statement
266 handle as requested in order to minimise memory usage. It has auto-increment
267 support for SQLite, MySQL, PostgreSQL, Oracle, SQL Server and DB2 and is
268 known to be used in production on at least the first four, and is fork-
269 and thread-safe out of the box (although
270 L<your DBD may not be|DBI/Threads and Thread Safety>).
271
272 This project is still under rapid development, so large new features may be
273 marked B<experimental> - such APIs are still usable but may have edge bugs.
274 Failing test cases are I<always> welcome and point releases are put out rapidly
275 as bugs are found and fixed.
276
277 We do our best to maintain full backwards compatibility for published
278 APIs, since DBIx::Class is used in production in many organisations,
279 and even backwards incompatible changes to non-published APIs will be fixed
280 if they're reported and doing so doesn't cost the codebase anything.
281
282 The test suite is quite substantial, and several developer releases
283 are generally made to CPAN before the branch for the next release is
284 merged back to trunk for a major release.
285
286 =head1 HOW TO CONTRIBUTE
287
288 Contributions are always welcome, in all usable forms (we especially
289 welcome documentation improvements). The delivery methods include git-
290 or unified-diff formatted patches, GitHub pull requests, or plain bug
291 reports either via RT or the Mailing list. Contributors are generally
292 granted full access to the official repository after their first patch
293 passes successful review.
294
295 =for comment
296 FIXME: Getty, frew and jnap need to get off their asses and finish the contrib section so we can link it here ;)
297
298 This project is maintained in a git repository. The code and related tools are
299 accessible at the following locations:
300
301 =over
302
303 =item * Official repo: L<git://git.shadowcat.co.uk/dbsrgits/DBIx-Class.git>
304
305 =item * Official gitweb: L<http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=dbsrgits/DBIx-Class.git>
306
307 =item * GitHub mirror: L<https://github.com/dbsrgits/DBIx-Class>
308
309 =item * Authorized committers: L<ssh://dbsrgits@git.shadowcat.co.uk/DBIx-Class.git>
310
311 =item * Travis-CI log: L<https://travis-ci.org/dbsrgits/dbix-class/builds>
312
313 =for html
314 &#x21AA; Stable branch CI status: <img src="https://secure.travis-ci.org/dbsrgits/dbix-class.png?branch=master"></img>
315
316 =back
317
318 =head1 AUTHOR
319
320 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
321
322 (I mostly consider myself "project founder" these days but the AUTHOR heading
323 is traditional :)
324
325 =head1 CONTRIBUTORS
326
327 abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
328
329 acca: Alexander Kuznetsov <acca@cpan.org>
330
331 aherzog: Adam Herzog <adam@herzogdesigns.com>
332
333 Alexander Keusch <cpan@keusch.at>
334
335 alexrj: Alessandro Ranellucci <aar@cpan.org>
336
337 alnewkirk: Al Newkirk <we@ana.im>
338
339 amiri: Amiri Barksdale <amiri@metalabel.com>
340
341 amoore: Andrew Moore <amoore@cpan.org>
342
343 andrewalker: Andre Walker <andre@andrewalker.net>
344
345 andyg: Andy Grundman <andy@hybridized.org>
346
347 ank: Andres Kievsky
348
349 arc: Aaron Crane <arc@cpan.org>
350
351 arcanez: Justin Hunter <justin.d.hunter@gmail.com>
352
353 ash: Ash Berlin <ash@cpan.org>
354
355 bert: Norbert Csongrádi <bert@cpan.org>
356
357 blblack: Brandon L. Black <blblack@gmail.com>
358
359 bluefeet: Aran Deltac <bluefeet@cpan.org>
360
361 bphillips: Brian Phillips <bphillips@cpan.org>
362
363 boghead: Bryan Beeley <cpan@beeley.org>
364
365 brd: Brad Davis <brd@FreeBSD.org>
366
367 bricas: Brian Cassidy <bricas@cpan.org>
368
369 brunov: Bruno Vecchi <vecchi.b@gmail.com>
370
371 caelum: Rafael Kitover <rkitover@cpan.org>
372
373 caldrin: Maik Hentsche <maik.hentsche@amd.com>
374
375 castaway: Jess Robinson
376
377 claco: Christopher H. Laco
378
379 clkao: CL Kao
380
381 da5id: David Jack Olrik <djo@cpan.org>
382
383 dariusj: Darius Jokilehto <dariusjokilehto@yahoo.co.uk>
384
385 davewood: David Schmidt <davewood@gmx.at>
386
387 daxim: Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯 <daxim@cpan.org>
388
389 debolaz: Anders Nor Berle <berle@cpan.org>
390
391 dew: Dan Thomas <dan@godders.org>
392
393 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
394
395 dnm: Justin Wheeler <jwheeler@datademons.com>
396
397 dpetrov: Dimitar Petrov <mitakaa@gmail.com>
398
399 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
400
401 dyfrgi: Michael Leuchtenburg <michael@slashhome.org>
402
403 edenc: Eden Cardim <edencardim@gmail.com>
404
405 ether: Karen Etheridge <ether@cpan.org>
406
407 felliott: Fitz Elliott <fitz.elliott@gmail.com>
408
409 freetime: Bill Moseley <moseley@hank.org>
410
411 frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
412
413 goraxe: Gordon Irving <goraxe@cpan.org>
414
415 gphat: Cory G Watson <gphat@cpan.org>
416
417 Grant Street Group L<http://www.grantstreet.com/>
418
419 groditi: Guillermo Roditi <groditi@cpan.org>
420
421 Haarg: Graham Knop <haarg@haarg.org>
422
423 hobbs: Andrew Rodland <arodland@cpan.org>
424
425 ilmari: Dagfinn Ilmari MannsE<aring>ker <ilmari@ilmari.org>
426
427 initself: Mike Baas <mike@initselftech.com>
428
429 ironcamel: Naveed Massjouni <naveedm9@gmail.com>
430
431 jawnsy: Jonathan Yu <jawnsy@cpan.org>
432
433 jasonmay: Jason May <jason.a.may@gmail.com>
434
435 jesper: Jesper Krogh
436
437 jgoulah: John Goulah <jgoulah@cpan.org>
438
439 jguenther: Justin Guenther <jguenther@cpan.org>
440
441 jhannah: Jay Hannah <jay@jays.net>
442
443 jmac: Jason McIntosh <jmac@appleseed-sc.com>
444
445 jnapiorkowski: John Napiorkowski <jjn1056@yahoo.com>
446
447 jon: Jon Schutz <jjschutz@cpan.org>
448
449 jshirley: J. Shirley <jshirley@gmail.com>
450
451 kaare: Kaare Rasmussen
452
453 konobi: Scott McWhirter
454
455 littlesavage: Alexey Illarionov <littlesavage@orionet.ru>
456
457 lukes: Luke Saunders <luke.saunders@gmail.com>
458
459 marcus: Marcus Ramberg <mramberg@cpan.org>
460
461 mattlaw: Matt Lawrence
462
463 mattp: Matt Phillips <mattp@cpan.org>
464
465 michaelr: Michael Reddick <michael.reddick@gmail.com>
466
467 milki: Jonathan Chu <milki@rescomp.berkeley.edu>
468
469 mithaldu: Christian Walde <walde.christian@gmail.com>
470
471 mjemmeson: Michael Jemmeson <michael.jemmeson@gmail.com>
472
473 mstratman: Mark A. Stratman <stratman@gmail.com>
474
475 ned: Neil de Carteret
476
477 nigel: Nigel Metheringham <nigelm@cpan.org>
478
479 ningu: David Kamholz <dkamholz@cpan.org>
480
481 Nniuq: Ron "Quinn" Straight" <quinnfazigu@gmail.org>
482
483 norbi: Norbert Buchmuller <norbi@nix.hu>
484
485 nuba: Nuba Princigalli <nuba@cpan.org>
486
487 Numa: Dan Sully <daniel@cpan.org>
488
489 ovid: Curtis "Ovid" Poe <ovid@cpan.org>
490
491 oyse: E<Oslash>ystein Torget <oystein.torget@dnv.com>
492
493 paulm: Paul Makepeace
494
495 penguin: K J Cheetham
496
497 perigrin: Chris Prather <chris@prather.org>
498
499 peter: Peter Collingbourne <peter@pcc.me.uk>
500
501 Peter Siklósi <einon@einon.hu>
502
503 Peter Valdemar ME<oslash>rch <peter@morch.com>
504
505 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
506
507 plu: Johannes Plunien <plu@cpan.org>
508
509 Possum: Daniel LeWarne <possum@cpan.org>
510
511 quicksilver: Jules Bean
512
513 rafl: Florian Ragwitz <rafl@debian.org>
514
515 rainboxx: Matthias Dietrich <perl@rb.ly>
516
517 rbo: Robert Bohne <rbo@cpan.org>
518
519 rbuels: Robert Buels <rmb32@cornell.edu>
520
521 rdj: Ryan D Johnson <ryan@innerfence.com>
522
523 ribasushi: Peter Rabbitson <ribasushi@cpan.org>
524
525 rjbs: Ricardo Signes <rjbs@cpan.org>
526
527 robkinyon: Rob Kinyon <rkinyon@cpan.org>
528
529 Robert Olson <bob@rdolson.org>
530
531 moltar: Roman Filippov <romanf@cpan.org>
532
533 Sadrak: Felix Antonius Wilhelm Ostmann <sadrak@cpan.org>
534
535 sc_: Just Another Perl Hacker
536
537 scotty: Scotty Allen <scotty@scottyallen.com>
538
539 semifor: Marc Mims <marc@questright.com>
540
541 SineSwiper: Brendan Byrd <bbyrd@cpan.org>
542
543 solomon: Jared Johnson <jaredj@nmgi.com>
544
545 spb: Stephen Bennett <stephen@freenode.net>
546
547 Squeeks <squeek@cpan.org>
548
549 sszabo: Stephan Szabo <sszabo@bigpanda.com>
550
551 talexb: Alex Beamish <talexb@gmail.com>
552
553 tamias: Ronald J Kimball <rjk@tamias.net>
554
555 teejay : Aaron Trevena <teejay@cpan.org>
556
557 Todd Lipcon
558
559 Tom Hukins
560
561 tonvoon: Ton Voon <tonvoon@cpan.org>
562
563 triode: Pete Gamache <gamache@cpan.org>
564
565 typester: Daisuke Murase <typester@cpan.org>
566
567 victori: Victor Igumnov <victori@cpan.org>
568
569 wdh: Will Hawes
570
571 wesm: Wes Malone <wes@mitsi.com>
572
573 willert: Sebastian Willert <willert@cpan.org>
574
575 wreis: Wallace Reis <wreis@cpan.org>
576
577 xenoterracide: Caleb Cushing <xenoterracide@gmail.com>
578
579 yrlnry: Mark Jason Dominus <mjd@plover.com>
580
581 zamolxes: Bogdan Lucaciu <bogdan@wiz.ro>
582
583 =head1 COPYRIGHT
584
585 Copyright (c) 2005 - 2011 the DBIx::Class L</AUTHOR> and L</CONTRIBUTORS>
586 as listed above.
587
588 =head1 LICENSE
589
590 This library is free software and may be distributed under the same terms
591 as perl itself.