Allow users to disable the "DT in search" warning introduced in e1038213
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI.pm
1 package DBIx::Class::Storage::DBI;
2 # -*- mode: cperl; cperl-indent-level: 2 -*-
3
4 use strict;
5 use warnings;
6
7 use base qw/DBIx::Class::Storage::DBIHacks DBIx::Class::Storage/;
8 use mro 'c3';
9
10 use DBIx::Class::Carp;
11 use DBIx::Class::Exception;
12 use Scalar::Util qw/refaddr weaken reftype blessed/;
13 use List::Util qw/first/;
14 use Sub::Name 'subname';
15 use Try::Tiny;
16 use overload ();
17 use namespace::clean;
18
19 # default cursor class, overridable in connect_info attributes
20 __PACKAGE__->cursor_class('DBIx::Class::Storage::DBI::Cursor');
21
22 __PACKAGE__->mk_group_accessors('inherited' => qw/
23   sql_limit_dialect sql_quote_char sql_name_sep
24 /);
25
26 __PACKAGE__->mk_group_accessors('component_class' => qw/sql_maker_class datetime_parser_type/);
27
28 __PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker');
29 __PACKAGE__->datetime_parser_type('DateTime::Format::MySQL'); # historic default
30
31 __PACKAGE__->sql_name_sep('.');
32
33 __PACKAGE__->mk_group_accessors('simple' => qw/
34   _connect_info _dbi_connect_info _dbic_connect_attributes _driver_determined
35   _dbh _dbh_details _conn_pid _sql_maker _sql_maker_opts _dbh_autocommit
36 /);
37
38 # the values for these accessors are picked out (and deleted) from
39 # the attribute hashref passed to connect_info
40 my @storage_options = qw/
41   on_connect_call on_disconnect_call on_connect_do on_disconnect_do
42   disable_sth_caching unsafe auto_savepoint
43 /;
44 __PACKAGE__->mk_group_accessors('simple' => @storage_options);
45
46
47 # capability definitions, using a 2-tiered accessor system
48 # The rationale is:
49 #
50 # A driver/user may define _use_X, which blindly without any checks says:
51 # "(do not) use this capability", (use_dbms_capability is an "inherited"
52 # type accessor)
53 #
54 # If _use_X is undef, _supports_X is then queried. This is a "simple" style
55 # accessor, which in turn calls _determine_supports_X, and stores the return
56 # in a special slot on the storage object, which is wiped every time a $dbh
57 # reconnection takes place (it is not guaranteed that upon reconnection we
58 # will get the same rdbms version). _determine_supports_X does not need to
59 # exist on a driver, as we ->can for it before calling.
60
61 my @capabilities = (qw/
62   insert_returning
63   insert_returning_bound
64   placeholders
65   typeless_placeholders
66   join_optimizer
67 /);
68 __PACKAGE__->mk_group_accessors( dbms_capability => map { "_supports_$_" } @capabilities );
69 __PACKAGE__->mk_group_accessors( use_dbms_capability => map { "_use_$_" } (@capabilities ) );
70
71 # on by default, not strictly a capability (pending rewrite)
72 __PACKAGE__->_use_join_optimizer (1);
73 sub _determine_supports_join_optimizer { 1 };
74
75 # Each of these methods need _determine_driver called before itself
76 # in order to function reliably. This is a purely DRY optimization
77 #
78 # get_(use)_dbms_capability need to be called on the correct Storage
79 # class, as _use_X may be hardcoded class-wide, and _supports_X calls
80 # _determine_supports_X which obv. needs a correct driver as well
81 my @rdbms_specific_methods = qw/
82   deployment_statements
83   sqlt_type
84   sql_maker
85   build_datetime_parser
86   datetime_parser_type
87
88   txn_begin
89   insert
90   insert_bulk
91   update
92   delete
93   select
94   select_single
95   with_deferred_fk_checks
96
97   get_use_dbms_capability
98   get_dbms_capability
99
100   _server_info
101   _get_server_version
102 /;
103
104 for my $meth (@rdbms_specific_methods) {
105
106   my $orig = __PACKAGE__->can ($meth)
107     or die "$meth is not a ::Storage::DBI method!";
108
109   no strict qw/refs/;
110   no warnings qw/redefine/;
111   *{__PACKAGE__ ."::$meth"} = subname $meth => sub {
112     if (
113       # only fire when invoked on an instance, a valid class-based invocation
114       # would e.g. be setting a default for an inherited accessor
115       ref $_[0]
116         and
117       ! $_[0]->_driver_determined
118         and
119       ! $_[0]->{_in_determine_driver}
120     ) {
121       $_[0]->_determine_driver;
122
123       # This for some reason crashes and burns on perl 5.8.1
124       # IFF the method ends up throwing an exception
125       #goto $_[0]->can ($meth);
126
127       my $cref = $_[0]->can ($meth);
128       goto $cref;
129     }
130
131     goto $orig;
132   };
133 }
134
135 =head1 NAME
136
137 DBIx::Class::Storage::DBI - DBI storage handler
138
139 =head1 SYNOPSIS
140
141   my $schema = MySchema->connect('dbi:SQLite:my.db');
142
143   $schema->storage->debug(1);
144
145   my @stuff = $schema->storage->dbh_do(
146     sub {
147       my ($storage, $dbh, @args) = @_;
148       $dbh->do("DROP TABLE authors");
149     },
150     @column_list
151   );
152
153   $schema->resultset('Book')->search({
154      written_on => $schema->storage->datetime_parser->format_datetime(DateTime->now)
155   });
156
157 =head1 DESCRIPTION
158
159 This class represents the connection to an RDBMS via L<DBI>.  See
160 L<DBIx::Class::Storage> for general information.  This pod only
161 documents DBI-specific methods and behaviors.
162
163 =head1 METHODS
164
165 =cut
166
167 sub new {
168   my $new = shift->next::method(@_);
169
170   $new->_sql_maker_opts({});
171   $new->_dbh_details({});
172   $new->{_in_do_block} = 0;
173   $new->{_dbh_gen} = 0;
174
175   # read below to see what this does
176   $new->_arm_global_destructor;
177
178   $new;
179 }
180
181 # This is hack to work around perl shooting stuff in random
182 # order on exit(). If we do not walk the remaining storage
183 # objects in an END block, there is a *small but real* chance
184 # of a fork()ed child to kill the parent's shared DBI handle,
185 # *before perl reaches the DESTROY in this package*
186 # Yes, it is ugly and effective.
187 # Additionally this registry is used by the CLONE method to
188 # make sure no handles are shared between threads
189 {
190   my %seek_and_destroy;
191
192   sub _arm_global_destructor {
193     my $self = shift;
194     my $key = refaddr ($self);
195     $seek_and_destroy{$key} = $self;
196     weaken ($seek_and_destroy{$key});
197   }
198
199   END {
200     local $?; # just in case the DBI destructor changes it somehow
201
202     # destroy just the object if not native to this process/thread
203     $_->_verify_pid for (grep
204       { defined $_ }
205       values %seek_and_destroy
206     );
207   }
208
209   sub CLONE {
210     # As per DBI's recommendation, DBIC disconnects all handles as
211     # soon as possible (DBIC will reconnect only on demand from within
212     # the thread)
213     for (values %seek_and_destroy) {
214       next unless $_;
215       $_->{_dbh_gen}++;  # so that existing cursors will drop as well
216       $_->_dbh(undef);
217
218       $_->transaction_depth(0);
219       $_->savepoints([]);
220     }
221   }
222 }
223
224 sub DESTROY {
225   my $self = shift;
226
227   # some databases spew warnings on implicit disconnect
228   local $SIG{__WARN__} = sub {};
229   $self->_dbh(undef);
230
231   # this op is necessary, since the very last perl runtime statement
232   # triggers a global destruction shootout, and the $SIG localization
233   # may very well be destroyed before perl actually gets to do the
234   # $dbh undef
235   1;
236 }
237
238 # handle pid changes correctly - do not destroy parent's connection
239 sub _verify_pid {
240   my $self = shift;
241
242   my $pid = $self->_conn_pid;
243   if( defined $pid and $pid != $$ and my $dbh = $self->_dbh ) {
244     $dbh->{InactiveDestroy} = 1;
245     $self->{_dbh_gen}++;
246     $self->_dbh(undef);
247     $self->transaction_depth(0);
248     $self->savepoints([]);
249   }
250
251   return;
252 }
253
254 =head2 connect_info
255
256 This method is normally called by L<DBIx::Class::Schema/connection>, which
257 encapsulates its argument list in an arrayref before passing them here.
258
259 The argument list may contain:
260
261 =over
262
263 =item *
264
265 The same 4-element argument set one would normally pass to
266 L<DBI/connect>, optionally followed by
267 L<extra attributes|/DBIx::Class specific connection attributes>
268 recognized by DBIx::Class:
269
270   $connect_info_args = [ $dsn, $user, $password, \%dbi_attributes?, \%extra_attributes? ];
271
272 =item *
273
274 A single code reference which returns a connected
275 L<DBI database handle|DBI/connect> optionally followed by
276 L<extra attributes|/DBIx::Class specific connection attributes> recognized
277 by DBIx::Class:
278
279   $connect_info_args = [ sub { DBI->connect (...) }, \%extra_attributes? ];
280
281 =item *
282
283 A single hashref with all the attributes and the dsn/user/password
284 mixed together:
285
286   $connect_info_args = [{
287     dsn => $dsn,
288     user => $user,
289     password => $pass,
290     %dbi_attributes,
291     %extra_attributes,
292   }];
293
294   $connect_info_args = [{
295     dbh_maker => sub { DBI->connect (...) },
296     %dbi_attributes,
297     %extra_attributes,
298   }];
299
300 This is particularly useful for L<Catalyst> based applications, allowing the
301 following config (L<Config::General> style):
302
303   <Model::DB>
304     schema_class   App::DB
305     <connect_info>
306       dsn          dbi:mysql:database=test
307       user         testuser
308       password     TestPass
309       AutoCommit   1
310     </connect_info>
311   </Model::DB>
312
313 The C<dsn>/C<user>/C<password> combination can be substituted by the
314 C<dbh_maker> key whose value is a coderef that returns a connected
315 L<DBI database handle|DBI/connect>
316
317 =back
318
319 Please note that the L<DBI> docs recommend that you always explicitly
320 set C<AutoCommit> to either I<0> or I<1>.  L<DBIx::Class> further
321 recommends that it be set to I<1>, and that you perform transactions
322 via our L<DBIx::Class::Schema/txn_do> method.  L<DBIx::Class> will set it
323 to I<1> if you do not do explicitly set it to zero.  This is the default
324 for most DBDs. See L</DBIx::Class and AutoCommit> for details.
325
326 =head3 DBIx::Class specific connection attributes
327
328 In addition to the standard L<DBI|DBI/ATTRIBUTES COMMON TO ALL HANDLES>
329 L<connection|DBI/Database Handle Attributes> attributes, DBIx::Class recognizes
330 the following connection options. These options can be mixed in with your other
331 L<DBI> connection attributes, or placed in a separate hashref
332 (C<\%extra_attributes>) as shown above.
333
334 Every time C<connect_info> is invoked, any previous settings for
335 these options will be cleared before setting the new ones, regardless of
336 whether any options are specified in the new C<connect_info>.
337
338
339 =over
340
341 =item on_connect_do
342
343 Specifies things to do immediately after connecting or re-connecting to
344 the database.  Its value may contain:
345
346 =over
347
348 =item a scalar
349
350 This contains one SQL statement to execute.
351
352 =item an array reference
353
354 This contains SQL statements to execute in order.  Each element contains
355 a string or a code reference that returns a string.
356
357 =item a code reference
358
359 This contains some code to execute.  Unlike code references within an
360 array reference, its return value is ignored.
361
362 =back
363
364 =item on_disconnect_do
365
366 Takes arguments in the same form as L</on_connect_do> and executes them
367 immediately before disconnecting from the database.
368
369 Note, this only runs if you explicitly call L</disconnect> on the
370 storage object.
371
372 =item on_connect_call
373
374 A more generalized form of L</on_connect_do> that calls the specified
375 C<connect_call_METHOD> methods in your storage driver.
376
377   on_connect_do => 'select 1'
378
379 is equivalent to:
380
381   on_connect_call => [ [ do_sql => 'select 1' ] ]
382
383 Its values may contain:
384
385 =over
386
387 =item a scalar
388
389 Will call the C<connect_call_METHOD> method.
390
391 =item a code reference
392
393 Will execute C<< $code->($storage) >>
394
395 =item an array reference
396
397 Each value can be a method name or code reference.
398
399 =item an array of arrays
400
401 For each array, the first item is taken to be the C<connect_call_> method name
402 or code reference, and the rest are parameters to it.
403
404 =back
405
406 Some predefined storage methods you may use:
407
408 =over
409
410 =item do_sql
411
412 Executes a SQL string or a code reference that returns a SQL string. This is
413 what L</on_connect_do> and L</on_disconnect_do> use.
414
415 It can take:
416
417 =over
418
419 =item a scalar
420
421 Will execute the scalar as SQL.
422
423 =item an arrayref
424
425 Taken to be arguments to L<DBI/do>, the SQL string optionally followed by the
426 attributes hashref and bind values.
427
428 =item a code reference
429
430 Will execute C<< $code->($storage) >> and execute the return array refs as
431 above.
432
433 =back
434
435 =item datetime_setup
436
437 Execute any statements necessary to initialize the database session to return
438 and accept datetime/timestamp values used with
439 L<DBIx::Class::InflateColumn::DateTime>.
440
441 Only necessary for some databases, see your specific storage driver for
442 implementation details.
443
444 =back
445
446 =item on_disconnect_call
447
448 Takes arguments in the same form as L</on_connect_call> and executes them
449 immediately before disconnecting from the database.
450
451 Calls the C<disconnect_call_METHOD> methods as opposed to the
452 C<connect_call_METHOD> methods called by L</on_connect_call>.
453
454 Note, this only runs if you explicitly call L</disconnect> on the
455 storage object.
456
457 =item disable_sth_caching
458
459 If set to a true value, this option will disable the caching of
460 statement handles via L<DBI/prepare_cached>.
461
462 =item limit_dialect
463
464 Sets a specific SQL::Abstract::Limit-style limit dialect, overriding the
465 default L</sql_limit_dialect> setting of the storage (if any). For a list
466 of available limit dialects see L<DBIx::Class::SQLMaker::LimitDialects>.
467
468 =item quote_names
469
470 When true automatically sets L</quote_char> and L</name_sep> to the characters
471 appropriate for your particular RDBMS. This option is preferred over specifying
472 L</quote_char> directly.
473
474 =item quote_char
475
476 Specifies what characters to use to quote table and column names.
477
478 C<quote_char> expects either a single character, in which case is it
479 is placed on either side of the table/column name, or an arrayref of length
480 2 in which case the table/column name is placed between the elements.
481
482 For example under MySQL you should use C<< quote_char => '`' >>, and for
483 SQL Server you should use C<< quote_char => [qw/[ ]/] >>.
484
485 =item name_sep
486
487 This parameter is only useful in conjunction with C<quote_char>, and is used to
488 specify the character that separates elements (schemas, tables, columns) from
489 each other. If unspecified it defaults to the most commonly used C<.>.
490
491 =item unsafe
492
493 This Storage driver normally installs its own C<HandleError>, sets
494 C<RaiseError> and C<ShowErrorStatement> on, and sets C<PrintError> off on
495 all database handles, including those supplied by a coderef.  It does this
496 so that it can have consistent and useful error behavior.
497
498 If you set this option to a true value, Storage will not do its usual
499 modifications to the database handle's attributes, and instead relies on
500 the settings in your connect_info DBI options (or the values you set in
501 your connection coderef, in the case that you are connecting via coderef).
502
503 Note that your custom settings can cause Storage to malfunction,
504 especially if you set a C<HandleError> handler that suppresses exceptions
505 and/or disable C<RaiseError>.
506
507 =item auto_savepoint
508
509 If this option is true, L<DBIx::Class> will use savepoints when nesting
510 transactions, making it possible to recover from failure in the inner
511 transaction without having to abort all outer transactions.
512
513 =item cursor_class
514
515 Use this argument to supply a cursor class other than the default
516 L<DBIx::Class::Storage::DBI::Cursor>.
517
518 =back
519
520 Some real-life examples of arguments to L</connect_info> and
521 L<DBIx::Class::Schema/connect>
522
523   # Simple SQLite connection
524   ->connect_info([ 'dbi:SQLite:./foo.db' ]);
525
526   # Connect via subref
527   ->connect_info([ sub { DBI->connect(...) } ]);
528
529   # Connect via subref in hashref
530   ->connect_info([{
531     dbh_maker => sub { DBI->connect(...) },
532     on_connect_do => 'alter session ...',
533   }]);
534
535   # A bit more complicated
536   ->connect_info(
537     [
538       'dbi:Pg:dbname=foo',
539       'postgres',
540       'my_pg_password',
541       { AutoCommit => 1 },
542       { quote_char => q{"} },
543     ]
544   );
545
546   # Equivalent to the previous example
547   ->connect_info(
548     [
549       'dbi:Pg:dbname=foo',
550       'postgres',
551       'my_pg_password',
552       { AutoCommit => 1, quote_char => q{"}, name_sep => q{.} },
553     ]
554   );
555
556   # Same, but with hashref as argument
557   # See parse_connect_info for explanation
558   ->connect_info(
559     [{
560       dsn         => 'dbi:Pg:dbname=foo',
561       user        => 'postgres',
562       password    => 'my_pg_password',
563       AutoCommit  => 1,
564       quote_char  => q{"},
565       name_sep    => q{.},
566     }]
567   );
568
569   # Subref + DBIx::Class-specific connection options
570   ->connect_info(
571     [
572       sub { DBI->connect(...) },
573       {
574           quote_char => q{`},
575           name_sep => q{@},
576           on_connect_do => ['SET search_path TO myschema,otherschema,public'],
577           disable_sth_caching => 1,
578       },
579     ]
580   );
581
582
583
584 =cut
585
586 sub connect_info {
587   my ($self, $info) = @_;
588
589   return $self->_connect_info if !$info;
590
591   $self->_connect_info($info); # copy for _connect_info
592
593   $info = $self->_normalize_connect_info($info)
594     if ref $info eq 'ARRAY';
595
596   for my $storage_opt (keys %{ $info->{storage_options} }) {
597     my $value = $info->{storage_options}{$storage_opt};
598
599     $self->$storage_opt($value);
600   }
601
602   # Kill sql_maker/_sql_maker_opts, so we get a fresh one with only
603   #  the new set of options
604   $self->_sql_maker(undef);
605   $self->_sql_maker_opts({});
606
607   for my $sql_maker_opt (keys %{ $info->{sql_maker_options} }) {
608     my $value = $info->{sql_maker_options}{$sql_maker_opt};
609
610     $self->_sql_maker_opts->{$sql_maker_opt} = $value;
611   }
612
613   my %attrs = (
614     %{ $self->_default_dbi_connect_attributes || {} },
615     %{ $info->{attributes} || {} },
616   );
617
618   my @args = @{ $info->{arguments} };
619
620   if (keys %attrs and ref $args[0] ne 'CODE') {
621     carp
622         'You provided explicit AutoCommit => 0 in your connection_info. '
623       . 'This is almost universally a bad idea (see the footnotes of '
624       . 'DBIx::Class::Storage::DBI for more info). If you still want to '
625       . 'do this you can set $ENV{DBIC_UNSAFE_AUTOCOMMIT_OK} to disable '
626       . 'this warning.'
627       if ! $attrs{AutoCommit} and ! $ENV{DBIC_UNSAFE_AUTOCOMMIT_OK};
628
629     push @args, \%attrs if keys %attrs;
630   }
631   $self->_dbi_connect_info(\@args);
632
633   # FIXME - dirty:
634   # save attributes them in a separate accessor so they are always
635   # introspectable, even in case of a CODE $dbhmaker
636   $self->_dbic_connect_attributes (\%attrs);
637
638   return $self->_connect_info;
639 }
640
641 sub _normalize_connect_info {
642   my ($self, $info_arg) = @_;
643   my %info;
644
645   my @args = @$info_arg;  # take a shallow copy for further mutilation
646
647   # combine/pre-parse arguments depending on invocation style
648
649   my %attrs;
650   if (ref $args[0] eq 'CODE') {     # coderef with optional \%extra_attributes
651     %attrs = %{ $args[1] || {} };
652     @args = $args[0];
653   }
654   elsif (ref $args[0] eq 'HASH') { # single hashref (i.e. Catalyst config)
655     %attrs = %{$args[0]};
656     @args = ();
657     if (my $code = delete $attrs{dbh_maker}) {
658       @args = $code;
659
660       my @ignored = grep { delete $attrs{$_} } (qw/dsn user password/);
661       if (@ignored) {
662         carp sprintf (
663             'Attribute(s) %s in connect_info were ignored, as they can not be applied '
664           . "to the result of 'dbh_maker'",
665
666           join (', ', map { "'$_'" } (@ignored) ),
667         );
668       }
669     }
670     else {
671       @args = delete @attrs{qw/dsn user password/};
672     }
673   }
674   else {                # otherwise assume dsn/user/password + \%attrs + \%extra_attrs
675     %attrs = (
676       % { $args[3] || {} },
677       % { $args[4] || {} },
678     );
679     @args = @args[0,1,2];
680   }
681
682   $info{arguments} = \@args;
683
684   my @storage_opts = grep exists $attrs{$_},
685     @storage_options, 'cursor_class';
686
687   @{ $info{storage_options} }{@storage_opts} =
688     delete @attrs{@storage_opts} if @storage_opts;
689
690   my @sql_maker_opts = grep exists $attrs{$_},
691     qw/limit_dialect quote_char name_sep quote_names/;
692
693   @{ $info{sql_maker_options} }{@sql_maker_opts} =
694     delete @attrs{@sql_maker_opts} if @sql_maker_opts;
695
696   $info{attributes} = \%attrs if %attrs;
697
698   return \%info;
699 }
700
701 sub _default_dbi_connect_attributes () {
702   +{
703     AutoCommit => 1,
704     PrintError => 0,
705     RaiseError => 1,
706     ShowErrorStatement => 1,
707   };
708 }
709
710 =head2 on_connect_do
711
712 This method is deprecated in favour of setting via L</connect_info>.
713
714 =cut
715
716 =head2 on_disconnect_do
717
718 This method is deprecated in favour of setting via L</connect_info>.
719
720 =cut
721
722 sub _parse_connect_do {
723   my ($self, $type) = @_;
724
725   my $val = $self->$type;
726   return () if not defined $val;
727
728   my @res;
729
730   if (not ref($val)) {
731     push @res, [ 'do_sql', $val ];
732   } elsif (ref($val) eq 'CODE') {
733     push @res, $val;
734   } elsif (ref($val) eq 'ARRAY') {
735     push @res, map { [ 'do_sql', $_ ] } @$val;
736   } else {
737     $self->throw_exception("Invalid type for $type: ".ref($val));
738   }
739
740   return \@res;
741 }
742
743 =head2 dbh_do
744
745 Arguments: ($subref | $method_name), @extra_coderef_args?
746
747 Execute the given $subref or $method_name using the new exception-based
748 connection management.
749
750 The first two arguments will be the storage object that C<dbh_do> was called
751 on and a database handle to use.  Any additional arguments will be passed
752 verbatim to the called subref as arguments 2 and onwards.
753
754 Using this (instead of $self->_dbh or $self->dbh) ensures correct
755 exception handling and reconnection (or failover in future subclasses).
756
757 Your subref should have no side-effects outside of the database, as
758 there is the potential for your subref to be partially double-executed
759 if the database connection was stale/dysfunctional.
760
761 Example:
762
763   my @stuff = $schema->storage->dbh_do(
764     sub {
765       my ($storage, $dbh, @cols) = @_;
766       my $cols = join(q{, }, @cols);
767       $dbh->selectrow_array("SELECT $cols FROM foo");
768     },
769     @column_list
770   );
771
772 =cut
773
774 sub dbh_do {
775   my $self = shift;
776   my $code = shift;
777
778   my $dbh = $self->_get_dbh;
779
780   return $self->$code($dbh, @_)
781     if ( $self->{_in_do_block} || $self->{transaction_depth} );
782
783   local $self->{_in_do_block} = 1;
784
785   # take a ref instead of a copy, to preserve coderef @_ aliasing semantics
786   my $args = \@_;
787
788   try {
789     $self->$code ($dbh, @$args);
790   } catch {
791     $self->throw_exception($_) if $self->connected;
792
793     # We were not connected - reconnect and retry, but let any
794     #  exception fall right through this time
795     carp "Retrying dbh_do($code) after catching disconnected exception: $_"
796       if $ENV{DBIC_STORAGE_RETRY_DEBUG};
797
798     $self->_populate_dbh;
799     $self->$code($self->_dbh, @$args);
800   };
801 }
802
803 sub txn_do {
804   # connects or reconnects on pid change, necessary to grab correct txn_depth
805   $_[0]->_get_dbh;
806   local $_[0]->{_in_do_block} = 1;
807   shift->next::method(@_);
808 }
809
810 =head2 disconnect
811
812 Our C<disconnect> method also performs a rollback first if the
813 database is not in C<AutoCommit> mode.
814
815 =cut
816
817 sub disconnect {
818   my ($self) = @_;
819
820   if( $self->_dbh ) {
821     my @actions;
822
823     push @actions, ( $self->on_disconnect_call || () );
824     push @actions, $self->_parse_connect_do ('on_disconnect_do');
825
826     $self->_do_connection_actions(disconnect_call_ => $_) for @actions;
827
828     # stops the "implicit rollback on disconnect" warning
829     $self->_exec_txn_rollback unless $self->_dbh_autocommit;
830
831     %{ $self->_dbh->{CachedKids} } = ();
832     $self->_dbh->disconnect;
833     $self->_dbh(undef);
834     $self->{_dbh_gen}++;
835   }
836 }
837
838 =head2 with_deferred_fk_checks
839
840 =over 4
841
842 =item Arguments: C<$coderef>
843
844 =item Return Value: The return value of $coderef
845
846 =back
847
848 Storage specific method to run the code ref with FK checks deferred or
849 in MySQL's case disabled entirely.
850
851 =cut
852
853 # Storage subclasses should override this
854 sub with_deferred_fk_checks {
855   my ($self, $sub) = @_;
856   $sub->();
857 }
858
859 =head2 connected
860
861 =over
862
863 =item Arguments: none
864
865 =item Return Value: 1|0
866
867 =back
868
869 Verifies that the current database handle is active and ready to execute
870 an SQL statement (e.g. the connection did not get stale, server is still
871 answering, etc.) This method is used internally by L</dbh>.
872
873 =cut
874
875 sub connected {
876   my $self = shift;
877   return 0 unless $self->_seems_connected;
878
879   #be on the safe side
880   local $self->_dbh->{RaiseError} = 1;
881
882   return $self->_ping;
883 }
884
885 sub _seems_connected {
886   my $self = shift;
887
888   $self->_verify_pid;
889
890   my $dbh = $self->_dbh
891     or return 0;
892
893   return $dbh->FETCH('Active');
894 }
895
896 sub _ping {
897   my $self = shift;
898
899   my $dbh = $self->_dbh or return 0;
900
901   return $dbh->ping;
902 }
903
904 sub ensure_connected {
905   my ($self) = @_;
906
907   unless ($self->connected) {
908     $self->_populate_dbh;
909   }
910 }
911
912 =head2 dbh
913
914 Returns a C<$dbh> - a data base handle of class L<DBI>. The returned handle
915 is guaranteed to be healthy by implicitly calling L</connected>, and if
916 necessary performing a reconnection before returning. Keep in mind that this
917 is very B<expensive> on some database engines. Consider using L</dbh_do>
918 instead.
919
920 =cut
921
922 sub dbh {
923   my ($self) = @_;
924
925   if (not $self->_dbh) {
926     $self->_populate_dbh;
927   } else {
928     $self->ensure_connected;
929   }
930   return $self->_dbh;
931 }
932
933 # this is the internal "get dbh or connect (don't check)" method
934 sub _get_dbh {
935   my $self = shift;
936   $self->_verify_pid;
937   $self->_populate_dbh unless $self->_dbh;
938   return $self->_dbh;
939 }
940
941 sub sql_maker {
942   my ($self) = @_;
943   unless ($self->_sql_maker) {
944     my $sql_maker_class = $self->sql_maker_class;
945
946     my %opts = %{$self->_sql_maker_opts||{}};
947     my $dialect =
948       $opts{limit_dialect}
949         ||
950       $self->sql_limit_dialect
951         ||
952       do {
953         my $s_class = (ref $self) || $self;
954         carp (
955           "Your storage class ($s_class) does not set sql_limit_dialect and you "
956         . 'have not supplied an explicit limit_dialect in your connection_info. '
957         . 'DBIC will attempt to use the GenericSubQ dialect, which works on most '
958         . 'databases but can be (and often is) painfully slow. '
959         . "Please file an RT ticket against '$s_class' ."
960         );
961
962         'GenericSubQ';
963       }
964     ;
965
966     my ($quote_char, $name_sep);
967
968     if ($opts{quote_names}) {
969       $quote_char = (delete $opts{quote_char}) || $self->sql_quote_char || do {
970         my $s_class = (ref $self) || $self;
971         carp (
972           "You requested 'quote_names' but your storage class ($s_class) does "
973         . 'not explicitly define a default sql_quote_char and you have not '
974         . 'supplied a quote_char as part of your connection_info. DBIC will '
975         .q{default to the ANSI SQL standard quote '"', which works most of }
976         . "the time. Please file an RT ticket against '$s_class'."
977         );
978
979         '"'; # RV
980       };
981
982       $name_sep = (delete $opts{name_sep}) || $self->sql_name_sep;
983     }
984
985     $self->_sql_maker($sql_maker_class->new(
986       bindtype=>'columns',
987       array_datatypes => 1,
988       limit_dialect => $dialect,
989       ($quote_char ? (quote_char => $quote_char) : ()),
990       name_sep => ($name_sep || '.'),
991       %opts,
992     ));
993   }
994   return $self->_sql_maker;
995 }
996
997 # nothing to do by default
998 sub _rebless {}
999 sub _init {}
1000
1001 sub _populate_dbh {
1002   my ($self) = @_;
1003
1004   my @info = @{$self->_dbi_connect_info || []};
1005   $self->_dbh(undef); # in case ->connected failed we might get sent here
1006   $self->_dbh_details({}); # reset everything we know
1007
1008   $self->_dbh($self->_connect(@info));
1009
1010   $self->_conn_pid($$) if $^O ne 'MSWin32'; # on win32 these are in fact threads
1011
1012   $self->_determine_driver;
1013
1014   # Always set the transaction depth on connect, since
1015   #  there is no transaction in progress by definition
1016   $self->{transaction_depth} = $self->_dbh_autocommit ? 0 : 1;
1017
1018   $self->_run_connection_actions unless $self->{_in_determine_driver};
1019 }
1020
1021 sub _run_connection_actions {
1022   my $self = shift;
1023   my @actions;
1024
1025   push @actions, ( $self->on_connect_call || () );
1026   push @actions, $self->_parse_connect_do ('on_connect_do');
1027
1028   $self->_do_connection_actions(connect_call_ => $_) for @actions;
1029 }
1030
1031
1032
1033 sub set_use_dbms_capability {
1034   $_[0]->set_inherited ($_[1], $_[2]);
1035 }
1036
1037 sub get_use_dbms_capability {
1038   my ($self, $capname) = @_;
1039
1040   my $use = $self->get_inherited ($capname);
1041   return defined $use
1042     ? $use
1043     : do { $capname =~ s/^_use_/_supports_/; $self->get_dbms_capability ($capname) }
1044   ;
1045 }
1046
1047 sub set_dbms_capability {
1048   $_[0]->_dbh_details->{capability}{$_[1]} = $_[2];
1049 }
1050
1051 sub get_dbms_capability {
1052   my ($self, $capname) = @_;
1053
1054   my $cap = $self->_dbh_details->{capability}{$capname};
1055
1056   unless (defined $cap) {
1057     if (my $meth = $self->can ("_determine$capname")) {
1058       $cap = $self->$meth ? 1 : 0;
1059     }
1060     else {
1061       $cap = 0;
1062     }
1063
1064     $self->set_dbms_capability ($capname, $cap);
1065   }
1066
1067   return $cap;
1068 }
1069
1070 sub _server_info {
1071   my $self = shift;
1072
1073   my $info;
1074   unless ($info = $self->_dbh_details->{info}) {
1075
1076     $info = {};
1077
1078     my $server_version = try { $self->_get_server_version };
1079
1080     if (defined $server_version) {
1081       $info->{dbms_version} = $server_version;
1082
1083       my ($numeric_version) = $server_version =~ /^([\d\.]+)/;
1084       my @verparts = split (/\./, $numeric_version);
1085       if (
1086         @verparts
1087           &&
1088         $verparts[0] <= 999
1089       ) {
1090         # consider only up to 3 version parts, iff not more than 3 digits
1091         my @use_parts;
1092         while (@verparts && @use_parts < 3) {
1093           my $p = shift @verparts;
1094           last if $p > 999;
1095           push @use_parts, $p;
1096         }
1097         push @use_parts, 0 while @use_parts < 3;
1098
1099         $info->{normalized_dbms_version} = sprintf "%d.%03d%03d", @use_parts;
1100       }
1101     }
1102
1103     $self->_dbh_details->{info} = $info;
1104   }
1105
1106   return $info;
1107 }
1108
1109 sub _get_server_version {
1110   shift->_dbh_get_info(18);
1111 }
1112
1113 sub _dbh_get_info {
1114   my ($self, $info) = @_;
1115
1116   return try { $self->_get_dbh->get_info($info) } || undef;
1117 }
1118
1119 sub _determine_driver {
1120   my ($self) = @_;
1121
1122   if ((not $self->_driver_determined) && (not $self->{_in_determine_driver})) {
1123     my $started_connected = 0;
1124     local $self->{_in_determine_driver} = 1;
1125
1126     if (ref($self) eq __PACKAGE__) {
1127       my $driver;
1128       if ($self->_dbh) { # we are connected
1129         $driver = $self->_dbh->{Driver}{Name};
1130         $started_connected = 1;
1131       } else {
1132         # if connect_info is a CODEREF, we have no choice but to connect
1133         if (ref $self->_dbi_connect_info->[0] &&
1134             reftype $self->_dbi_connect_info->[0] eq 'CODE') {
1135           $self->_populate_dbh;
1136           $driver = $self->_dbh->{Driver}{Name};
1137         }
1138         else {
1139           # try to use dsn to not require being connected, the driver may still
1140           # force a connection in _rebless to determine version
1141           # (dsn may not be supplied at all if all we do is make a mock-schema)
1142           my $dsn = $self->_dbi_connect_info->[0] || $ENV{DBI_DSN} || '';
1143           ($driver) = $dsn =~ /dbi:([^:]+):/i;
1144           $driver ||= $ENV{DBI_DRIVER};
1145         }
1146       }
1147
1148       if ($driver) {
1149         my $storage_class = "DBIx::Class::Storage::DBI::${driver}";
1150         if ($self->load_optional_class($storage_class)) {
1151           mro::set_mro($storage_class, 'c3');
1152           bless $self, $storage_class;
1153           $self->_rebless();
1154         }
1155       }
1156     }
1157
1158     $self->_driver_determined(1);
1159
1160     Class::C3->reinitialize() if DBIx::Class::_ENV_::OLD_MRO;
1161
1162     $self->_init; # run driver-specific initializations
1163
1164     $self->_run_connection_actions
1165         if !$started_connected && defined $self->_dbh;
1166   }
1167 }
1168
1169 sub _do_connection_actions {
1170   my $self          = shift;
1171   my $method_prefix = shift;
1172   my $call          = shift;
1173
1174   if (not ref($call)) {
1175     my $method = $method_prefix . $call;
1176     $self->$method(@_);
1177   } elsif (ref($call) eq 'CODE') {
1178     $self->$call(@_);
1179   } elsif (ref($call) eq 'ARRAY') {
1180     if (ref($call->[0]) ne 'ARRAY') {
1181       $self->_do_connection_actions($method_prefix, $_) for @$call;
1182     } else {
1183       $self->_do_connection_actions($method_prefix, @$_) for @$call;
1184     }
1185   } else {
1186     $self->throw_exception (sprintf ("Don't know how to process conection actions of type '%s'", ref($call)) );
1187   }
1188
1189   return $self;
1190 }
1191
1192 sub connect_call_do_sql {
1193   my $self = shift;
1194   $self->_do_query(@_);
1195 }
1196
1197 sub disconnect_call_do_sql {
1198   my $self = shift;
1199   $self->_do_query(@_);
1200 }
1201
1202 # override in db-specific backend when necessary
1203 sub connect_call_datetime_setup { 1 }
1204
1205 sub _do_query {
1206   my ($self, $action) = @_;
1207
1208   if (ref $action eq 'CODE') {
1209     $action = $action->($self);
1210     $self->_do_query($_) foreach @$action;
1211   }
1212   else {
1213     # Most debuggers expect ($sql, @bind), so we need to exclude
1214     # the attribute hash which is the second argument to $dbh->do
1215     # furthermore the bind values are usually to be presented
1216     # as named arrayref pairs, so wrap those here too
1217     my @do_args = (ref $action eq 'ARRAY') ? (@$action) : ($action);
1218     my $sql = shift @do_args;
1219     my $attrs = shift @do_args;
1220     my @bind = map { [ undef, $_ ] } @do_args;
1221
1222     $self->_query_start($sql, \@bind);
1223     $self->_get_dbh->do($sql, $attrs, @do_args);
1224     $self->_query_end($sql, \@bind);
1225   }
1226
1227   return $self;
1228 }
1229
1230 sub _connect {
1231   my ($self, @info) = @_;
1232
1233   $self->throw_exception("You failed to provide any connection info")
1234     if !@info;
1235
1236   my ($old_connect_via, $dbh);
1237
1238   if ($INC{'Apache/DBI.pm'} && $ENV{MOD_PERL}) {
1239     $old_connect_via = $DBI::connect_via;
1240     $DBI::connect_via = 'connect';
1241   }
1242
1243   try {
1244     if(ref $info[0] eq 'CODE') {
1245       $dbh = $info[0]->();
1246     }
1247     else {
1248       require DBI;
1249       $dbh = DBI->connect(@info);
1250     }
1251
1252     if (!$dbh) {
1253       die $DBI::errstr;
1254     }
1255
1256     unless ($self->unsafe) {
1257
1258       $self->throw_exception(
1259         'Refusing clobbering of {HandleError} installed on externally supplied '
1260        ."DBI handle $dbh. Either remove the handler or use the 'unsafe' attribute."
1261       ) if $dbh->{HandleError} and ref $dbh->{HandleError} ne '__DBIC__DBH__ERROR__HANDLER__';
1262
1263       # Default via _default_dbi_connect_attributes is 1, hence it was an explicit
1264       # request, or an external handle. Complain and set anyway
1265       unless ($dbh->{RaiseError}) {
1266         carp( ref $info[0] eq 'CODE'
1267
1268           ? "The 'RaiseError' of the externally supplied DBI handle is set to false. "
1269            ."DBIx::Class will toggle it back to true, unless the 'unsafe' connect "
1270            .'attribute has been supplied'
1271
1272           : 'RaiseError => 0 supplied in your connection_info, without an explicit '
1273            .'unsafe => 1. Toggling RaiseError back to true'
1274         );
1275
1276         $dbh->{RaiseError} = 1;
1277       }
1278
1279       # this odd anonymous coderef dereference is in fact really
1280       # necessary to avoid the unwanted effect described in perl5
1281       # RT#75792
1282       sub {
1283         my $weak_self = $_[0];
1284         weaken $weak_self;
1285
1286         # the coderef is blessed so we can distinguish it from externally
1287         # supplied handles (which must be preserved)
1288         $_[1]->{HandleError} = bless sub {
1289           if ($weak_self) {
1290             $weak_self->throw_exception("DBI Exception: $_[0]");
1291           }
1292           else {
1293             # the handler may be invoked by something totally out of
1294             # the scope of DBIC
1295             DBIx::Class::Exception->throw("DBI Exception (unhandled by DBIC, ::Schema GCed): $_[0]");
1296           }
1297         }, '__DBIC__DBH__ERROR__HANDLER__';
1298       }->($self, $dbh);
1299     }
1300   }
1301   catch {
1302     $self->throw_exception("DBI Connection failed: $_")
1303   }
1304   finally {
1305     $DBI::connect_via = $old_connect_via if $old_connect_via;
1306   };
1307
1308   $self->_dbh_autocommit($dbh->{AutoCommit});
1309   $dbh;
1310 }
1311
1312 sub txn_begin {
1313   my $self = shift;
1314
1315   # this means we have not yet connected and do not know the AC status
1316   # (e.g. coderef $dbh), need a full-fledged connection check
1317   if (! defined $self->_dbh_autocommit) {
1318     $self->ensure_connected;
1319   }
1320   # Otherwise simply connect or re-connect on pid changes
1321   else {
1322     $self->_get_dbh;
1323   }
1324
1325   $self->next::method(@_);
1326 }
1327
1328 sub _exec_txn_begin {
1329   my $self = shift;
1330
1331   # if the user is utilizing txn_do - good for him, otherwise we need to
1332   # ensure that the $dbh is healthy on BEGIN.
1333   # We do this via ->dbh_do instead of ->dbh, so that the ->dbh "ping"
1334   # will be replaced by a failure of begin_work itself (which will be
1335   # then retried on reconnect)
1336   if ($self->{_in_do_block}) {
1337     $self->_dbh->begin_work;
1338   } else {
1339     $self->dbh_do(sub { $_[1]->begin_work });
1340   }
1341 }
1342
1343 sub txn_commit {
1344   my $self = shift;
1345
1346   $self->_verify_pid if $self->_dbh;
1347   $self->throw_exception("Unable to txn_commit() on a disconnected storage")
1348     unless $self->_dbh;
1349
1350   # esoteric case for folks using external $dbh handles
1351   if (! $self->transaction_depth and ! $self->_dbh->FETCH('AutoCommit') ) {
1352     carp "Storage transaction_depth 0 does not match "
1353         ."false AutoCommit of $self->{_dbh}, attempting COMMIT anyway";
1354     $self->transaction_depth(1);
1355   }
1356
1357   $self->next::method(@_);
1358
1359   # if AutoCommit is disabled txn_depth never goes to 0
1360   # as a new txn is started immediately on commit
1361   $self->transaction_depth(1) if (
1362     !$self->transaction_depth
1363       and
1364     defined $self->_dbh_autocommit
1365       and
1366     ! $self->_dbh_autocommit
1367   );
1368 }
1369
1370 sub _exec_txn_commit {
1371   shift->_dbh->commit;
1372 }
1373
1374 sub txn_rollback {
1375   my $self = shift;
1376
1377   $self->_verify_pid if $self->_dbh;
1378   $self->throw_exception("Unable to txn_rollback() on a disconnected storage")
1379     unless $self->_dbh;
1380
1381   # esoteric case for folks using external $dbh handles
1382   if (! $self->transaction_depth and ! $self->_dbh->FETCH('AutoCommit') ) {
1383     carp "Storage transaction_depth 0 does not match "
1384         ."false AutoCommit of $self->{_dbh}, attempting ROLLBACK anyway";
1385     $self->transaction_depth(1);
1386   }
1387
1388   $self->next::method(@_);
1389
1390   # if AutoCommit is disabled txn_depth never goes to 0
1391   # as a new txn is started immediately on commit
1392   $self->transaction_depth(1) if (
1393     !$self->transaction_depth
1394       and
1395     defined $self->_dbh_autocommit
1396       and
1397     ! $self->_dbh_autocommit
1398   );
1399 }
1400
1401 sub _exec_txn_rollback {
1402   shift->_dbh->rollback;
1403 }
1404
1405 # generate some identical methods
1406 for my $meth (qw/svp_begin svp_release svp_rollback/) {
1407   no strict qw/refs/;
1408   *{__PACKAGE__ ."::$meth"} = subname $meth => sub {
1409     my $self = shift;
1410     $self->_verify_pid if $self->_dbh;
1411     $self->throw_exception("Unable to $meth() on a disconnected storage")
1412       unless $self->_dbh;
1413     $self->next::method(@_);
1414   };
1415 }
1416
1417 # This used to be the top-half of _execute.  It was split out to make it
1418 #  easier to override in NoBindVars without duping the rest.  It takes up
1419 #  all of _execute's args, and emits $sql, @bind.
1420 sub _prep_for_execute {
1421   #my ($self, $op, $ident, $args) = @_;
1422   return shift->_gen_sql_bind(@_)
1423 }
1424
1425 sub _gen_sql_bind {
1426   my ($self, $op, $ident, $args) = @_;
1427
1428   my ($sql, @bind) = $self->sql_maker->$op(
1429     blessed($ident) ? $ident->from : $ident,
1430     @$args,
1431   );
1432
1433   my (@final_bind, $colinfos);
1434   my $resolve_bindinfo = sub {
1435     $colinfos ||= $self->_resolve_column_info($ident);
1436     if (my $col = $_[1]->{dbic_colname}) {
1437       $_[1]->{sqlt_datatype} ||= $colinfos->{$col}{data_type}
1438         if $colinfos->{$col}{data_type};
1439       $_[1]->{sqlt_size} ||= $colinfos->{$col}{size}
1440         if $colinfos->{$col}{size};
1441     }
1442     $_[1];
1443   };
1444
1445   for my $e (@{$args->[2]{bind}||[]}, @bind) {
1446     push @final_bind, [ do {
1447       if (ref $e ne 'ARRAY') {
1448         ({}, $e)
1449       }
1450       elsif (! defined $e->[0]) {
1451         ({}, $e->[1])
1452       }
1453       elsif (ref $e->[0] eq 'HASH') {
1454         (
1455           (first { $e->[0]{$_} } qw/dbd_attrs sqlt_datatype/) ? $e->[0] : $self->$resolve_bindinfo($e->[0]),
1456           $e->[1]
1457         )
1458       }
1459       elsif (ref $e->[0] eq 'SCALAR') {
1460         ( { sqlt_datatype => ${$e->[0]} }, $e->[1] )
1461       }
1462       else {
1463         ( $self->$resolve_bindinfo({ dbic_colname => $e->[0] }), $e->[1] )
1464       }
1465     }];
1466   }
1467
1468   if (
1469     ! $ENV{DBIC_DT_SEARCH_OK}
1470       and
1471     $op eq 'select'
1472       and
1473     first { blessed($_->[1]) && $_->[1]->isa('DateTime') } @final_bind) {
1474
1475     carp_unique 'DateTime objects passed to search() are not supported '
1476       . 'properly (InflateColumn::DateTime formats and settings are not '
1477       . 'respected.) See "Formatting DateTime objects in queries" in '
1478       . 'DBIx::Class::Manual::Cookbook. To disable this warning for good '
1479       . 'set $ENV{DBIC_DT_SEARCH_OK} to true'
1480   }
1481
1482   ($sql, \@final_bind);
1483 }
1484
1485 sub _format_for_trace {
1486   #my ($self, $bind) = @_;
1487
1488   ### Turn @bind from something like this:
1489   ###   ( [ "artist", 1 ], [ \%attrs, 3 ] )
1490   ### to this:
1491   ###   ( "'1'", "'3'" )
1492
1493   map {
1494     defined( $_ && $_->[1] )
1495       ? qq{'$_->[1]'}
1496       : q{NULL}
1497   } @{$_[1] || []};
1498 }
1499
1500 sub _query_start {
1501   my ( $self, $sql, $bind ) = @_;
1502
1503   $self->debugobj->query_start( $sql, $self->_format_for_trace($bind) )
1504     if $self->debug;
1505 }
1506
1507 sub _query_end {
1508   my ( $self, $sql, $bind ) = @_;
1509
1510   $self->debugobj->query_end( $sql, $self->_format_for_trace($bind) )
1511     if $self->debug;
1512 }
1513
1514 my $sba_compat;
1515 sub _dbi_attrs_for_bind {
1516   my ($self, $ident, $bind) = @_;
1517
1518   if (! defined $sba_compat) {
1519     $self->_determine_driver;
1520     $sba_compat = $self->can('source_bind_attributes') == \&source_bind_attributes
1521       ? 0
1522       : 1
1523     ;
1524   }
1525
1526   my $sba_attrs;
1527   if ($sba_compat) {
1528     my $class = ref $self;
1529     carp_unique (
1530       "The source_bind_attributes() override in $class relies on a deprecated codepath. "
1531      .'You are strongly advised to switch your code to override bind_attribute_by_datatype() '
1532      .'instead. This legacy compat shim will also disappear some time before DBIC 0.09'
1533     );
1534
1535     my $sba_attrs = $self->source_bind_attributes
1536   }
1537
1538   my @attrs;
1539
1540   for (map { $_->[0] } @$bind) {
1541     push @attrs, do {
1542       if (exists $_->{dbd_attrs}) {
1543         $_->{dbd_attrs}
1544       }
1545       elsif($_->{sqlt_datatype}) {
1546         # cache the result in the dbh_details hash, as it can not change unless
1547         # we connect to something else
1548         my $cache = $self->_dbh_details->{_datatype_map_cache} ||= {};
1549         if (not exists $cache->{$_->{sqlt_datatype}}) {
1550           $cache->{$_->{sqlt_datatype}} = $self->bind_attribute_by_data_type($_->{sqlt_datatype}) || undef;
1551         }
1552         $cache->{$_->{sqlt_datatype}};
1553       }
1554       elsif ($sba_attrs and $_->{dbic_colname}) {
1555         $sba_attrs->{$_->{dbic_colname}} || undef;
1556       }
1557       else {
1558         undef;  # always push something at this position
1559       }
1560     }
1561   }
1562
1563   return \@attrs;
1564 }
1565
1566 sub _execute {
1567   my ($self, $op, $ident, @args) = @_;
1568
1569   my ($sql, $bind) = $self->_prep_for_execute($op, $ident, \@args);
1570
1571   shift->dbh_do(    # retry over disconnects
1572     '_dbh_execute',
1573     $sql,
1574     $bind,
1575     $self->_dbi_attrs_for_bind($ident, $bind)
1576   );
1577 }
1578
1579 sub _dbh_execute {
1580   my ($self, undef, $sql, $bind, $bind_attrs) = @_;
1581
1582   $self->_query_start( $sql, $bind );
1583   my $sth = $self->_sth($sql);
1584
1585   for my $i (0 .. $#$bind) {
1586     if (ref $bind->[$i][1] eq 'SCALAR') {  # any scalarrefs are assumed to be bind_inouts
1587       $sth->bind_param_inout(
1588         $i + 1, # bind params counts are 1-based
1589         $bind->[$i][1],
1590         $bind->[$i][0]{dbd_size} || $self->_max_column_bytesize($bind->[$i][0]), # size
1591         $bind_attrs->[$i],
1592       );
1593     }
1594     else {
1595       $sth->bind_param(
1596         $i + 1,
1597         (ref $bind->[$i][1] and overload::Method($bind->[$i][1], '""'))
1598           ? "$bind->[$i][1]"
1599           : $bind->[$i][1]
1600         ,
1601         $bind_attrs->[$i],
1602       );
1603     }
1604   }
1605
1606   # Can this fail without throwing an exception anyways???
1607   my $rv = $sth->execute();
1608   $self->throw_exception(
1609     $sth->errstr || $sth->err || 'Unknown error: execute() returned false, but error flags were not set...'
1610   ) if !$rv;
1611
1612   $self->_query_end( $sql, $bind );
1613
1614   return (wantarray ? ($rv, $sth, @$bind) : $rv);
1615 }
1616
1617 sub _prefetch_autovalues {
1618   my ($self, $source, $to_insert) = @_;
1619
1620   my $colinfo = $source->columns_info;
1621
1622   my %values;
1623   for my $col (keys %$colinfo) {
1624     if (
1625       $colinfo->{$col}{auto_nextval}
1626         and
1627       (
1628         ! exists $to_insert->{$col}
1629           or
1630         ref $to_insert->{$col} eq 'SCALAR'
1631           or
1632         (ref $to_insert->{$col} eq 'REF' and ref ${$to_insert->{$col}} eq 'ARRAY')
1633       )
1634     ) {
1635       $values{$col} = $self->_sequence_fetch(
1636         'NEXTVAL',
1637         ( $colinfo->{$col}{sequence} ||=
1638             $self->_dbh_get_autoinc_seq($self->_get_dbh, $source, $col)
1639         ),
1640       );
1641     }
1642   }
1643
1644   \%values;
1645 }
1646
1647 sub insert {
1648   my ($self, $source, $to_insert) = @_;
1649
1650   my $prefetched_values = $self->_prefetch_autovalues($source, $to_insert);
1651
1652   # fuse the values, but keep a separate list of prefetched_values so that
1653   # they can be fused once again with the final return
1654   $to_insert = { %$to_insert, %$prefetched_values };
1655
1656   my $col_infos = $source->columns_info;
1657   my %pcols = map { $_ => 1 } $source->primary_columns;
1658   my %retrieve_cols;
1659   for my $col ($source->columns) {
1660     # nothing to retrieve when explicit values are supplied
1661     next if (defined $to_insert->{$col} and ! (
1662       ref $to_insert->{$col} eq 'SCALAR'
1663         or
1664       (ref $to_insert->{$col} eq 'REF' and ref ${$to_insert->{$col}} eq 'ARRAY')
1665     ));
1666
1667     # the 'scalar keys' is a trick to preserve the ->columns declaration order
1668     $retrieve_cols{$col} = scalar keys %retrieve_cols if (
1669       $pcols{$col}
1670         or
1671       $col_infos->{$col}{retrieve_on_insert}
1672     );
1673   };
1674
1675   my ($sqla_opts, @ir_container);
1676   if (%retrieve_cols and $self->_use_insert_returning) {
1677     $sqla_opts->{returning_container} = \@ir_container
1678       if $self->_use_insert_returning_bound;
1679
1680     $sqla_opts->{returning} = [
1681       sort { $retrieve_cols{$a} <=> $retrieve_cols{$b} } keys %retrieve_cols
1682     ];
1683   }
1684
1685   my ($rv, $sth) = $self->_execute('insert', $source, $to_insert, $sqla_opts);
1686
1687   my %returned_cols = %$to_insert;
1688   if (my $retlist = $sqla_opts->{returning}) {  # if IR is supported - we will get everything in one set
1689     @ir_container = try {
1690       local $SIG{__WARN__} = sub {};
1691       my @r = $sth->fetchrow_array;
1692       $sth->finish;
1693       @r;
1694     } unless @ir_container;
1695
1696     @returned_cols{@$retlist} = @ir_container if @ir_container;
1697   }
1698   else {
1699     # pull in PK if needed and then everything else
1700     if (my @missing_pri = grep { $pcols{$_} } keys %retrieve_cols) {
1701
1702       $self->throw_exception( "Missing primary key but Storage doesn't support last_insert_id" )
1703         unless $self->can('last_insert_id');
1704
1705       my @pri_values = $self->last_insert_id($source, @missing_pri);
1706
1707       $self->throw_exception( "Can't get last insert id" )
1708         unless (@pri_values == @missing_pri);
1709
1710       @returned_cols{@missing_pri} = @pri_values;
1711       delete $retrieve_cols{$_} for @missing_pri;
1712     }
1713
1714     # if there is more left to pull
1715     if (%retrieve_cols) {
1716       $self->throw_exception(
1717         'Unable to retrieve additional columns without a Primary Key on ' . $source->source_name
1718       ) unless %pcols;
1719
1720       my @left_to_fetch = sort { $retrieve_cols{$a} <=> $retrieve_cols{$b} } keys %retrieve_cols;
1721
1722       my $cur = DBIx::Class::ResultSet->new($source, {
1723         where => { map { $_ => $returned_cols{$_} } (keys %pcols) },
1724         select => \@left_to_fetch,
1725       })->cursor;
1726
1727       @returned_cols{@left_to_fetch} = $cur->next;
1728
1729       $self->throw_exception('Duplicate row returned for PK-search after fresh insert')
1730         if scalar $cur->next;
1731     }
1732   }
1733
1734   return { %$prefetched_values, %returned_cols };
1735 }
1736
1737 sub insert_bulk {
1738   my ($self, $source, $cols, $data) = @_;
1739
1740   # FIXME - perhaps this is not even needed? does DBI stringify?
1741   #
1742   # forcibly stringify whatever is stringifiable
1743   for my $r (0 .. $#$data) {
1744     for my $c (0 .. $#{$data->[$r]}) {
1745       $data->[$r][$c] = "$data->[$r][$c]"
1746         if ( ref $data->[$r][$c] and overload::Method($data->[$r][$c], '""') );
1747     }
1748   }
1749
1750   # check the data for consistency
1751   # report a sensible error on bad data
1752   #
1753   # also create a list of dynamic binds (ones that will be changing
1754   # for each row)
1755   my $dyn_bind_idx;
1756   for my $col_idx (0..$#$cols) {
1757
1758     # the first "row" is used as a point of reference
1759     my $reference_val = $data->[0][$col_idx];
1760     my $is_literal = ref $reference_val eq 'SCALAR';
1761     my $is_literal_bind = ( !$is_literal and (
1762       ref $reference_val eq 'REF'
1763         and
1764       ref $$reference_val eq 'ARRAY'
1765     ) );
1766
1767     $dyn_bind_idx->{$col_idx} = 1
1768       if (!$is_literal and !$is_literal_bind);
1769
1770     # use a closure for convenience (less to pass)
1771     my $bad_slice = sub {
1772       my ($msg, $slice_idx) = @_;
1773       $self->throw_exception(sprintf "%s for column '%s' in populate slice:\n%s",
1774         $msg,
1775         $cols->[$col_idx],
1776         do {
1777           require Data::Dumper::Concise;
1778           local $Data::Dumper::Maxdepth = 2;
1779           Data::Dumper::Concise::Dumper ({
1780             map { $cols->[$_] =>
1781               $data->[$slice_idx][$_]
1782             } (0 .. $#$cols)
1783           }),
1784         }
1785       );
1786     };
1787
1788     for my $row_idx (1..$#$data) {  # we are comparing against what we got from [0] above, hence start from 1
1789       my $val = $data->[$row_idx][$col_idx];
1790
1791       if ($is_literal) {
1792         if (ref $val ne 'SCALAR') {
1793           $bad_slice->(
1794             "Incorrect value (expecting SCALAR-ref \\'$$reference_val')",
1795             $row_idx
1796           );
1797         }
1798         elsif ($$val ne $$reference_val) {
1799           $bad_slice->(
1800             "Inconsistent literal SQL value (expecting \\'$$reference_val')",
1801             $row_idx
1802           );
1803         }
1804       }
1805       elsif ($is_literal_bind) {
1806         if (ref $val ne 'REF' or ref $$val ne 'ARRAY') {
1807           $bad_slice->(
1808             "Incorrect value (expecting ARRAYREF-ref \\['${$reference_val}->[0]', ... ])",
1809             $row_idx
1810           );
1811         }
1812         elsif (${$val}->[0] ne ${$reference_val}->[0]) {
1813           $bad_slice->(
1814             "Inconsistent literal SQL-bind value (expecting \\['${$reference_val}->[0]', ... ])",
1815             $row_idx
1816           );
1817         }
1818       }
1819       elsif (ref $val) {
1820         if (ref $val eq 'SCALAR' or (ref $val eq 'REF' and ref $$val eq 'ARRAY') ) {
1821           $bad_slice->("Literal SQL found where a plain bind value is expected", $row_idx);
1822         }
1823         else {
1824           $bad_slice->("$val reference found where bind expected", $row_idx);
1825         }
1826       }
1827     }
1828   }
1829
1830   # Get the sql with bind values interpolated where necessary. For dynamic
1831   # binds convert the values of the first row into a literal+bind combo, with
1832   # extra positional info in the bind attr hashref. This will allow us to match
1833   # the order properly, and is so contrived because a user-supplied literal
1834   # bind (or something else specific to a resultsource and/or storage driver)
1835   # can inject extra binds along the way, so one can't rely on "shift
1836   # positions" ordering at all. Also we can't just hand SQLA a set of some
1837   # known "values" (e.g. hashrefs that can be later matched up by address),
1838   # because we want to supply a real value on which perhaps e.g. datatype
1839   # checks will be performed
1840   my ($sql, $proto_bind) = $self->_prep_for_execute (
1841     'insert',
1842     $source,
1843     [ { map { $cols->[$_] => $dyn_bind_idx->{$_}
1844       ? \[ '?', [
1845           { dbic_colname => $cols->[$_], _bind_data_slice_idx => $_ }
1846             =>
1847           $data->[0][$_]
1848         ] ]
1849       : $data->[0][$_]
1850     } (0..$#$cols) } ],
1851   );
1852
1853   if (! @$proto_bind and keys %$dyn_bind_idx) {
1854     # if the bindlist is empty and we had some dynamic binds, this means the
1855     # storage ate them away (e.g. the NoBindVars component) and interpolated
1856     # them directly into the SQL. This obviosly can't be good for multi-inserts
1857     $self->throw_exception('Cannot insert_bulk without support for placeholders');
1858   }
1859
1860   # neither _execute_array, nor _execute_inserts_with_no_binds are
1861   # atomic (even if _execute _array is a single call). Thus a safety
1862   # scope guard
1863   my $guard = $self->txn_scope_guard;
1864
1865   $self->_query_start( $sql, @$proto_bind ? [[undef => '__BULK_INSERT__' ]] : () );
1866   my $sth = $self->_sth($sql);
1867   my $rv = do {
1868     if (@$proto_bind) {
1869       # proto bind contains the information on which pieces of $data to pull
1870       # $cols is passed in only for prettier error-reporting
1871       $self->_execute_array( $source, $sth, $proto_bind, $cols, $data );
1872     }
1873     else {
1874       # bind_param_array doesn't work if there are no binds
1875       $self->_dbh_execute_inserts_with_no_binds( $sth, scalar @$data );
1876     }
1877   };
1878
1879   $self->_query_end( $sql, @$proto_bind ? [[ undef => '__BULK_INSERT__' ]] : () );
1880
1881   $guard->commit;
1882
1883   return (wantarray ? ($rv, $sth, @$proto_bind) : $rv);
1884 }
1885
1886 sub _execute_array {
1887   my ($self, $source, $sth, $proto_bind, $cols, $data, @extra) = @_;
1888
1889   ## This must be an arrayref, else nothing works!
1890   my $tuple_status = [];
1891
1892   my $bind_attrs = $self->_dbi_attrs_for_bind($source, $proto_bind);
1893
1894   # Bind the values by column slices
1895   for my $i (0 .. $#$proto_bind) {
1896     my $data_slice_idx = (
1897       ref $proto_bind->[$i][0] eq 'HASH'
1898         and
1899       exists $proto_bind->[$i][0]{_bind_data_slice_idx}
1900     ) ? $proto_bind->[$i][0]{_bind_data_slice_idx} : undef;
1901
1902     $sth->bind_param_array(
1903       $i+1, # DBI bind indexes are 1-based
1904       defined $data_slice_idx
1905         # either get a "column" of dynamic values, or just repeat the same
1906         # bind over and over
1907         ? [ map { $_->[$data_slice_idx] } @$data ]
1908         : [ ($proto_bind->[$i][1]) x @$data ]
1909       ,
1910       defined $bind_attrs->[$i] ? $bind_attrs->[$i] : (), # some DBDs throw up when given an undef
1911     );
1912   }
1913
1914   my ($rv, $err);
1915   try {
1916     $rv = $self->_dbh_execute_array($sth, $tuple_status, @extra);
1917   }
1918   catch {
1919     $err = shift;
1920   };
1921
1922   # Not all DBDs are create equal. Some throw on error, some return
1923   # an undef $rv, and some set $sth->err - try whatever we can
1924   $err = ($sth->errstr || 'UNKNOWN ERROR ($sth->errstr is unset)') if (
1925     ! defined $err
1926       and
1927     ( !defined $rv or $sth->err )
1928   );
1929
1930   # Statement must finish even if there was an exception.
1931   try {
1932     $sth->finish
1933   }
1934   catch {
1935     $err = shift unless defined $err
1936   };
1937
1938   if (defined $err) {
1939     my $i = 0;
1940     ++$i while $i <= $#$tuple_status && !ref $tuple_status->[$i];
1941
1942     $self->throw_exception("Unexpected populate error: $err")
1943       if ($i > $#$tuple_status);
1944
1945     require Data::Dumper::Concise;
1946     $self->throw_exception(sprintf "execute_array() aborted with '%s' at populate slice:\n%s",
1947       ($tuple_status->[$i][1] || $err),
1948       Data::Dumper::Concise::Dumper( { map { $cols->[$_] => $data->[$i][$_] } (0 .. $#$cols) } ),
1949     );
1950   }
1951
1952   return $rv;
1953 }
1954
1955 sub _dbh_execute_array {
1956   #my ($self, $sth, $tuple_status, @extra) = @_;
1957   return $_[1]->execute_array({ArrayTupleStatus => $_[2]});
1958 }
1959
1960 sub _dbh_execute_inserts_with_no_binds {
1961   my ($self, $sth, $count) = @_;
1962
1963   my $err;
1964   try {
1965     my $dbh = $self->_get_dbh;
1966     local $dbh->{RaiseError} = 1;
1967     local $dbh->{PrintError} = 0;
1968
1969     $sth->execute foreach 1..$count;
1970   }
1971   catch {
1972     $err = shift;
1973   };
1974
1975   # Make sure statement is finished even if there was an exception.
1976   try {
1977     $sth->finish
1978   }
1979   catch {
1980     $err = shift unless defined $err;
1981   };
1982
1983   $self->throw_exception($err) if defined $err;
1984
1985   return $count;
1986 }
1987
1988 sub update {
1989   #my ($self, $source, @args) = @_;
1990   shift->_execute('update', @_);
1991 }
1992
1993
1994 sub delete {
1995   #my ($self, $source, @args) = @_;
1996   shift->_execute('delete', @_);
1997 }
1998
1999 # We were sent here because the $rs contains a complex search
2000 # which will require a subquery to select the correct rows
2001 # (i.e. joined or limited resultsets, or non-introspectable conditions)
2002 #
2003 # Generating a single PK column subquery is trivial and supported
2004 # by all RDBMS. However if we have a multicolumn PK, things get ugly.
2005 # Look at _multipk_update_delete()
2006 sub _subq_update_delete {
2007   my $self = shift;
2008   my ($rs, $op, $values) = @_;
2009
2010   my $rsrc = $rs->result_source;
2011
2012   # quick check if we got a sane rs on our hands
2013   my @pcols = $rsrc->_pri_cols;
2014
2015   my $sel = $rs->_resolved_attrs->{select};
2016   $sel = [ $sel ] unless ref $sel eq 'ARRAY';
2017
2018   if (
2019       join ("\x00", map { join '.', $rs->{attrs}{alias}, $_ } sort @pcols)
2020         ne
2021       join ("\x00", sort @$sel )
2022   ) {
2023     $self->throw_exception (
2024       '_subq_update_delete can not be called on resultsets selecting columns other than the primary keys'
2025     );
2026   }
2027
2028   if (@pcols == 1) {
2029     return $self->$op (
2030       $rsrc,
2031       $op eq 'update' ? $values : (),
2032       { $pcols[0] => { -in => $rs->as_query } },
2033     );
2034   }
2035
2036   else {
2037     return $self->_multipk_update_delete (@_);
2038   }
2039 }
2040
2041 # ANSI SQL does not provide a reliable way to perform a multicol-PK
2042 # resultset update/delete involving subqueries. So by default resort
2043 # to simple (and inefficient) delete_all style per-row opearations,
2044 # while allowing specific storages to override this with a faster
2045 # implementation.
2046 #
2047 sub _multipk_update_delete {
2048   return shift->_per_row_update_delete (@_);
2049 }
2050
2051 # This is the default loop used to delete/update rows for multi PK
2052 # resultsets, and used by mysql exclusively (because it can't do anything
2053 # else).
2054 #
2055 # We do not use $row->$op style queries, because resultset update/delete
2056 # is not expected to cascade (this is what delete_all/update_all is for).
2057 #
2058 # There should be no race conditions as the entire operation is rolled
2059 # in a transaction.
2060 #
2061 sub _per_row_update_delete {
2062   my $self = shift;
2063   my ($rs, $op, $values) = @_;
2064
2065   my $rsrc = $rs->result_source;
2066   my @pcols = $rsrc->_pri_cols;
2067
2068   my $guard = $self->txn_scope_guard;
2069
2070   # emulate the return value of $sth->execute for non-selects
2071   my $row_cnt = '0E0';
2072
2073   my $subrs_cur = $rs->cursor;
2074   my @all_pk = $subrs_cur->all;
2075   for my $pks ( @all_pk) {
2076
2077     my $cond;
2078     for my $i (0.. $#pcols) {
2079       $cond->{$pcols[$i]} = $pks->[$i];
2080     }
2081
2082     $self->$op (
2083       $rsrc,
2084       $op eq 'update' ? $values : (),
2085       $cond,
2086     );
2087
2088     $row_cnt++;
2089   }
2090
2091   $guard->commit;
2092
2093   return $row_cnt;
2094 }
2095
2096 sub _select {
2097   my $self = shift;
2098   $self->_execute($self->_select_args(@_));
2099 }
2100
2101 sub _select_args_to_query {
2102   my $self = shift;
2103
2104   # my ($op, $ident, $select, $cond, $rs_attrs, $rows, $offset)
2105   #  = $self->_select_args($ident, $select, $cond, $attrs);
2106   my ($op, $ident, @args) =
2107     $self->_select_args(@_);
2108
2109   # my ($sql, $prepared_bind) = $self->_gen_sql_bind($op, $ident, [ $select, $cond, $rs_attrs, $rows, $offset ]);
2110   my ($sql, $prepared_bind) = $self->_gen_sql_bind($op, $ident, \@args);
2111   $prepared_bind ||= [];
2112
2113   return wantarray
2114     ? ($sql, $prepared_bind)
2115     : \[ "($sql)", @$prepared_bind ]
2116   ;
2117 }
2118
2119 sub _select_args {
2120   my ($self, $ident, $select, $where, $attrs) = @_;
2121
2122   my $sql_maker = $self->sql_maker;
2123   my ($alias2source, $rs_alias) = $self->_resolve_ident_sources ($ident);
2124
2125   $attrs = {
2126     %$attrs,
2127     select => $select,
2128     from => $ident,
2129     where => $where,
2130     $rs_alias && $alias2source->{$rs_alias}
2131       ? ( _rsroot_rsrc => $alias2source->{$rs_alias} )
2132       : ()
2133     ,
2134   };
2135
2136   # Sanity check the attributes (SQLMaker does it too, but
2137   # in case of a software_limit we'll never reach there)
2138   if (defined $attrs->{offset}) {
2139     $self->throw_exception('A supplied offset attribute must be a non-negative integer')
2140       if ( $attrs->{offset} =~ /\D/ or $attrs->{offset} < 0 );
2141   }
2142
2143   if (defined $attrs->{rows}) {
2144     $self->throw_exception("The rows attribute must be a positive integer if present")
2145       if ( $attrs->{rows} =~ /\D/ or $attrs->{rows} <= 0 );
2146   }
2147   elsif ($attrs->{offset}) {
2148     # MySQL actually recommends this approach.  I cringe.
2149     $attrs->{rows} = $sql_maker->__max_int;
2150   }
2151
2152   my @limit;
2153
2154   # see if we need to tear the prefetch apart otherwise delegate the limiting to the
2155   # storage, unless software limit was requested
2156   if (
2157     #limited has_many
2158     ( $attrs->{rows} && keys %{$attrs->{collapse}} )
2159        ||
2160     # grouped prefetch (to satisfy group_by == select)
2161     ( $attrs->{group_by}
2162         &&
2163       @{$attrs->{group_by}}
2164         &&
2165       $attrs->{_prefetch_selector_range}
2166     )
2167   ) {
2168     ($ident, $select, $where, $attrs)
2169       = $self->_adjust_select_args_for_complex_prefetch ($ident, $select, $where, $attrs);
2170   }
2171   elsif (! $attrs->{software_limit} ) {
2172     push @limit, (
2173       $attrs->{rows} || (),
2174       $attrs->{offset} || (),
2175     );
2176   }
2177
2178   # try to simplify the joinmap further (prune unreferenced type-single joins)
2179   $ident = $self->_prune_unused_joins ($ident, $select, $where, $attrs);
2180
2181 ###
2182   # This would be the point to deflate anything found in $where
2183   # (and leave $attrs->{bind} intact). Problem is - inflators historically
2184   # expect a row object. And all we have is a resultsource (it is trivial
2185   # to extract deflator coderefs via $alias2source above).
2186   #
2187   # I don't see a way forward other than changing the way deflators are
2188   # invoked, and that's just bad...
2189 ###
2190
2191   return ('select', $ident, $select, $where, $attrs, @limit);
2192 }
2193
2194 # Returns a counting SELECT for a simple count
2195 # query. Abstracted so that a storage could override
2196 # this to { count => 'firstcol' } or whatever makes
2197 # sense as a performance optimization
2198 sub _count_select {
2199   #my ($self, $source, $rs_attrs) = @_;
2200   return { count => '*' };
2201 }
2202
2203 sub source_bind_attributes {
2204   shift->throw_exception(
2205     'source_bind_attributes() was never meant to be a callable public method - '
2206    .'please contact the DBIC dev-team and describe your use case so that a reasonable '
2207    .'solution can be provided'
2208    ."\nhttp://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class.pm#GETTING_HELP/SUPPORT"
2209   );
2210 }
2211
2212 =head2 select
2213
2214 =over 4
2215
2216 =item Arguments: $ident, $select, $condition, $attrs
2217
2218 =back
2219
2220 Handle a SQL select statement.
2221
2222 =cut
2223
2224 sub select {
2225   my $self = shift;
2226   my ($ident, $select, $condition, $attrs) = @_;
2227   return $self->cursor_class->new($self, \@_, $attrs);
2228 }
2229
2230 sub select_single {
2231   my $self = shift;
2232   my ($rv, $sth, @bind) = $self->_select(@_);
2233   my @row = $sth->fetchrow_array;
2234   my @nextrow = $sth->fetchrow_array if @row;
2235   if(@row && @nextrow) {
2236     carp "Query returned more than one row.  SQL that returns multiple rows is DEPRECATED for ->find and ->single";
2237   }
2238   # Need to call finish() to work round broken DBDs
2239   $sth->finish();
2240   return @row;
2241 }
2242
2243 =head2 sql_limit_dialect
2244
2245 This is an accessor for the default SQL limit dialect used by a particular
2246 storage driver. Can be overridden by supplying an explicit L</limit_dialect>
2247 to L<DBIx::Class::Schema/connect>. For a list of available limit dialects
2248 see L<DBIx::Class::SQLMaker::LimitDialects>.
2249
2250 =cut
2251
2252 sub _dbh_sth {
2253   my ($self, $dbh, $sql) = @_;
2254
2255   # 3 is the if_active parameter which avoids active sth re-use
2256   my $sth = $self->disable_sth_caching
2257     ? $dbh->prepare($sql)
2258     : $dbh->prepare_cached($sql, {}, 3);
2259
2260   # XXX You would think RaiseError would make this impossible,
2261   #  but apparently that's not true :(
2262   $self->throw_exception(
2263     $dbh->errstr
2264       ||
2265     sprintf( "\$dbh->prepare() of '%s' through %s failed *silently* without "
2266             .'an exception and/or setting $dbh->errstr',
2267       length ($sql) > 20
2268         ? substr($sql, 0, 20) . '...'
2269         : $sql
2270       ,
2271       'DBD::' . $dbh->{Driver}{Name},
2272     )
2273   ) if !$sth;
2274
2275   $sth;
2276 }
2277
2278 sub sth {
2279   carp_unique 'sth was mistakenly marked/documented as public, stop calling it (will be removed before DBIC v0.09)';
2280   shift->_sth(@_);
2281 }
2282
2283 sub _sth {
2284   my ($self, $sql) = @_;
2285   $self->dbh_do('_dbh_sth', $sql);  # retry over disconnects
2286 }
2287
2288 sub _dbh_columns_info_for {
2289   my ($self, $dbh, $table) = @_;
2290
2291   if ($dbh->can('column_info')) {
2292     my %result;
2293     my $caught;
2294     try {
2295       my ($schema,$tab) = $table =~ /^(.+?)\.(.+)$/ ? ($1,$2) : (undef,$table);
2296       my $sth = $dbh->column_info( undef,$schema, $tab, '%' );
2297       $sth->execute();
2298       while ( my $info = $sth->fetchrow_hashref() ){
2299         my %column_info;
2300         $column_info{data_type}   = $info->{TYPE_NAME};
2301         $column_info{size}      = $info->{COLUMN_SIZE};
2302         $column_info{is_nullable}   = $info->{NULLABLE} ? 1 : 0;
2303         $column_info{default_value} = $info->{COLUMN_DEF};
2304         my $col_name = $info->{COLUMN_NAME};
2305         $col_name =~ s/^\"(.*)\"$/$1/;
2306
2307         $result{$col_name} = \%column_info;
2308       }
2309     } catch {
2310       $caught = 1;
2311     };
2312     return \%result if !$caught && scalar keys %result;
2313   }
2314
2315   my %result;
2316   my $sth = $dbh->prepare($self->sql_maker->select($table, undef, \'1 = 0'));
2317   $sth->execute;
2318   my @columns = @{$sth->{NAME_lc}};
2319   for my $i ( 0 .. $#columns ){
2320     my %column_info;
2321     $column_info{data_type} = $sth->{TYPE}->[$i];
2322     $column_info{size} = $sth->{PRECISION}->[$i];
2323     $column_info{is_nullable} = $sth->{NULLABLE}->[$i] ? 1 : 0;
2324
2325     if ($column_info{data_type} =~ m/^(.*?)\((.*?)\)$/) {
2326       $column_info{data_type} = $1;
2327       $column_info{size}    = $2;
2328     }
2329
2330     $result{$columns[$i]} = \%column_info;
2331   }
2332   $sth->finish;
2333
2334   foreach my $col (keys %result) {
2335     my $colinfo = $result{$col};
2336     my $type_num = $colinfo->{data_type};
2337     my $type_name;
2338     if(defined $type_num && $dbh->can('type_info')) {
2339       my $type_info = $dbh->type_info($type_num);
2340       $type_name = $type_info->{TYPE_NAME} if $type_info;
2341       $colinfo->{data_type} = $type_name if $type_name;
2342     }
2343   }
2344
2345   return \%result;
2346 }
2347
2348 sub columns_info_for {
2349   my ($self, $table) = @_;
2350   $self->_dbh_columns_info_for ($self->_get_dbh, $table);
2351 }
2352
2353 =head2 last_insert_id
2354
2355 Return the row id of the last insert.
2356
2357 =cut
2358
2359 sub _dbh_last_insert_id {
2360     my ($self, $dbh, $source, $col) = @_;
2361
2362     my $id = try { $dbh->last_insert_id (undef, undef, $source->name, $col) };
2363
2364     return $id if defined $id;
2365
2366     my $class = ref $self;
2367     $self->throw_exception ("No storage specific _dbh_last_insert_id() method implemented in $class, and the generic DBI::last_insert_id() failed");
2368 }
2369
2370 sub last_insert_id {
2371   my $self = shift;
2372   $self->_dbh_last_insert_id ($self->_dbh, @_);
2373 }
2374
2375 =head2 _native_data_type
2376
2377 =over 4
2378
2379 =item Arguments: $type_name
2380
2381 =back
2382
2383 This API is B<EXPERIMENTAL>, will almost definitely change in the future, and
2384 currently only used by L<::AutoCast|DBIx::Class::Storage::DBI::AutoCast> and
2385 L<::Sybase::ASE|DBIx::Class::Storage::DBI::Sybase::ASE>.
2386
2387 The default implementation returns C<undef>, implement in your Storage driver if
2388 you need this functionality.
2389
2390 Should map types from other databases to the native RDBMS type, for example
2391 C<VARCHAR2> to C<VARCHAR>.
2392
2393 Types with modifiers should map to the underlying data type. For example,
2394 C<INTEGER AUTO_INCREMENT> should become C<INTEGER>.
2395
2396 Composite types should map to the container type, for example
2397 C<ENUM(foo,bar,baz)> becomes C<ENUM>.
2398
2399 =cut
2400
2401 sub _native_data_type {
2402   #my ($self, $data_type) = @_;
2403   return undef
2404 }
2405
2406 # Check if placeholders are supported at all
2407 sub _determine_supports_placeholders {
2408   my $self = shift;
2409   my $dbh  = $self->_get_dbh;
2410
2411   # some drivers provide a $dbh attribute (e.g. Sybase and $dbh->{syb_dynamic_supported})
2412   # but it is inaccurate more often than not
2413   return try {
2414     local $dbh->{PrintError} = 0;
2415     local $dbh->{RaiseError} = 1;
2416     $dbh->do('select ?', {}, 1);
2417     1;
2418   }
2419   catch {
2420     0;
2421   };
2422 }
2423
2424 # Check if placeholders bound to non-string types throw exceptions
2425 #
2426 sub _determine_supports_typeless_placeholders {
2427   my $self = shift;
2428   my $dbh  = $self->_get_dbh;
2429
2430   return try {
2431     local $dbh->{PrintError} = 0;
2432     local $dbh->{RaiseError} = 1;
2433     # this specifically tests a bind that is NOT a string
2434     $dbh->do('select 1 where 1 = ?', {}, 1);
2435     1;
2436   }
2437   catch {
2438     0;
2439   };
2440 }
2441
2442 =head2 sqlt_type
2443
2444 Returns the database driver name.
2445
2446 =cut
2447
2448 sub sqlt_type {
2449   shift->_get_dbh->{Driver}->{Name};
2450 }
2451
2452 =head2 bind_attribute_by_data_type
2453
2454 Given a datatype from column info, returns a database specific bind
2455 attribute for C<< $dbh->bind_param($val,$attribute) >> or nothing if we will
2456 let the database planner just handle it.
2457
2458 Generally only needed for special case column types, like bytea in postgres.
2459
2460 =cut
2461
2462 sub bind_attribute_by_data_type {
2463     return;
2464 }
2465
2466 =head2 is_datatype_numeric
2467
2468 Given a datatype from column_info, returns a boolean value indicating if
2469 the current RDBMS considers it a numeric value. This controls how
2470 L<DBIx::Class::Row/set_column> decides whether to mark the column as
2471 dirty - when the datatype is deemed numeric a C<< != >> comparison will
2472 be performed instead of the usual C<eq>.
2473
2474 =cut
2475
2476 sub is_datatype_numeric {
2477   #my ($self, $dt) = @_;
2478
2479   return 0 unless $_[1];
2480
2481   $_[1] =~ /^ (?:
2482     numeric | int(?:eger)? | (?:tiny|small|medium|big)int | dec(?:imal)? | real | float | double (?: \s+ precision)? | (?:big)?serial
2483   ) $/ix;
2484 }
2485
2486
2487 =head2 create_ddl_dir
2488
2489 =over 4
2490
2491 =item Arguments: $schema \@databases, $version, $directory, $preversion, \%sqlt_args
2492
2493 =back
2494
2495 Creates a SQL file based on the Schema, for each of the specified
2496 database engines in C<\@databases> in the given directory.
2497 (note: specify L<SQL::Translator> names, not L<DBI> driver names).
2498
2499 Given a previous version number, this will also create a file containing
2500 the ALTER TABLE statements to transform the previous schema into the
2501 current one. Note that these statements may contain C<DROP TABLE> or
2502 C<DROP COLUMN> statements that can potentially destroy data.
2503
2504 The file names are created using the C<ddl_filename> method below, please
2505 override this method in your schema if you would like a different file
2506 name format. For the ALTER file, the same format is used, replacing
2507 $version in the name with "$preversion-$version".
2508
2509 See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
2510 The most common value for this would be C<< { add_drop_table => 1 } >>
2511 to have the SQL produced include a C<DROP TABLE> statement for each table
2512 created. For quoting purposes supply C<quote_table_names> and
2513 C<quote_field_names>.
2514
2515 If no arguments are passed, then the following default values are assumed:
2516
2517 =over 4
2518
2519 =item databases  - ['MySQL', 'SQLite', 'PostgreSQL']
2520
2521 =item version    - $schema->schema_version
2522
2523 =item directory  - './'
2524
2525 =item preversion - <none>
2526
2527 =back
2528
2529 By default, C<\%sqlt_args> will have
2530
2531  { add_drop_table => 1, ignore_constraint_names => 1, ignore_index_names => 1 }
2532
2533 merged with the hash passed in. To disable any of those features, pass in a
2534 hashref like the following
2535
2536  { ignore_constraint_names => 0, # ... other options }
2537
2538
2539 WARNING: You are strongly advised to check all SQL files created, before applying
2540 them.
2541
2542 =cut
2543
2544 sub create_ddl_dir {
2545   my ($self, $schema, $databases, $version, $dir, $preversion, $sqltargs) = @_;
2546
2547   unless ($dir) {
2548     carp "No directory given, using ./\n";
2549     $dir = './';
2550   } else {
2551       -d $dir
2552         or
2553       (require File::Path and File::Path::make_path ("$dir"))  # make_path does not like objects (i.e. Path::Class::Dir)
2554         or
2555       $self->throw_exception(
2556         "Failed to create '$dir': " . ($! || $@ || 'error unknown')
2557       );
2558   }
2559
2560   $self->throw_exception ("Directory '$dir' does not exist\n") unless(-d $dir);
2561
2562   $databases ||= ['MySQL', 'SQLite', 'PostgreSQL'];
2563   $databases = [ $databases ] if(ref($databases) ne 'ARRAY');
2564
2565   my $schema_version = $schema->schema_version || '1.x';
2566   $version ||= $schema_version;
2567
2568   $sqltargs = {
2569     add_drop_table => 1,
2570     ignore_constraint_names => 1,
2571     ignore_index_names => 1,
2572     %{$sqltargs || {}}
2573   };
2574
2575   unless (DBIx::Class::Optional::Dependencies->req_ok_for ('deploy')) {
2576     $self->throw_exception("Can't create a ddl file without " . DBIx::Class::Optional::Dependencies->req_missing_for ('deploy') );
2577   }
2578
2579   my $sqlt = SQL::Translator->new( $sqltargs );
2580
2581   $sqlt->parser('SQL::Translator::Parser::DBIx::Class');
2582   my $sqlt_schema = $sqlt->translate({ data => $schema })
2583     or $self->throw_exception ($sqlt->error);
2584
2585   foreach my $db (@$databases) {
2586     $sqlt->reset();
2587     $sqlt->{schema} = $sqlt_schema;
2588     $sqlt->producer($db);
2589
2590     my $file;
2591     my $filename = $schema->ddl_filename($db, $version, $dir);
2592     if (-e $filename && ($version eq $schema_version )) {
2593       # if we are dumping the current version, overwrite the DDL
2594       carp "Overwriting existing DDL file - $filename";
2595       unlink($filename);
2596     }
2597
2598     my $output = $sqlt->translate;
2599     if(!$output) {
2600       carp("Failed to translate to $db, skipping. (" . $sqlt->error . ")");
2601       next;
2602     }
2603     if(!open($file, ">$filename")) {
2604       $self->throw_exception("Can't open $filename for writing ($!)");
2605       next;
2606     }
2607     print $file $output;
2608     close($file);
2609
2610     next unless ($preversion);
2611
2612     require SQL::Translator::Diff;
2613
2614     my $prefilename = $schema->ddl_filename($db, $preversion, $dir);
2615     if(!-e $prefilename) {
2616       carp("No previous schema file found ($prefilename)");
2617       next;
2618     }
2619
2620     my $difffile = $schema->ddl_filename($db, $version, $dir, $preversion);
2621     if(-e $difffile) {
2622       carp("Overwriting existing diff file - $difffile");
2623       unlink($difffile);
2624     }
2625
2626     my $source_schema;
2627     {
2628       my $t = SQL::Translator->new($sqltargs);
2629       $t->debug( 0 );
2630       $t->trace( 0 );
2631
2632       $t->parser( $db )
2633         or $self->throw_exception ($t->error);
2634
2635       my $out = $t->translate( $prefilename )
2636         or $self->throw_exception ($t->error);
2637
2638       $source_schema = $t->schema;
2639
2640       $source_schema->name( $prefilename )
2641         unless ( $source_schema->name );
2642     }
2643
2644     # The "new" style of producers have sane normalization and can support
2645     # diffing a SQL file against a DBIC->SQLT schema. Old style ones don't
2646     # And we have to diff parsed SQL against parsed SQL.
2647     my $dest_schema = $sqlt_schema;
2648
2649     unless ( "SQL::Translator::Producer::$db"->can('preprocess_schema') ) {
2650       my $t = SQL::Translator->new($sqltargs);
2651       $t->debug( 0 );
2652       $t->trace( 0 );
2653
2654       $t->parser( $db )
2655         or $self->throw_exception ($t->error);
2656
2657       my $out = $t->translate( $filename )
2658         or $self->throw_exception ($t->error);
2659
2660       $dest_schema = $t->schema;
2661
2662       $dest_schema->name( $filename )
2663         unless $dest_schema->name;
2664     }
2665
2666     my $diff = SQL::Translator::Diff::schema_diff($source_schema, $db,
2667                                                   $dest_schema,   $db,
2668                                                   $sqltargs
2669                                                  );
2670     if(!open $file, ">$difffile") {
2671       $self->throw_exception("Can't write to $difffile ($!)");
2672       next;
2673     }
2674     print $file $diff;
2675     close($file);
2676   }
2677 }
2678
2679 =head2 deployment_statements
2680
2681 =over 4
2682
2683 =item Arguments: $schema, $type, $version, $directory, $sqlt_args
2684
2685 =back
2686
2687 Returns the statements used by L</deploy> and L<DBIx::Class::Schema/deploy>.
2688
2689 The L<SQL::Translator> (not L<DBI>) database driver name can be explicitly
2690 provided in C<$type>, otherwise the result of L</sqlt_type> is used as default.
2691
2692 C<$directory> is used to return statements from files in a previously created
2693 L</create_ddl_dir> directory and is optional. The filenames are constructed
2694 from L<DBIx::Class::Schema/ddl_filename>, the schema name and the C<$version>.
2695
2696 If no C<$directory> is specified then the statements are constructed on the
2697 fly using L<SQL::Translator> and C<$version> is ignored.
2698
2699 See L<SQL::Translator/METHODS> for a list of values for C<$sqlt_args>.
2700
2701 =cut
2702
2703 sub deployment_statements {
2704   my ($self, $schema, $type, $version, $dir, $sqltargs) = @_;
2705   $type ||= $self->sqlt_type;
2706   $version ||= $schema->schema_version || '1.x';
2707   $dir ||= './';
2708   my $filename = $schema->ddl_filename($type, $version, $dir);
2709   if(-f $filename)
2710   {
2711       # FIXME replace this block when a proper sane sql parser is available
2712       my $file;
2713       open($file, "<$filename")
2714         or $self->throw_exception("Can't open $filename ($!)");
2715       my @rows = <$file>;
2716       close($file);
2717       return join('', @rows);
2718   }
2719
2720   unless (DBIx::Class::Optional::Dependencies->req_ok_for ('deploy') ) {
2721     $self->throw_exception("Can't deploy without a ddl_dir or " . DBIx::Class::Optional::Dependencies->req_missing_for ('deploy') );
2722   }
2723
2724   # sources needs to be a parser arg, but for simplicty allow at top level
2725   # coming in
2726   $sqltargs->{parser_args}{sources} = delete $sqltargs->{sources}
2727       if exists $sqltargs->{sources};
2728
2729   my $tr = SQL::Translator->new(
2730     producer => "SQL::Translator::Producer::${type}",
2731     %$sqltargs,
2732     parser => 'SQL::Translator::Parser::DBIx::Class',
2733     data => $schema,
2734   );
2735
2736   my @ret;
2737   if (wantarray) {
2738     @ret = $tr->translate;
2739   }
2740   else {
2741     $ret[0] = $tr->translate;
2742   }
2743
2744   $self->throw_exception( 'Unable to produce deployment statements: ' . $tr->error)
2745     unless (@ret && defined $ret[0]);
2746
2747   return wantarray ? @ret : $ret[0];
2748 }
2749
2750 # FIXME deploy() currently does not accurately report sql errors
2751 # Will always return true while errors are warned
2752 sub deploy {
2753   my ($self, $schema, $type, $sqltargs, $dir) = @_;
2754   my $deploy = sub {
2755     my $line = shift;
2756     return if(!$line);
2757     return if($line =~ /^--/);
2758     # next if($line =~ /^DROP/m);
2759     return if($line =~ /^BEGIN TRANSACTION/m);
2760     return if($line =~ /^COMMIT/m);
2761     return if $line =~ /^\s+$/; # skip whitespace only
2762     $self->_query_start($line);
2763     try {
2764       # do a dbh_do cycle here, as we need some error checking in
2765       # place (even though we will ignore errors)
2766       $self->dbh_do (sub { $_[1]->do($line) });
2767     } catch {
2768       carp qq{$_ (running "${line}")};
2769     };
2770     $self->_query_end($line);
2771   };
2772   my @statements = $schema->deployment_statements($type, undef, $dir, { %{ $sqltargs || {} }, no_comments => 1 } );
2773   if (@statements > 1) {
2774     foreach my $statement (@statements) {
2775       $deploy->( $statement );
2776     }
2777   }
2778   elsif (@statements == 1) {
2779     # split on single line comments and end of statements
2780     foreach my $line ( split(/\s*--.*\n|;\n/, $statements[0])) {
2781       $deploy->( $line );
2782     }
2783   }
2784 }
2785
2786 =head2 datetime_parser
2787
2788 Returns the datetime parser class
2789
2790 =cut
2791
2792 sub datetime_parser {
2793   my $self = shift;
2794   return $self->{datetime_parser} ||= do {
2795     $self->build_datetime_parser(@_);
2796   };
2797 }
2798
2799 =head2 datetime_parser_type
2800
2801 Defines the datetime parser class - currently defaults to L<DateTime::Format::MySQL>
2802
2803 =head2 build_datetime_parser
2804
2805 See L</datetime_parser>
2806
2807 =cut
2808
2809 sub build_datetime_parser {
2810   my $self = shift;
2811   my $type = $self->datetime_parser_type(@_);
2812   return $type;
2813 }
2814
2815
2816 =head2 is_replicating
2817
2818 A boolean that reports if a particular L<DBIx::Class::Storage::DBI> is set to
2819 replicate from a master database.  Default is undef, which is the result
2820 returned by databases that don't support replication.
2821
2822 =cut
2823
2824 sub is_replicating {
2825     return;
2826
2827 }
2828
2829 =head2 lag_behind_master
2830
2831 Returns a number that represents a certain amount of lag behind a master db
2832 when a given storage is replicating.  The number is database dependent, but
2833 starts at zero and increases with the amount of lag. Default in undef
2834
2835 =cut
2836
2837 sub lag_behind_master {
2838     return;
2839 }
2840
2841 =head2 relname_to_table_alias
2842
2843 =over 4
2844
2845 =item Arguments: $relname, $join_count
2846
2847 =back
2848
2849 L<DBIx::Class> uses L<DBIx::Class::Relationship> names as table aliases in
2850 queries.
2851
2852 This hook is to allow specific L<DBIx::Class::Storage> drivers to change the
2853 way these aliases are named.
2854
2855 The default behavior is C<< "$relname_$join_count" if $join_count > 1 >>,
2856 otherwise C<"$relname">.
2857
2858 =cut
2859
2860 sub relname_to_table_alias {
2861   my ($self, $relname, $join_count) = @_;
2862
2863   my $alias = ($join_count && $join_count > 1 ?
2864     join('_', $relname, $join_count) : $relname);
2865
2866   return $alias;
2867 }
2868
2869 # The size in bytes to use for DBI's ->bind_param_inout, this is the generic
2870 # version and it may be necessary to amend or override it for a specific storage
2871 # if such binds are necessary.
2872 sub _max_column_bytesize {
2873   my ($self, $attr) = @_;
2874
2875   my $max_size;
2876
2877   if ($attr->{sqlt_datatype}) {
2878     my $data_type = lc($attr->{sqlt_datatype});
2879
2880     if ($attr->{sqlt_size}) {
2881
2882       # String/sized-binary types
2883       if ($data_type =~ /^(?:
2884           l? (?:var)? char(?:acter)? (?:\s*varying)?
2885             |
2886           (?:var)? binary (?:\s*varying)?
2887             |
2888           raw
2889         )\b/x
2890       ) {
2891         $max_size = $attr->{sqlt_size};
2892       }
2893       # Other charset/unicode types, assume scale of 4
2894       elsif ($data_type =~ /^(?:
2895           national \s* character (?:\s*varying)?
2896             |
2897           nchar
2898             |
2899           univarchar
2900             |
2901           nvarchar
2902         )\b/x
2903       ) {
2904         $max_size = $attr->{sqlt_size} * 4;
2905       }
2906     }
2907
2908     if (!$max_size and !$self->_is_lob_type($data_type)) {
2909       $max_size = 100 # for all other (numeric?) datatypes
2910     }
2911   }
2912
2913   $max_size || $self->_dbic_connect_attributes->{LongReadLen} || $self->_get_dbh->{LongReadLen} || 8000;
2914 }
2915
2916 # Determine if a data_type is some type of BLOB
2917 sub _is_lob_type {
2918   my ($self, $data_type) = @_;
2919   $data_type && ($data_type =~ /lob|bfile|text|image|bytea|memo/i
2920     || $data_type =~ /^long(?:\s+(?:raw|bit\s*varying|varbit|binary
2921                                   |varchar|character\s*varying|nvarchar
2922                                   |national\s*character\s*varying))?\z/xi);
2923 }
2924
2925 sub _is_binary_lob_type {
2926   my ($self, $data_type) = @_;
2927   $data_type && ($data_type =~ /blob|bfile|image|bytea/i
2928     || $data_type =~ /^long(?:\s+(?:raw|bit\s*varying|varbit|binary))?\z/xi);
2929 }
2930
2931 sub _is_text_lob_type {
2932   my ($self, $data_type) = @_;
2933   $data_type && ($data_type =~ /^(?:clob|memo)\z/i
2934     || $data_type =~ /^long(?:\s+(?:varchar|character\s*varying|nvarchar
2935                         |national\s*character\s*varying))\z/xi);
2936 }
2937
2938 1;
2939
2940 =head1 USAGE NOTES
2941
2942 =head2 DBIx::Class and AutoCommit
2943
2944 DBIx::Class can do some wonderful magic with handling exceptions,
2945 disconnections, and transactions when you use C<< AutoCommit => 1 >>
2946 (the default) combined with L<txn_do|DBIx::Class::Storage/txn_do> for
2947 transaction support.
2948
2949 If you set C<< AutoCommit => 0 >> in your connect info, then you are always
2950 in an assumed transaction between commits, and you're telling us you'd
2951 like to manage that manually.  A lot of the magic protections offered by
2952 this module will go away.  We can't protect you from exceptions due to database
2953 disconnects because we don't know anything about how to restart your
2954 transactions.  You're on your own for handling all sorts of exceptional
2955 cases if you choose the C<< AutoCommit => 0 >> path, just as you would
2956 be with raw DBI.
2957
2958
2959 =head1 AUTHORS
2960
2961 Matt S. Trout <mst@shadowcatsystems.co.uk>
2962
2963 Andy Grundman <andy@hybridized.org>
2964
2965 =head1 LICENSE
2966
2967 You may distribute this code under the same terms as Perl itself.
2968
2969 =cut