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