Lose yet another dep (Data::Dumper::Concise)
[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 dump_value
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   carp_once ($msg . ' While we will attempt to continue anyway, the results '
1423   . 'are likely to be underwhelming. Please upgrade DBIC, and if this message '
1424   . "does not go away, file a bugreport including the following info:\n"
1425   . dump_value $self->_describe_connection
1426   );
1427 }
1428
1429 sub _do_connection_actions {
1430   my ($self, $method_prefix, $call, @args) = @_;
1431
1432   dbic_internal_try {
1433     if (not ref($call)) {
1434       my $method = $method_prefix . $call;
1435       $self->$method(@args);
1436     }
1437     elsif (ref($call) eq 'CODE') {
1438       $self->$call(@args);
1439     }
1440     elsif (ref($call) eq 'ARRAY') {
1441       if (ref($call->[0]) ne 'ARRAY') {
1442         $self->_do_connection_actions($method_prefix, $_) for @$call;
1443       }
1444       else {
1445         $self->_do_connection_actions($method_prefix, @$_) for @$call;
1446       }
1447     }
1448     else {
1449       $self->throw_exception (sprintf ("Don't know how to process conection actions of type '%s'", ref($call)) );
1450     }
1451   }
1452   catch {
1453     if ( $method_prefix =~ /^connect/ ) {
1454       # this is an on_connect cycle - we can't just throw while leaving
1455       # a handle in an undefined state in our storage object
1456       # kill it with fire and rethrow
1457       $self->_dbh(undef);
1458       $self->disconnect;  # the $dbh is gone, but we still need to reset the rest
1459       $self->throw_exception( $_[0] );
1460     }
1461     else {
1462       carp "Disconnect action failed: $_[0]";
1463     }
1464   };
1465
1466   return $self;
1467 }
1468
1469 sub connect_call_do_sql {
1470   my $self = shift;
1471   $self->_do_query(@_);
1472 }
1473
1474 sub disconnect_call_do_sql {
1475   my $self = shift;
1476   $self->_do_query(@_);
1477 }
1478
1479 =head2 connect_call_datetime_setup
1480
1481 A no-op stub method, provided so that one can always safely supply the
1482 L<connection option|/DBIx::Class specific connection attributes>
1483
1484  on_connect_call => 'datetime_setup'
1485
1486 This way one does not need to know in advance whether the underlying
1487 storage requires any sort of hand-holding when dealing with calendar
1488 data.
1489
1490 =cut
1491
1492 sub connect_call_datetime_setup { 1 }
1493
1494 sub _do_query {
1495   my ($self, $action) = @_;
1496
1497   if (ref $action eq 'CODE') {
1498     $action = $action->($self);
1499     $self->_do_query($_) foreach @$action;
1500   }
1501   else {
1502     # Most debuggers expect ($sql, @bind), so we need to exclude
1503     # the attribute hash which is the second argument to $dbh->do
1504     # furthermore the bind values are usually to be presented
1505     # as named arrayref pairs, so wrap those here too
1506     my @do_args = (ref $action eq 'ARRAY') ? (@$action) : ($action);
1507     my $sql = shift @do_args;
1508     my $attrs = shift @do_args;
1509     my @bind = map { [ undef, $_ ] } @do_args;
1510
1511     $self->dbh_do(sub {
1512       $_[0]->_query_start($sql, \@bind);
1513       $_[1]->do($sql, $attrs, @do_args);
1514       $_[0]->_query_end($sql, \@bind);
1515     });
1516   }
1517
1518   return $self;
1519 }
1520
1521 sub _connect {
1522   my $self = shift;
1523
1524   my $info = $self->_dbi_connect_info;
1525
1526   $self->throw_exception("You did not provide any connection_info")
1527     unless defined $info->[0];
1528
1529   my ($old_connect_via, $dbh);
1530
1531   local $DBI::connect_via = 'connect' if $INC{'Apache/DBI.pm'} && $ENV{MOD_PERL};
1532
1533   # this odd anonymous coderef dereference is in fact really
1534   # necessary to avoid the unwanted effect described in perl5
1535   # RT#75792
1536   #
1537   # in addition the coderef itself can't reside inside the try{} block below
1538   # as it somehow triggers a leak under perl -d
1539   my $dbh_error_handler_installer = sub {
1540     weaken (my $weak_self = $_[0]);
1541
1542     # the coderef is blessed so we can distinguish it from externally
1543     # supplied handles (which must be preserved)
1544     $_[1]->{HandleError} = bless sub {
1545       if ($weak_self) {
1546         $weak_self->throw_exception("DBI Exception: $_[0]");
1547       }
1548       else {
1549         # the handler may be invoked by something totally out of
1550         # the scope of DBIC
1551         DBIx::Class::Exception->throw("DBI Exception (unhandled by DBIC, ::Schema GCed): $_[0]");
1552       }
1553     }, '__DBIC__DBH__ERROR__HANDLER__';
1554   };
1555
1556   dbic_internal_try {
1557     if(ref $info->[0] eq 'CODE') {
1558       $dbh = $info->[0]->();
1559     }
1560     else {
1561       require DBI;
1562       $dbh = DBI->connect(@$info);
1563     }
1564
1565     die $DBI::errstr unless $dbh;
1566
1567     die sprintf ("%s fresh DBI handle with a *false* 'Active' attribute. "
1568       . 'This handle is disconnected as far as DBIC is concerned, and we can '
1569       . 'not continue',
1570       ref $info->[0] eq 'CODE'
1571         ? "Connection coderef $info->[0] returned a"
1572         : 'DBI->connect($schema->storage->connect_info) resulted in a'
1573     ) unless $dbh->FETCH('Active');
1574
1575     # sanity checks unless asked otherwise
1576     unless ($self->unsafe) {
1577
1578       $self->throw_exception(
1579         'Refusing clobbering of {HandleError} installed on externally supplied '
1580        ."DBI handle $dbh. Either remove the handler or use the 'unsafe' attribute."
1581       ) if $dbh->{HandleError} and ref $dbh->{HandleError} ne '__DBIC__DBH__ERROR__HANDLER__';
1582
1583       # Default via _default_dbi_connect_attributes is 1, hence it was an explicit
1584       # request, or an external handle. Complain and set anyway
1585       unless ($dbh->{RaiseError}) {
1586         carp( ref $info->[0] eq 'CODE'
1587
1588           ? "The 'RaiseError' of the externally supplied DBI handle is set to false. "
1589            ."DBIx::Class will toggle it back to true, unless the 'unsafe' connect "
1590            .'attribute has been supplied'
1591
1592           : 'RaiseError => 0 supplied in your connection_info, without an explicit '
1593            .'unsafe => 1. Toggling RaiseError back to true'
1594         );
1595
1596         $dbh->{RaiseError} = 1;
1597       }
1598
1599       $dbh_error_handler_installer->($self, $dbh);
1600     }
1601   }
1602   catch {
1603     $self->throw_exception("DBI Connection failed: $_")
1604   };
1605
1606   $self->_dbh_autocommit($dbh->{AutoCommit});
1607   return $dbh;
1608 }
1609
1610 sub txn_begin {
1611   # this means we have not yet connected and do not know the AC status
1612   # (e.g. coderef $dbh), need a full-fledged connection check
1613   if (! defined $_[0]->_dbh_autocommit) {
1614     $_[0]->ensure_connected;
1615   }
1616   # Otherwise simply connect or re-connect on pid changes
1617   else {
1618     $_[0]->_get_dbh;
1619   }
1620
1621   shift->next::method(@_);
1622 }
1623
1624 sub _exec_txn_begin {
1625   my $self = shift;
1626
1627   # if the user is utilizing txn_do - good for him, otherwise we need to
1628   # ensure that the $dbh is healthy on BEGIN.
1629   # We do this via ->dbh_do instead of ->dbh, so that the ->dbh "ping"
1630   # will be replaced by a failure of begin_work itself (which will be
1631   # then retried on reconnect)
1632   if ($self->{_in_do_block}) {
1633     $self->_dbh->begin_work;
1634   } else {
1635     $self->dbh_do(sub { $_[1]->begin_work });
1636   }
1637 }
1638
1639 sub txn_commit {
1640   my $self = shift;
1641
1642   $self->throw_exception("Unable to txn_commit() on a disconnected storage")
1643     unless $self->_seems_connected;
1644
1645   # esoteric case for folks using external $dbh handles
1646   if (! $self->transaction_depth and ! $self->_dbh->FETCH('AutoCommit') ) {
1647     carp "Storage transaction_depth 0 does not match "
1648         ."false AutoCommit of $self->{_dbh}, attempting COMMIT anyway";
1649     $self->transaction_depth(1);
1650   }
1651
1652   $self->next::method(@_);
1653
1654   # if AutoCommit is disabled txn_depth never goes to 0
1655   # as a new txn is started immediately on commit
1656   $self->transaction_depth(1) if (
1657     !$self->transaction_depth
1658       and
1659     defined $self->_dbh_autocommit
1660       and
1661     ! $self->_dbh_autocommit
1662   );
1663 }
1664
1665 sub _exec_txn_commit {
1666   shift->_dbh->commit;
1667 }
1668
1669 sub txn_rollback {
1670   my $self = shift;
1671
1672   # do a minimal connectivity check due to weird shit like
1673   # https://rt.cpan.org/Public/Bug/Display.html?id=62370
1674   $self->throw_exception("lost connection to storage")
1675     unless $self->_seems_connected;
1676
1677   # esoteric case for folks using external $dbh handles
1678   if (! $self->transaction_depth and ! $self->_dbh->FETCH('AutoCommit') ) {
1679     carp "Storage transaction_depth 0 does not match "
1680         ."false AutoCommit of $self->{_dbh}, attempting ROLLBACK anyway";
1681     $self->transaction_depth(1);
1682   }
1683
1684   $self->next::method(@_);
1685
1686   # if AutoCommit is disabled txn_depth never goes to 0
1687   # as a new txn is started immediately on commit
1688   $self->transaction_depth(1) if (
1689     !$self->transaction_depth
1690       and
1691     defined $self->_dbh_autocommit
1692       and
1693     ! $self->_dbh_autocommit
1694   );
1695 }
1696
1697 sub _exec_txn_rollback {
1698   shift->_dbh->rollback;
1699 }
1700
1701 # generate the DBI-specific stubs, which then fallback to ::Storage proper
1702 quote_sub __PACKAGE__ . "::$_" => sprintf (<<'EOS', $_) for qw(svp_begin svp_release svp_rollback);
1703   $_[0]->throw_exception('Unable to %s() on a disconnected storage')
1704     unless $_[0]->_seems_connected;
1705   shift->next::method(@_);
1706 EOS
1707
1708 # This used to be the top-half of _execute.  It was split out to make it
1709 #  easier to override in NoBindVars without duping the rest.  It takes up
1710 #  all of _execute's args, and emits $sql, @bind.
1711 sub _prep_for_execute {
1712   #my ($self, $op, $ident, $args) = @_;
1713   return shift->_gen_sql_bind(@_)
1714 }
1715
1716 sub _gen_sql_bind {
1717   my ($self, $op, $ident, $args) = @_;
1718
1719   my ($colinfos, $from);
1720   if ( blessed($ident) ) {
1721     $from = $ident->from;
1722     $colinfos = $ident->columns_info;
1723   }
1724
1725   my ($sql, $bind);
1726   ($sql, @$bind) = $self->sql_maker->$op( ($from || $ident), @$args );
1727
1728   $bind = $self->_resolve_bindattrs(
1729     $ident, [ @{$args->[2]{bind}||[]}, @$bind ], $colinfos
1730   );
1731
1732   if (
1733     ! $ENV{DBIC_DT_SEARCH_OK}
1734       and
1735     $op eq 'select'
1736       and
1737     first {
1738       length ref $_->[1]
1739         and
1740       blessed($_->[1])
1741         and
1742       $_->[1]->isa('DateTime')
1743     } @$bind
1744   ) {
1745     carp_unique 'DateTime objects passed to search() are not supported '
1746       . 'properly (InflateColumn::DateTime formats and settings are not '
1747       . 'respected.) See ".. format a DateTime object for searching?" in '
1748       . 'DBIx::Class::Manual::FAQ. To disable this warning for good '
1749       . 'set $ENV{DBIC_DT_SEARCH_OK} to true'
1750   }
1751
1752   return( $sql, $bind );
1753 }
1754
1755 sub _resolve_bindattrs {
1756   my ($self, $ident, $bind, $colinfos) = @_;
1757
1758   my $resolve_bindinfo = sub {
1759     #my $infohash = shift;
1760
1761     $colinfos ||= { %{ $self->_resolve_column_info($ident) } };
1762
1763     my $ret;
1764     if (my $col = $_[0]->{dbic_colname}) {
1765       $ret = { %{$_[0]} };
1766
1767       $ret->{sqlt_datatype} ||= $colinfos->{$col}{data_type}
1768         if $colinfos->{$col}{data_type};
1769
1770       $ret->{sqlt_size} ||= $colinfos->{$col}{size}
1771         if $colinfos->{$col}{size};
1772     }
1773
1774     $ret || $_[0];
1775   };
1776
1777   return [ map {
1778       ( ref $_ ne 'ARRAY' or @$_ != 2 ) ? [ {}, $_ ]
1779     : ( ! defined $_->[0] )             ? [ {}, $_->[1] ]
1780     : (ref $_->[0] eq 'HASH')           ? [(
1781                                             ! keys %{$_->[0]}
1782                                               or
1783                                             exists $_->[0]{dbd_attrs}
1784                                               or
1785                                             $_->[0]{sqlt_datatype}
1786                                            ) ? $_->[0]
1787                                              : $resolve_bindinfo->($_->[0])
1788                                            , $_->[1]
1789                                           ]
1790     : (ref $_->[0] eq 'SCALAR')         ? [ { sqlt_datatype => ${$_->[0]} }, $_->[1] ]
1791     :                                     [ $resolve_bindinfo->(
1792                                               { dbic_colname => $_->[0] }
1793                                             ), $_->[1] ]
1794   } @$bind ];
1795 }
1796
1797 sub _format_for_trace {
1798   #my ($self, $bind) = @_;
1799
1800   ### Turn @bind from something like this:
1801   ###   ( [ "artist", 1 ], [ \%attrs, 3 ] )
1802   ### to this:
1803   ###   ( "'1'", "'3'" )
1804
1805   map {
1806     defined( $_ && $_->[1] )
1807       ? qq{'$_->[1]'}
1808       : q{NULL}
1809   } @{$_[1] || []};
1810 }
1811
1812 sub _query_start {
1813   my ( $self, $sql, $bind ) = @_;
1814
1815   $self->debugobj->query_start( $sql, $self->_format_for_trace($bind) )
1816     if $self->debug;
1817 }
1818
1819 sub _query_end {
1820   my ( $self, $sql, $bind ) = @_;
1821
1822   $self->debugobj->query_end( $sql, $self->_format_for_trace($bind) )
1823     if $self->debug;
1824 }
1825
1826 sub _dbi_attrs_for_bind {
1827   #my ($self, $ident, $bind) = @_;
1828
1829   return [ map {
1830
1831     exists $_->{dbd_attrs}  ?  $_->{dbd_attrs}
1832
1833   : ! $_->{sqlt_datatype}   ? undef
1834
1835   :                           do {
1836
1837     # cache the result in the dbh_details hash, as it (usually) can not change
1838     # unless we connect to something else
1839     # FIXME: for the time being Oracle is an exception, pending a rewrite of
1840     # the LOB storage
1841     my $cache = $_[0]->_dbh_details->{_datatype_map_cache} ||= {};
1842
1843     $cache->{$_->{sqlt_datatype}} = $_[0]->bind_attribute_by_data_type($_->{sqlt_datatype})
1844       if ! exists $cache->{$_->{sqlt_datatype}};
1845
1846     $cache->{$_->{sqlt_datatype}};
1847
1848   } } map { $_->[0] } @{$_[2]} ];
1849 }
1850
1851 sub _execute {
1852   my ($self, $op, $ident, @args) = @_;
1853
1854   my ($sql, $bind) = $self->_prep_for_execute($op, $ident, \@args);
1855
1856   # not even a PID check - we do not care about the state of the _dbh.
1857   # All we need is to get the appropriate drivers loaded if they aren't
1858   # already so that the assumption in ad7c50fc26e holds
1859   $self->_populate_dbh unless $self->_dbh;
1860
1861   $self->dbh_do( _dbh_execute =>     # retry over disconnects
1862     $sql,
1863     $bind,
1864     $self->_dbi_attrs_for_bind($ident, $bind),
1865   );
1866 }
1867
1868 sub _dbh_execute {
1869   my ($self, $dbh, $sql, $bind, $bind_attrs) = @_;
1870
1871   $self->_query_start( $sql, $bind );
1872
1873   my $sth = $self->_bind_sth_params(
1874     $self->_prepare_sth($dbh, $sql),
1875     $bind,
1876     $bind_attrs,
1877   );
1878
1879   # Can this fail without throwing an exception anyways???
1880   my $rv = $sth->execute();
1881   $self->throw_exception(
1882     $sth->errstr || $sth->err || 'Unknown error: execute() returned false, but error flags were not set...'
1883   ) if !$rv;
1884
1885   $self->_query_end( $sql, $bind );
1886
1887   return (wantarray ? ($rv, $sth, @$bind) : $rv);
1888 }
1889
1890 sub _prepare_sth {
1891   my ($self, $dbh, $sql) = @_;
1892
1893   # 3 is the if_active parameter which avoids active sth re-use
1894   my $sth = $self->disable_sth_caching
1895     ? $dbh->prepare($sql)
1896     : $dbh->prepare_cached($sql, {}, 3);
1897
1898   # XXX You would think RaiseError would make this impossible,
1899   #  but apparently that's not true :(
1900   $self->throw_exception(
1901     $dbh->errstr
1902       ||
1903     sprintf( "\$dbh->prepare() of '%s' through %s failed *silently* without "
1904             .'an exception and/or setting $dbh->errstr',
1905       length ($sql) > 20
1906         ? substr($sql, 0, 20) . '...'
1907         : $sql
1908       ,
1909       'DBD::' . $dbh->{Driver}{Name},
1910     )
1911   ) if !$sth;
1912
1913   $sth;
1914 }
1915
1916 sub _bind_sth_params {
1917   my ($self, $sth, $bind, $bind_attrs) = @_;
1918
1919   for my $i (0 .. $#$bind) {
1920     if (ref $bind->[$i][1] eq 'SCALAR') {  # any scalarrefs are assumed to be bind_inouts
1921       $sth->bind_param_inout(
1922         $i + 1, # bind params counts are 1-based
1923         $bind->[$i][1],
1924         $bind->[$i][0]{dbd_size} || $self->_max_column_bytesize($bind->[$i][0]), # size
1925         $bind_attrs->[$i],
1926       );
1927     }
1928     else {
1929       # FIXME SUBOPTIMAL - DBI needs fixing to always stringify regardless of DBD
1930       my $v = ( length ref $bind->[$i][1] and is_plain_value $bind->[$i][1] )
1931         ? "$bind->[$i][1]"
1932         : $bind->[$i][1]
1933       ;
1934
1935       $sth->bind_param(
1936         $i + 1,
1937         # The temp-var is CRUCIAL - DO NOT REMOVE IT, breaks older DBD::SQLite RT#79576
1938         $v,
1939         $bind_attrs->[$i],
1940       );
1941     }
1942   }
1943
1944   $sth;
1945 }
1946
1947 sub _prefetch_autovalues {
1948   my ($self, $source, $colinfo, $to_insert) = @_;
1949
1950   my %values;
1951   for my $col (keys %$colinfo) {
1952     if (
1953       $colinfo->{$col}{auto_nextval}
1954         and
1955       (
1956         ! exists $to_insert->{$col}
1957           or
1958         is_literal_value($to_insert->{$col})
1959       )
1960     ) {
1961       $values{$col} = $self->_sequence_fetch(
1962         'NEXTVAL',
1963         ( $colinfo->{$col}{sequence} ||=
1964             $self->_dbh_get_autoinc_seq($self->_get_dbh, $source, $col)
1965         ),
1966       );
1967     }
1968   }
1969
1970   \%values;
1971 }
1972
1973 sub insert {
1974   my ($self, $source, $to_insert) = @_;
1975
1976   my $col_infos = $source->columns_info;
1977
1978   my $prefetched_values = $self->_prefetch_autovalues($source, $col_infos, $to_insert);
1979
1980   # fuse the values, but keep a separate list of prefetched_values so that
1981   # they can be fused once again with the final return
1982   $to_insert = { %$to_insert, %$prefetched_values };
1983
1984   # FIXME - we seem to assume undef values as non-supplied. This is wrong.
1985   # Investigate what does it take to s/defined/exists/
1986   my %pcols = map { $_ => 1 } $source->primary_columns;
1987   my (%retrieve_cols, $autoinc_supplied, $retrieve_autoinc_col);
1988   for my $col ($source->columns) {
1989     if ($col_infos->{$col}{is_auto_increment}) {
1990       $autoinc_supplied ||= 1 if defined $to_insert->{$col};
1991       $retrieve_autoinc_col ||= $col unless $autoinc_supplied;
1992     }
1993
1994     # nothing to retrieve when explicit values are supplied
1995     next if (
1996       defined $to_insert->{$col} and ! is_literal_value($to_insert->{$col})
1997     );
1998
1999     # the 'scalar keys' is a trick to preserve the ->columns declaration order
2000     $retrieve_cols{$col} = scalar keys %retrieve_cols if (
2001       $pcols{$col}
2002         or
2003       $col_infos->{$col}{retrieve_on_insert}
2004     );
2005   };
2006
2007   local $self->{_autoinc_supplied_for_op} = $autoinc_supplied;
2008   local $self->{_perform_autoinc_retrieval} = $retrieve_autoinc_col;
2009
2010   my ($sqla_opts, @ir_container);
2011   if (%retrieve_cols and $self->_use_insert_returning) {
2012     $sqla_opts->{returning_container} = \@ir_container
2013       if $self->_use_insert_returning_bound;
2014
2015     $sqla_opts->{returning} = [
2016       sort { $retrieve_cols{$a} <=> $retrieve_cols{$b} } keys %retrieve_cols
2017     ];
2018   }
2019
2020   my ($rv, $sth) = $self->_execute('insert', $source, $to_insert, $sqla_opts);
2021
2022   my %returned_cols = %$to_insert;
2023   if (my $retlist = $sqla_opts->{returning}) {  # if IR is supported - we will get everything in one set
2024
2025     unless( @ir_container ) {
2026       dbic_internal_try {
2027
2028         # FIXME - need to investigate why Caelum silenced this in 4d4dc518
2029         local $SIG{__WARN__} = sub {};
2030
2031         @ir_container = $sth->fetchrow_array;
2032         $sth->finish;
2033
2034       } catch {
2035         # Evict the $sth from the cache in case we got here, since the finish()
2036         # is crucial, at least on older Firebirds, possibly on other engines too
2037         #
2038         # It would be too complex to make this a proper subclass override,
2039         # and besides we already take the try{} penalty, adding a catch that
2040         # triggers infrequently is a no-brainer
2041         #
2042         if( my $kids = $self->_dbh->{CachedKids} ) {
2043           $kids->{$_} == $sth and delete $kids->{$_}
2044             for keys %$kids
2045         }
2046       };
2047     }
2048
2049     @returned_cols{@$retlist} = @ir_container if @ir_container;
2050   }
2051   else {
2052     # pull in PK if needed and then everything else
2053     if (my @missing_pri = grep { $pcols{$_} } keys %retrieve_cols) {
2054
2055       $self->throw_exception( "Missing primary key but Storage doesn't support last_insert_id" )
2056         unless $self->can('last_insert_id');
2057
2058       my @pri_values = $self->last_insert_id($source, @missing_pri);
2059
2060       $self->throw_exception( "Can't get last insert id" )
2061         unless (@pri_values == @missing_pri);
2062
2063       @returned_cols{@missing_pri} = @pri_values;
2064       delete @retrieve_cols{@missing_pri};
2065     }
2066
2067     # if there is more left to pull
2068     if (%retrieve_cols) {
2069       $self->throw_exception(
2070         'Unable to retrieve additional columns without a Primary Key on ' . $source->source_name
2071       ) unless %pcols;
2072
2073       my @left_to_fetch = sort { $retrieve_cols{$a} <=> $retrieve_cols{$b} } keys %retrieve_cols;
2074
2075       my $cur = DBIx::Class::ResultSet->new($source, {
2076         where => { map { $_ => $returned_cols{$_} } (keys %pcols) },
2077         select => \@left_to_fetch,
2078       })->cursor;
2079
2080       @returned_cols{@left_to_fetch} = $cur->next;
2081
2082       $self->throw_exception('Duplicate row returned for PK-search after fresh insert')
2083         if scalar $cur->next;
2084     }
2085   }
2086
2087   return { %$prefetched_values, %returned_cols };
2088 }
2089
2090 sub insert_bulk {
2091   carp_unique(
2092     'insert_bulk() should have never been exposed as a public method and '
2093   . 'calling it is depecated as of Aug 2014. If you believe having a genuine '
2094   . 'use for this method please contact the development team via '
2095   . DBIx::Class::_ENV_::HELP_URL
2096   );
2097
2098   return '0E0' unless @{$_[3]||[]};
2099
2100   shift->_insert_bulk(@_);
2101 }
2102
2103 sub _insert_bulk {
2104   my ($self, $source, $cols, $data) = @_;
2105
2106   $self->throw_exception('Calling _insert_bulk without a dataset to process makes no sense')
2107     unless @{$data||[]};
2108
2109   my $colinfos = $source->columns_info($cols);
2110
2111   local $self->{_autoinc_supplied_for_op} =
2112     (grep { $_->{is_auto_increment} } values %$colinfos)
2113       ? 1
2114       : 0
2115   ;
2116
2117   # get a slice type index based on first row of data
2118   # a "column" in this context may refer to more than one bind value
2119   # e.g. \[ '?, ?', [...], [...] ]
2120   #
2121   # construct the value type index - a description of values types for every
2122   # per-column slice of $data:
2123   #
2124   # nonexistent - nonbind literal
2125   # 0 - regular value
2126   # [] of bindattrs - resolved attribute(s) of bind(s) passed via literal+bind \[] combo
2127   #
2128   # also construct the column hash to pass to the SQL generator. For plain
2129   # (non literal) values - convert the members of the first row into a
2130   # literal+bind combo, with extra positional info in the bind attr hashref.
2131   # This will allow us to match the order properly, and is so contrived
2132   # because a user-supplied literal/bind (or something else specific to a
2133   # resultsource and/or storage driver) can inject extra binds along the
2134   # way, so one can't rely on "shift positions" ordering at all. Also we
2135   # can't just hand SQLA a set of some known "values" (e.g. hashrefs that
2136   # can be later matched up by address), because we want to supply a real
2137   # value on which perhaps e.g. datatype checks will be performed
2138   my ($proto_data, $serialized_bind_type_by_col_idx);
2139   for my $col_idx (0..$#$cols) {
2140     my $colname = $cols->[$col_idx];
2141     if (ref $data->[0][$col_idx] eq 'SCALAR') {
2142       # no bind value at all - no type
2143
2144       $proto_data->{$colname} = $data->[0][$col_idx];
2145     }
2146     elsif (ref $data->[0][$col_idx] eq 'REF' and ref ${$data->[0][$col_idx]} eq 'ARRAY' ) {
2147       # repack, so we don't end up mangling the original \[]
2148       my ($sql, @bind) = @${$data->[0][$col_idx]};
2149
2150       # normalization of user supplied stuff
2151       my $resolved_bind = $self->_resolve_bindattrs(
2152         $source, \@bind, $colinfos,
2153       );
2154
2155       # store value-less (attrs only) bind info - we will be comparing all
2156       # supplied binds against this for sanity
2157       $serialized_bind_type_by_col_idx->{$col_idx} = serialize [ map { $_->[0] } @$resolved_bind ];
2158
2159       $proto_data->{$colname} = \[ $sql, map { [
2160         # inject slice order to use for $proto_bind construction
2161           { %{$resolved_bind->[$_][0]}, _bind_data_slice_idx => $col_idx, _literal_bind_subindex => $_+1 }
2162             =>
2163           $resolved_bind->[$_][1]
2164         ] } (0 .. $#bind)
2165       ];
2166     }
2167     else {
2168       $serialized_bind_type_by_col_idx->{$col_idx} = undef;
2169
2170       $proto_data->{$colname} = \[ '?', [
2171         { dbic_colname => $colname, _bind_data_slice_idx => $col_idx }
2172           =>
2173         $data->[0][$col_idx]
2174       ] ];
2175     }
2176   }
2177
2178   my ($sql, $proto_bind) = $self->_prep_for_execute (
2179     'insert',
2180     $source,
2181     [ $proto_data ],
2182   );
2183
2184   if (! @$proto_bind and keys %$serialized_bind_type_by_col_idx) {
2185     # if the bindlist is empty and we had some dynamic binds, this means the
2186     # storage ate them away (e.g. the NoBindVars component) and interpolated
2187     # them directly into the SQL. This obviously can't be good for multi-inserts
2188     $self->throw_exception('Unable to invoke fast-path insert without storage placeholder support');
2189   }
2190
2191   # sanity checks
2192   # FIXME - devise a flag "no babysitting" or somesuch to shut this off
2193   #
2194   # use an error reporting closure for convenience (less to pass)
2195   my $bad_slice_report_cref = sub {
2196     my ($msg, $r_idx, $c_idx) = @_;
2197     $self->throw_exception(sprintf "%s for column '%s' in populate slice:\n%s",
2198       $msg,
2199       $cols->[$c_idx],
2200       do {
2201         local $Data::Dumper::Maxdepth = 5;
2202         dump_value {
2203           map { $cols->[$_] =>
2204             $data->[$r_idx][$_]
2205           } 0..$#$cols
2206         };
2207       }
2208     );
2209   };
2210
2211   for my $col_idx (0..$#$cols) {
2212     my $reference_val = $data->[0][$col_idx];
2213
2214     for my $row_idx (1..$#$data) {  # we are comparing against what we got from [0] above, hence start from 1
2215       my $val = $data->[$row_idx][$col_idx];
2216
2217       if (! exists $serialized_bind_type_by_col_idx->{$col_idx}) { # literal no binds
2218         if (ref $val ne 'SCALAR') {
2219           $bad_slice_report_cref->(
2220             "Incorrect value (expecting SCALAR-ref \\'$$reference_val')",
2221             $row_idx,
2222             $col_idx,
2223           );
2224         }
2225         elsif ($$val ne $$reference_val) {
2226           $bad_slice_report_cref->(
2227             "Inconsistent literal SQL value (expecting \\'$$reference_val')",
2228             $row_idx,
2229             $col_idx,
2230           );
2231         }
2232       }
2233       elsif (! defined $serialized_bind_type_by_col_idx->{$col_idx} ) {  # regular non-literal value
2234         if (is_literal_value($val)) {
2235           $bad_slice_report_cref->("Literal SQL found where a plain bind value is expected", $row_idx, $col_idx);
2236         }
2237       }
2238       else {  # binds from a \[], compare type and attrs
2239         if (ref $val ne 'REF' or ref $$val ne 'ARRAY') {
2240           $bad_slice_report_cref->(
2241             "Incorrect value (expecting ARRAYREF-ref \\['${$reference_val}->[0]', ... ])",
2242             $row_idx,
2243             $col_idx,
2244           );
2245         }
2246         # start drilling down and bail out early on identical refs
2247         elsif (
2248           $reference_val != $val
2249             or
2250           $$reference_val != $$val
2251         ) {
2252           if (${$val}->[0] ne ${$reference_val}->[0]) {
2253             $bad_slice_report_cref->(
2254               "Inconsistent literal/bind SQL (expecting \\['${$reference_val}->[0]', ... ])",
2255               $row_idx,
2256               $col_idx,
2257             );
2258           }
2259           # need to check the bind attrs - a bind will happen only once for
2260           # the entire dataset, so any changes further down will be ignored.
2261           elsif (
2262             $serialized_bind_type_by_col_idx->{$col_idx}
2263               ne
2264             serialize [
2265               map
2266               { $_->[0] }
2267               @{$self->_resolve_bindattrs(
2268                 $source, [ @{$$val}[1 .. $#$$val] ], $colinfos,
2269               )}
2270             ]
2271           ) {
2272             $bad_slice_report_cref->(
2273               'Differing bind attributes on literal/bind values not supported',
2274               $row_idx,
2275               $col_idx,
2276             );
2277           }
2278         }
2279       }
2280     }
2281   }
2282
2283   # neither _dbh_execute_for_fetch, nor _dbh_execute_inserts_with_no_binds
2284   # are atomic (even if execute_for_fetch is a single call). Thus a safety
2285   # scope guard
2286   my $guard = $self->txn_scope_guard;
2287
2288   $self->_query_start( $sql, @$proto_bind ? [[ {} => '__BULK_INSERT__' ]] : () );
2289   my $sth = $self->_prepare_sth($self->_dbh, $sql);
2290   my $rv = do {
2291     if (@$proto_bind) {
2292       # proto bind contains the information on which pieces of $data to pull
2293       # $cols is passed in only for prettier error-reporting
2294       $self->_dbh_execute_for_fetch( $source, $sth, $proto_bind, $cols, $data );
2295     }
2296     else {
2297       # bind_param_array doesn't work if there are no binds
2298       $self->_dbh_execute_inserts_with_no_binds( $sth, scalar @$data );
2299     }
2300   };
2301
2302   $self->_query_end( $sql, @$proto_bind ? [[ {} => '__BULK_INSERT__' ]] : () );
2303
2304   $guard->commit;
2305
2306   return wantarray ? ($rv, $sth, @$proto_bind) : $rv;
2307 }
2308
2309 # execute_for_fetch is capable of returning data just fine (it means it
2310 # can be used for INSERT...RETURNING and UPDATE...RETURNING. Since this
2311 # is the void-populate fast-path we will just ignore this altogether
2312 # for the time being.
2313 sub _dbh_execute_for_fetch {
2314   my ($self, $source, $sth, $proto_bind, $cols, $data) = @_;
2315
2316   # If we have any bind attributes to take care of, we will bind the
2317   # proto-bind data (which will never be used by execute_for_fetch)
2318   # However since column bindtypes are "sticky", this is sufficient
2319   # to get the DBD to apply the bindtype to all values later on
2320   my $bind_attrs = $self->_dbi_attrs_for_bind($source, $proto_bind);
2321
2322   for my $i (0 .. $#$proto_bind) {
2323     $sth->bind_param (
2324       $i+1, # DBI bind indexes are 1-based
2325       $proto_bind->[$i][1],
2326       $bind_attrs->[$i],
2327     ) if defined $bind_attrs->[$i];
2328   }
2329
2330   # At this point $data slots named in the _bind_data_slice_idx of
2331   # each piece of $proto_bind are either \[]s or plain values to be
2332   # passed in. Construct the dispensing coderef. *NOTE* the order
2333   # of $data will differ from this of the ?s in the SQL (due to
2334   # alphabetical ordering by colname). We actually do want to
2335   # preserve this behavior so that prepare_cached has a better
2336   # chance of matching on unrelated calls
2337
2338   my $fetch_row_idx = -1; # saner loop this way
2339   my $fetch_tuple = sub {
2340     return undef if ++$fetch_row_idx > $#$data;
2341
2342     return [ map {
2343       my $v = ! defined $_->{_literal_bind_subindex}
2344
2345         ? $data->[ $fetch_row_idx ]->[ $_->{_bind_data_slice_idx} ]
2346
2347         # There are no attributes to resolve here - we already did everything
2348         # when we constructed proto_bind. However we still want to sanity-check
2349         # what the user supplied, so pass stuff through to the resolver *anyway*
2350         : $self->_resolve_bindattrs (
2351             undef,  # a fake rsrc
2352             [ ${ $data->[ $fetch_row_idx ]->[ $_->{_bind_data_slice_idx} ]}->[ $_->{_literal_bind_subindex} ] ],
2353             {},     # a fake column_info bag
2354           )->[0][1]
2355       ;
2356
2357       # FIXME SUBOPTIMAL - DBI needs fixing to always stringify regardless of DBD
2358       # For the time being forcibly stringify whatever is stringifiable
2359       my $vref;
2360
2361       ( !length ref $v or ! ($vref = is_plain_value $v) )   ? $v
2362     : defined blessed( $$vref )                             ? "$$vref"
2363                                                             : $$vref
2364     ;
2365     } map { $_->[0] } @$proto_bind ];
2366   };
2367
2368   my $tuple_status = [];
2369   my ($rv, $err);
2370   dbic_internal_try {
2371     $rv = $sth->execute_for_fetch(
2372       $fetch_tuple,
2373       $tuple_status,
2374     );
2375   }
2376   catch {
2377     $err = shift;
2378   };
2379
2380   # Not all DBDs are create equal. Some throw on error, some return
2381   # an undef $rv, and some set $sth->err - try whatever we can
2382   $err = ($sth->errstr || 'UNKNOWN ERROR ($sth->errstr is unset)') if (
2383     ! defined $err
2384       and
2385     ( !defined $rv or $sth->err )
2386   );
2387
2388   # Statement must finish even if there was an exception.
2389   dbic_internal_try {
2390     $sth->finish
2391   }
2392   catch {
2393     $err = shift unless defined $err
2394   };
2395
2396   if (defined $err) {
2397     my $i = 0;
2398     ++$i while $i <= $#$tuple_status && !ref $tuple_status->[$i];
2399
2400     $self->throw_exception("Unexpected populate error: $err")
2401       if ($i > $#$tuple_status);
2402
2403     $self->throw_exception(sprintf "execute_for_fetch() aborted with '%s' at populate slice:\n%s",
2404       ($tuple_status->[$i][1] || $err),
2405       dump_value { map { $cols->[$_] => $data->[$i][$_] } (0 .. $#$cols) },
2406     );
2407   }
2408
2409   return $rv;
2410 }
2411
2412 sub _dbh_execute_inserts_with_no_binds {
2413   my ($self, $sth, $count) = @_;
2414
2415   my $err;
2416   dbic_internal_try {
2417     my $dbh = $self->_get_dbh;
2418     local $dbh->{RaiseError} = 1;
2419     local $dbh->{PrintError} = 0;
2420
2421     $sth->execute foreach 1..$count;
2422   }
2423   catch {
2424     $err = shift;
2425   };
2426
2427   # Make sure statement is finished even if there was an exception.
2428   dbic_internal_try {
2429     $sth->finish
2430   }
2431   catch {
2432     $err = shift unless defined $err;
2433   };
2434
2435   $self->throw_exception($err) if defined $err;
2436
2437   return $count;
2438 }
2439
2440 sub update {
2441   #my ($self, $source, @args) = @_;
2442   shift->_execute('update', @_);
2443 }
2444
2445
2446 sub delete {
2447   #my ($self, $source, @args) = @_;
2448   shift->_execute('delete', @_);
2449 }
2450
2451 sub _select {
2452   my $self = shift;
2453   $self->_execute($self->_select_args(@_));
2454 }
2455
2456 sub _select_args_to_query {
2457   my $self = shift;
2458
2459   $self->throw_exception(
2460     "Unable to generate limited query representation with 'software_limit' enabled"
2461   ) if ($_[3]->{software_limit} and ($_[3]->{offset} or $_[3]->{rows}) );
2462
2463   # my ($op, $ident, $select, $cond, $rs_attrs, $rows, $offset)
2464   #  = $self->_select_args($ident, $select, $cond, $attrs);
2465   my ($op, $ident, @args) =
2466     $self->_select_args(@_);
2467
2468   # my ($sql, $prepared_bind) = $self->_gen_sql_bind($op, $ident, [ $select, $cond, $rs_attrs, $rows, $offset ]);
2469   my ($sql, $bind) = $self->_gen_sql_bind($op, $ident, \@args);
2470
2471   # reuse the bind arrayref
2472   unshift @{$bind}, "($sql)";
2473   \$bind;
2474 }
2475
2476 sub _select_args {
2477   my ($self, $ident, $select, $where, $orig_attrs) = @_;
2478
2479   # FIXME - that kind of caching would be nice to have
2480   # however currently we *may* pass the same $orig_attrs
2481   # with different ident/select/where
2482   # the whole interface needs to be rethought, since it
2483   # was centered around the flawed SQLA API. We can do
2484   # soooooo much better now. But that is also another
2485   # battle...
2486   #return (
2487   #  'select', $orig_attrs->{!args_as_stored_at_the_end_of_this_method!}
2488   #) if $orig_attrs->{!args_as_stored_at_the_end_of_this_method!};
2489
2490   my $sql_maker = $self->sql_maker;
2491
2492   my $attrs = {
2493     %$orig_attrs,
2494     select => $select,
2495     from => $ident,
2496     where => $where,
2497   };
2498
2499   # MySQL actually recommends this approach.  I cringe.
2500   $attrs->{rows} ||= $sql_maker->__max_int
2501     if $attrs->{offset};
2502
2503   # see if we will need to tear the prefetch apart to satisfy group_by == select
2504   # this is *extremely tricky* to get right, I am still not sure I did
2505   #
2506   my ($prefetch_needs_subquery, @limit_args);
2507
2508   if ( $attrs->{_grouped_by_distinct} and $attrs->{collapse} ) {
2509     # we already know there is a valid group_by (we made it) and we know it is
2510     # intended to be based *only* on non-multi stuff
2511     # short circuit the group_by parsing below
2512     $prefetch_needs_subquery = 1;
2513   }
2514   elsif (
2515     # The rationale is that even if we do *not* have collapse, we still
2516     # need to wrap the core grouped select/group_by in a subquery
2517     # so that databases that care about group_by/select equivalence
2518     # are happy (this includes MySQL in strict_mode)
2519     # If any of the other joined tables are referenced in the group_by
2520     # however - the user is on their own
2521     ( $prefetch_needs_subquery or ! $attrs->{_simple_passthrough_construction} )
2522       and
2523     $attrs->{group_by}
2524       and
2525     @{$attrs->{group_by}}
2526       and
2527     my $grp_aliases = dbic_internal_try { # internal_try{} because $attrs->{from} may be unreadable
2528       $self->_resolve_aliastypes_from_select_args({ from => $attrs->{from}, group_by => $attrs->{group_by} })
2529     }
2530   ) {
2531     # no aliases other than our own in group_by
2532     # if there are - do not allow subquery even if limit is present
2533     $prefetch_needs_subquery = ! scalar grep { $_ ne $attrs->{alias} } keys %{ $grp_aliases->{grouping} || {} };
2534   }
2535   elsif ( $attrs->{rows} && $attrs->{collapse} ) {
2536     # active collapse with a limit - that one is a no-brainer unless
2537     # overruled by a group_by above
2538     $prefetch_needs_subquery = 1;
2539   }
2540
2541   if ($prefetch_needs_subquery) {
2542     $attrs = $self->_adjust_select_args_for_complex_prefetch ($attrs);
2543   }
2544   elsif (! $attrs->{software_limit} ) {
2545     push @limit_args, (
2546       $attrs->{rows} || (),
2547       $attrs->{offset} || (),
2548     );
2549   }
2550
2551   # try to simplify the joinmap further (prune unreferenced type-single joins)
2552   if (
2553     ! $prefetch_needs_subquery  # already pruned
2554       and
2555     ref $attrs->{from}
2556       and
2557     reftype $attrs->{from} eq 'ARRAY'
2558       and
2559     @{$attrs->{from}} != 1
2560   ) {
2561     ($attrs->{from}, $attrs->{_aliastypes}) = $self->_prune_unused_joins ($attrs);
2562   }
2563
2564   # FIXME this is a gross, inefficient, largely incorrect and fragile hack
2565   # during the result inflation stage we *need* to know what was the aliastype
2566   # map as sqla saw it when the final pieces of SQL were being assembled
2567   # Originally we simply carried around the entirety of $attrs, but this
2568   # resulted in resultsets that are being reused growing continuously, as
2569   # the hash in question grew deeper and deeper.
2570   # Instead hand-pick what to take with us here (we actually don't need much
2571   # at this point just the map itself)
2572   $orig_attrs->{_last_sqlmaker_alias_map} = $attrs->{_aliastypes};
2573
2574 ###
2575   #   my $alias2source = $self->_resolve_ident_sources ($ident);
2576   #
2577   # This would be the point to deflate anything found in $attrs->{where}
2578   # (and leave $attrs->{bind} intact). Problem is - inflators historically
2579   # expect a result object. And all we have is a resultsource (it is trivial
2580   # to extract deflator coderefs via $alias2source above).
2581   #
2582   # I don't see a way forward other than changing the way deflators are
2583   # invoked, and that's just bad...
2584 ###
2585
2586   return ( 'select', @{$attrs}{qw(from select where)}, $attrs, @limit_args );
2587 }
2588
2589 # Returns a counting SELECT for a simple count
2590 # query. Abstracted so that a storage could override
2591 # this to { count => 'firstcol' } or whatever makes
2592 # sense as a performance optimization
2593 sub _count_select {
2594   #my ($self, $source, $rs_attrs) = @_;
2595   return { count => '*' };
2596 }
2597
2598 =head2 select
2599
2600 =over 4
2601
2602 =item Arguments: $ident, $select, $condition, $attrs
2603
2604 =back
2605
2606 Handle a SQL select statement.
2607
2608 =cut
2609
2610 sub select {
2611   my $self = shift;
2612   my ($ident, $select, $condition, $attrs) = @_;
2613   return $self->cursor_class->new($self, \@_, $attrs);
2614 }
2615
2616 sub select_single {
2617   my $self = shift;
2618   my ($rv, $sth, @bind) = $self->_select(@_);
2619   my @row = $sth->fetchrow_array;
2620   my @nextrow = $sth->fetchrow_array if @row;
2621   if(@row && @nextrow) {
2622     carp "Query returned more than one row.  SQL that returns multiple rows is DEPRECATED for ->find and ->single";
2623   }
2624   # Need to call finish() to work round broken DBDs
2625   $sth->finish();
2626   return @row;
2627 }
2628
2629 =head2 sql_limit_dialect
2630
2631 This is an accessor for the default SQL limit dialect used by a particular
2632 storage driver. Can be overridden by supplying an explicit L</limit_dialect>
2633 to L<DBIx::Class::Schema/connect>. For a list of available limit dialects
2634 see L<DBIx::Class::SQLMaker::LimitDialects>.
2635
2636 =cut
2637
2638 sub _dbh_columns_info_for {
2639   my ($self, $dbh, $table) = @_;
2640
2641   my %result;
2642
2643   if (! DBIx::Class::_ENV_::STRESSTEST_COLUMN_INFO_UNAWARE_STORAGE and $dbh->can('column_info')) {
2644     dbic_internal_try {
2645       my ($schema,$tab) = $table =~ /^(.+?)\.(.+)$/ ? ($1,$2) : (undef,$table);
2646       my $sth = $dbh->column_info( undef,$schema, $tab, '%' );
2647       $sth->execute();
2648       while ( my $info = $sth->fetchrow_hashref() ){
2649         my %column_info;
2650         $column_info{data_type}   = $info->{TYPE_NAME};
2651         $column_info{size}      = $info->{COLUMN_SIZE};
2652         $column_info{is_nullable}   = $info->{NULLABLE} ? 1 : 0;
2653         $column_info{default_value} = $info->{COLUMN_DEF};
2654         my $col_name = $info->{COLUMN_NAME};
2655         $col_name =~ s/^\"(.*)\"$/$1/;
2656
2657         $result{$col_name} = \%column_info;
2658       }
2659     } catch {
2660       %result = ();
2661     };
2662
2663     return \%result if keys %result;
2664   }
2665
2666   my $sth = $dbh->prepare($self->sql_maker->select($table, undef, \'1 = 0'));
2667   $sth->execute;
2668
2669 ### The acrobatics with lc names is necessary to support both the legacy
2670 ### API that used NAME_lc exclusively, *AND* at the same time work properly
2671 ### with column names differing in cas eonly (thanks pg!)
2672
2673   my ($columns, $seen_lcs);
2674
2675   ++$seen_lcs->{lc($_)} and $columns->{$_} = {
2676     idx => scalar keys %$columns,
2677     name => $_,
2678     lc_name => lc($_),
2679   } for @{$sth->{NAME}};
2680
2681   $seen_lcs->{$_->{lc_name}} == 1
2682     and
2683   $_->{name} = $_->{lc_name}
2684     for values %$columns;
2685
2686   for ( values %$columns ) {
2687     my $inf = {
2688       data_type => $sth->{TYPE}->[$_->{idx}],
2689       size => $sth->{PRECISION}->[$_->{idx}],
2690       is_nullable => $sth->{NULLABLE}->[$_->{idx}] ? 1 : 0,
2691     };
2692
2693     if ($inf->{data_type} =~ m/^(.*?)\((.*?)\)$/) {
2694       @{$inf}{qw( data_type  size)} = ($1, $2);
2695     }
2696
2697     $result{$_->{name}} = $inf;
2698   }
2699
2700   $sth->finish;
2701
2702   if ($dbh->can('type_info')) {
2703     for my $inf (values %result) {
2704       next if ! defined $inf->{data_type};
2705
2706       $inf->{data_type} = (
2707         (
2708           (
2709             $dbh->type_info( $inf->{data_type} )
2710               ||
2711             next
2712           )
2713             ||
2714           next
2715         )->{TYPE_NAME}
2716           ||
2717         next
2718       );
2719
2720       # FIXME - this may be an artifact of the DBD::Pg implmentation alone
2721       # needs more testing in the future...
2722       $inf->{size} -= 4 if (
2723         ( $inf->{size}||0 > 4 )
2724           and
2725         $inf->{data_type} =~ qr/^text$/i
2726       );
2727     }
2728
2729   }
2730
2731   return \%result;
2732 }
2733
2734 sub columns_info_for {
2735   my ($self, $table) = @_;
2736   $self->_dbh_columns_info_for ($self->_get_dbh, $table);
2737 }
2738
2739 =head2 last_insert_id
2740
2741 Return the row id of the last insert.
2742
2743 =cut
2744
2745 sub _dbh_last_insert_id {
2746     my ($self, $dbh, $source, $col) = @_;
2747
2748     my $id = dbic_internal_try { $dbh->last_insert_id (undef, undef, $source->name, $col) };
2749
2750     return $id if defined $id;
2751
2752     my $class = ref $self;
2753     $self->throw_exception ("No storage specific _dbh_last_insert_id() method implemented in $class, and the generic DBI::last_insert_id() failed");
2754 }
2755
2756 sub last_insert_id {
2757   my $self = shift;
2758   $self->_dbh_last_insert_id ($self->_dbh, @_);
2759 }
2760
2761 =head2 _native_data_type
2762
2763 =over 4
2764
2765 =item Arguments: $type_name
2766
2767 =back
2768
2769 This API is B<EXPERIMENTAL>, will almost definitely change in the future, and
2770 currently only used by L<::AutoCast|DBIx::Class::Storage::DBI::AutoCast> and
2771 L<::Sybase::ASE|DBIx::Class::Storage::DBI::Sybase::ASE>.
2772
2773 The default implementation returns C<undef>, implement in your Storage driver if
2774 you need this functionality.
2775
2776 Should map types from other databases to the native RDBMS type, for example
2777 C<VARCHAR2> to C<VARCHAR>.
2778
2779 Types with modifiers should map to the underlying data type. For example,
2780 C<INTEGER AUTO_INCREMENT> should become C<INTEGER>.
2781
2782 Composite types should map to the container type, for example
2783 C<ENUM(foo,bar,baz)> becomes C<ENUM>.
2784
2785 =cut
2786
2787 sub _native_data_type {
2788   #my ($self, $data_type) = @_;
2789   return undef
2790 }
2791
2792 # Check if placeholders are supported at all
2793 sub _determine_supports_placeholders {
2794   my $self = shift;
2795   my $dbh  = $self->_get_dbh;
2796
2797   # some drivers provide a $dbh attribute (e.g. Sybase and $dbh->{syb_dynamic_supported})
2798   # but it is inaccurate more often than not
2799   ( dbic_internal_try {
2800     local $dbh->{PrintError} = 0;
2801     local $dbh->{RaiseError} = 1;
2802     $dbh->do('select ?', {}, 1);
2803     1;
2804   } )
2805     ? 1
2806     : 0
2807   ;
2808 }
2809
2810 # Check if placeholders bound to non-string types throw exceptions
2811 #
2812 sub _determine_supports_typeless_placeholders {
2813   my $self = shift;
2814   my $dbh  = $self->_get_dbh;
2815
2816   ( dbic_internal_try {
2817     local $dbh->{PrintError} = 0;
2818     local $dbh->{RaiseError} = 1;
2819     # this specifically tests a bind that is NOT a string
2820     $dbh->do('select 1 where 1 = ?', {}, 1);
2821     1;
2822   } )
2823     ? 1
2824     : 0
2825   ;
2826 }
2827
2828 =head2 sqlt_type
2829
2830 Returns the database driver name.
2831
2832 =cut
2833
2834 sub sqlt_type {
2835   shift->_get_dbh->{Driver}->{Name};
2836 }
2837
2838 =head2 bind_attribute_by_data_type
2839
2840 Given a datatype from column info, returns a database specific bind
2841 attribute for C<< $dbh->bind_param($val,$attribute) >> or nothing if we will
2842 let the database planner just handle it.
2843
2844 This method is always called after the driver has been determined and a DBI
2845 connection has been established. Therefore you can refer to C<DBI::$constant>
2846 and/or C<DBD::$driver::$constant> directly, without worrying about loading
2847 the correct modules.
2848
2849 =cut
2850
2851 sub bind_attribute_by_data_type {
2852     return;
2853 }
2854
2855 =head2 is_datatype_numeric
2856
2857 Given a datatype from column_info, returns a boolean value indicating if
2858 the current RDBMS considers it a numeric value. This controls how
2859 L<DBIx::Class::Row/set_column> decides whether to mark the column as
2860 dirty - when the datatype is deemed numeric a C<< != >> comparison will
2861 be performed instead of the usual C<eq>.
2862
2863 =cut
2864
2865 sub is_datatype_numeric {
2866   #my ($self, $dt) = @_;
2867
2868   return 0 unless $_[1];
2869
2870   $_[1] =~ /^ (?:
2871     numeric | int(?:eger)? | (?:tiny|small|medium|big)int | dec(?:imal)? | real | float | double (?: \s+ precision)? | (?:big)?serial
2872   ) $/ix;
2873 }
2874
2875
2876 =head2 create_ddl_dir
2877
2878 =over 4
2879
2880 =item Arguments: $schema, \@databases, $version, $directory, $preversion, \%sqlt_args
2881
2882 =back
2883
2884 Creates a SQL file based on the Schema, for each of the specified
2885 database engines in C<\@databases> in the given directory.
2886 (note: specify L<SQL::Translator> names, not L<DBI> driver names).
2887
2888 Given a previous version number, this will also create a file containing
2889 the ALTER TABLE statements to transform the previous schema into the
2890 current one. Note that these statements may contain C<DROP TABLE> or
2891 C<DROP COLUMN> statements that can potentially destroy data.
2892
2893 The file names are created using the C<ddl_filename> method below, please
2894 override this method in your schema if you would like a different file
2895 name format. For the ALTER file, the same format is used, replacing
2896 $version in the name with "$preversion-$version".
2897
2898 See L<SQL::Translator/METHODS> for a list of values for C<\%sqlt_args>.
2899 The most common value for this would be C<< { add_drop_table => 1 } >>
2900 to have the SQL produced include a C<DROP TABLE> statement for each table
2901 created. For quoting purposes supply C<quote_identifiers>.
2902
2903 If no arguments are passed, then the following default values are assumed:
2904
2905 =over 4
2906
2907 =item databases  - ['MySQL', 'SQLite', 'PostgreSQL']
2908
2909 =item version    - $schema->schema_version
2910
2911 =item directory  - './'
2912
2913 =item preversion - <none>
2914
2915 =back
2916
2917 By default, C<\%sqlt_args> will have
2918
2919  { add_drop_table => 1, ignore_constraint_names => 1, ignore_index_names => 1 }
2920
2921 merged with the hash passed in. To disable any of those features, pass in a
2922 hashref like the following
2923
2924  { ignore_constraint_names => 0, # ... other options }
2925
2926
2927 WARNING: You are strongly advised to check all SQL files created, before applying
2928 them.
2929
2930 =cut
2931
2932 sub create_ddl_dir {
2933   my ($self, $schema, $databases, $version, $dir, $preversion, $sqltargs) = @_;
2934
2935   require DBIx::Class::Optional::Dependencies;
2936   if (my $missing = DBIx::Class::Optional::Dependencies->req_missing_for ('deploy')) {
2937     $self->throw_exception("Can't create a ddl file without $missing");
2938   }
2939
2940   if (!$dir) {
2941     carp "No directory given, using ./\n";
2942     $dir = './';
2943   }
2944   else {
2945     mkdir_p( $dir ) unless -d $dir;
2946   }
2947
2948   $databases ||= ['MySQL', 'SQLite', 'PostgreSQL'];
2949   $databases = [ $databases ] if(ref($databases) ne 'ARRAY');
2950
2951   my $schema_version = $schema->schema_version || '1.x';
2952   $version ||= $schema_version;
2953
2954   $sqltargs = {
2955     add_drop_table => 1,
2956     ignore_constraint_names => 1,
2957     ignore_index_names => 1,
2958     quote_identifiers => $self->sql_maker->_quoting_enabled,
2959     %{$sqltargs || {}}
2960   };
2961
2962   my $sqlt = SQL::Translator->new( $sqltargs );
2963
2964   $sqlt->parser('SQL::Translator::Parser::DBIx::Class');
2965   my $sqlt_schema = $sqlt->translate({ data => $schema })
2966     or $self->throw_exception ($sqlt->error);
2967
2968   foreach my $db (@$databases) {
2969     $sqlt->reset();
2970     $sqlt->{schema} = $sqlt_schema;
2971     $sqlt->producer($db);
2972
2973     my $file;
2974     my $filename = $schema->ddl_filename($db, $version, $dir);
2975     if (-e $filename && ($version eq $schema_version )) {
2976       # if we are dumping the current version, overwrite the DDL
2977       carp "Overwriting existing DDL file - $filename";
2978       unlink($filename);
2979     }
2980
2981     my $output = $sqlt->translate;
2982     if(!$output) {
2983       carp("Failed to translate to $db, skipping. (" . $sqlt->error . ")");
2984       next;
2985     }
2986     if(!open($file, ">$filename")) {
2987       $self->throw_exception("Can't open $filename for writing ($!)");
2988       next;
2989     }
2990     print $file $output;
2991     close($file);
2992
2993     next unless ($preversion);
2994
2995     require SQL::Translator::Diff;
2996
2997     my $prefilename = $schema->ddl_filename($db, $preversion, $dir);
2998     if(!-e $prefilename) {
2999       carp("No previous schema file found ($prefilename)");
3000       next;
3001     }
3002
3003     my $difffile = $schema->ddl_filename($db, $version, $dir, $preversion);
3004     if(-e $difffile) {
3005       carp("Overwriting existing diff file - $difffile");
3006       unlink($difffile);
3007     }
3008
3009     my $source_schema;
3010     {
3011       my $t = SQL::Translator->new($sqltargs);
3012       $t->debug( 0 );
3013       $t->trace( 0 );
3014
3015       $t->parser( $db )
3016         or $self->throw_exception ($t->error);
3017
3018       my $out = $t->translate( $prefilename )
3019         or $self->throw_exception ($t->error);
3020
3021       $source_schema = $t->schema;
3022
3023       $source_schema->name( $prefilename )
3024         unless ( $source_schema->name );
3025     }
3026
3027     # The "new" style of producers have sane normalization and can support
3028     # diffing a SQL file against a DBIC->SQLT schema. Old style ones don't
3029     # And we have to diff parsed SQL against parsed SQL.
3030     my $dest_schema = $sqlt_schema;
3031
3032     unless ( "SQL::Translator::Producer::$db"->can('preprocess_schema') ) {
3033       my $t = SQL::Translator->new($sqltargs);
3034       $t->debug( 0 );
3035       $t->trace( 0 );
3036
3037       $t->parser( $db )
3038         or $self->throw_exception ($t->error);
3039
3040       my $out = $t->translate( $filename )
3041         or $self->throw_exception ($t->error);
3042
3043       $dest_schema = $t->schema;
3044
3045       $dest_schema->name( $filename )
3046         unless $dest_schema->name;
3047     }
3048
3049     my $diff = do {
3050       # FIXME - this is a terrible workaround for
3051       # https://github.com/dbsrgits/sql-translator/commit/2d23c1e
3052       # Fixing it in this sloppy manner so that we don't hve to
3053       # lockstep an SQLT release as well. Needs to be removed at
3054       # some point, and SQLT dep bumped
3055       local $SQL::Translator::Producer::SQLite::NO_QUOTES
3056         if $SQL::Translator::Producer::SQLite::NO_QUOTES;
3057
3058       SQL::Translator::Diff::schema_diff($source_schema, $db,
3059                                          $dest_schema,   $db,
3060                                          $sqltargs
3061                                        );
3062     };
3063
3064     if(!open $file, ">$difffile") {
3065       $self->throw_exception("Can't write to $difffile ($!)");
3066       next;
3067     }
3068     print $file $diff;
3069     close($file);
3070   }
3071 }
3072
3073 =head2 deployment_statements
3074
3075 =over 4
3076
3077 =item Arguments: $schema, $type, $version, $directory, $sqlt_args
3078
3079 =back
3080
3081 Returns the statements used by L<DBIx::Class::Storage/deploy>
3082 and L<DBIx::Class::Schema/deploy>.
3083
3084 The L<SQL::Translator> (not L<DBI>) database driver name can be explicitly
3085 provided in C<$type>, otherwise the result of L</sqlt_type> is used as default.
3086
3087 C<$directory> is used to return statements from files in a previously created
3088 L</create_ddl_dir> directory and is optional. The filenames are constructed
3089 from L<DBIx::Class::Schema/ddl_filename>, the schema name and the C<$version>.
3090
3091 If no C<$directory> is specified then the statements are constructed on the
3092 fly using L<SQL::Translator> and C<$version> is ignored.
3093
3094 See L<SQL::Translator/METHODS> for a list of values for C<$sqlt_args>.
3095
3096 =cut
3097
3098 sub deployment_statements {
3099   my ($self, $schema, $type, $version, $dir, $sqltargs) = @_;
3100   $type ||= $self->sqlt_type;
3101   $version ||= $schema->schema_version || '1.x';
3102   $dir ||= './';
3103   my $filename = $schema->ddl_filename($type, $version, $dir);
3104   if(-f $filename)
3105   {
3106       # FIXME replace this block when a proper sane sql parser is available
3107       my $file;
3108       open($file, "<$filename")
3109         or $self->throw_exception("Can't open $filename ($!)");
3110       my @rows = <$file>;
3111       close($file);
3112       return join('', @rows);
3113   }
3114
3115   require DBIx::Class::Optional::Dependencies;
3116   if (my $missing = DBIx::Class::Optional::Dependencies->req_missing_for ('deploy') ) {
3117     $self->throw_exception("Can't deploy without a pregenerated 'ddl_dir' directory or $missing");
3118   }
3119
3120   # sources needs to be a parser arg, but for simplicity allow at top level
3121   # coming in
3122   $sqltargs->{parser_args}{sources} = delete $sqltargs->{sources}
3123       if exists $sqltargs->{sources};
3124
3125   $sqltargs->{quote_identifiers} = $self->sql_maker->_quoting_enabled
3126     unless exists $sqltargs->{quote_identifiers};
3127
3128   my $tr = SQL::Translator->new(
3129     producer => "SQL::Translator::Producer::${type}",
3130     %$sqltargs,
3131     parser => 'SQL::Translator::Parser::DBIx::Class',
3132     data => $schema,
3133   );
3134
3135   return preserve_context {
3136     $tr->translate
3137   } after => sub {
3138     $self->throw_exception( 'Unable to produce deployment statements: ' . $tr->error)
3139       unless defined $_[0];
3140   };
3141 }
3142
3143 # FIXME deploy() currently does not accurately report sql errors
3144 # Will always return true while errors are warned
3145 sub deploy {
3146   my ($self, $schema, $type, $sqltargs, $dir) = @_;
3147   my $deploy = sub {
3148     my $line = shift;
3149     return if(!$line);
3150     return if($line =~ /^--/);
3151     # next if($line =~ /^DROP/m);
3152     return if($line =~ /^BEGIN TRANSACTION/m);
3153     return if($line =~ /^COMMIT/m);
3154     return if $line =~ /^\s+$/; # skip whitespace only
3155     $self->_query_start($line);
3156     dbic_internal_try {
3157       # do a dbh_do cycle here, as we need some error checking in
3158       # place (even though we will ignore errors)
3159       $self->dbh_do (sub { $_[1]->do($line) });
3160     } catch {
3161       carp qq{$_ (running "${line}")};
3162     };
3163     $self->_query_end($line);
3164   };
3165   my @statements = $schema->deployment_statements($type, undef, $dir, { %{ $sqltargs || {} }, no_comments => 1 } );
3166   if (@statements > 1) {
3167     foreach my $statement (@statements) {
3168       $deploy->( $statement );
3169     }
3170   }
3171   elsif (@statements == 1) {
3172     # split on single line comments and end of statements
3173     foreach my $line ( split(/\s*--.*\n|;\n/, $statements[0])) {
3174       $deploy->( $line );
3175     }
3176   }
3177 }
3178
3179 =head2 datetime_parser
3180
3181 Returns the datetime parser class
3182
3183 =cut
3184
3185 sub datetime_parser {
3186   my $self = shift;
3187   return $self->{datetime_parser} ||= do {
3188     $self->build_datetime_parser(@_);
3189   };
3190 }
3191
3192 =head2 datetime_parser_type
3193
3194 Defines the datetime parser class - currently defaults to L<DateTime::Format::MySQL>
3195
3196 =head2 build_datetime_parser
3197
3198 See L</datetime_parser>
3199
3200 =cut
3201
3202 sub build_datetime_parser {
3203   my $self = shift;
3204   my $type = $self->datetime_parser_type(@_);
3205   return $type;
3206 }
3207
3208
3209 =head2 is_replicating
3210
3211 A boolean that reports if a particular L<DBIx::Class::Storage::DBI> is set to
3212 replicate from a master database.  Default is undef, which is the result
3213 returned by databases that don't support replication.
3214
3215 =cut
3216
3217 sub is_replicating {
3218     return;
3219
3220 }
3221
3222 =head2 lag_behind_master
3223
3224 Returns a number that represents a certain amount of lag behind a master db
3225 when a given storage is replicating.  The number is database dependent, but
3226 starts at zero and increases with the amount of lag. Default in undef
3227
3228 =cut
3229
3230 sub lag_behind_master {
3231     return;
3232 }
3233
3234 =head2 relname_to_table_alias
3235
3236 =over 4
3237
3238 =item Arguments: $relname, $join_count
3239
3240 =item Return Value: $alias
3241
3242 =back
3243
3244 L<DBIx::Class> uses L<DBIx::Class::Relationship> names as table aliases in
3245 queries.
3246
3247 This hook is to allow specific L<DBIx::Class::Storage> drivers to change the
3248 way these aliases are named.
3249
3250 The default behavior is C<< "$relname_$join_count" if $join_count > 1 >>,
3251 otherwise C<"$relname">.
3252
3253 =cut
3254
3255 sub relname_to_table_alias {
3256   my ($self, $relname, $join_count) = @_;
3257
3258   my $alias = ($join_count && $join_count > 1 ?
3259     join('_', $relname, $join_count) : $relname);
3260
3261   return $alias;
3262 }
3263
3264 # The size in bytes to use for DBI's ->bind_param_inout, this is the generic
3265 # version and it may be necessary to amend or override it for a specific storage
3266 # if such binds are necessary.
3267 sub _max_column_bytesize {
3268   my ($self, $attr) = @_;
3269
3270   my $max_size;
3271
3272   if ($attr->{sqlt_datatype}) {
3273     my $data_type = lc($attr->{sqlt_datatype});
3274
3275     if ($attr->{sqlt_size}) {
3276
3277       # String/sized-binary types
3278       if ($data_type =~ /^(?:
3279           l? (?:var)? char(?:acter)? (?:\s*varying)?
3280             |
3281           (?:var)? binary (?:\s*varying)?
3282             |
3283           raw
3284         )\b/x
3285       ) {
3286         $max_size = $attr->{sqlt_size};
3287       }
3288       # Other charset/unicode types, assume scale of 4
3289       elsif ($data_type =~ /^(?:
3290           national \s* character (?:\s*varying)?
3291             |
3292           nchar
3293             |
3294           univarchar
3295             |
3296           nvarchar
3297         )\b/x
3298       ) {
3299         $max_size = $attr->{sqlt_size} * 4;
3300       }
3301     }
3302
3303     if (!$max_size and !$self->_is_lob_type($data_type)) {
3304       $max_size = 100 # for all other (numeric?) datatypes
3305     }
3306   }
3307
3308   $max_size || $self->_dbic_connect_attributes->{LongReadLen} || $self->_get_dbh->{LongReadLen} || 8000;
3309 }
3310
3311 # Determine if a data_type is some type of BLOB
3312 sub _is_lob_type {
3313   my ($self, $data_type) = @_;
3314   $data_type && ($data_type =~ /lob|bfile|text|image|bytea|memo/i
3315     || $data_type =~ /^long(?:\s+(?:raw|bit\s*varying|varbit|binary
3316                                   |varchar|character\s*varying|nvarchar
3317                                   |national\s*character\s*varying))?\z/xi);
3318 }
3319
3320 sub _is_binary_lob_type {
3321   my ($self, $data_type) = @_;
3322   $data_type && ($data_type =~ /blob|bfile|image|bytea/i
3323     || $data_type =~ /^long(?:\s+(?:raw|bit\s*varying|varbit|binary))?\z/xi);
3324 }
3325
3326 sub _is_text_lob_type {
3327   my ($self, $data_type) = @_;
3328   $data_type && ($data_type =~ /^(?:clob|memo)\z/i
3329     || $data_type =~ /^long(?:\s+(?:varchar|character\s*varying|nvarchar
3330                         |national\s*character\s*varying))\z/xi);
3331 }
3332
3333 # Determine if a data_type is some type of a binary type
3334 sub _is_binary_type {
3335   my ($self, $data_type) = @_;
3336   $data_type && ($self->_is_binary_lob_type($data_type)
3337     || $data_type =~ /(?:var)?(?:binary|bit|graphic)(?:\s*varying)?/i);
3338 }
3339
3340 1;
3341
3342 =head1 USAGE NOTES
3343
3344 =head2 DBIx::Class and AutoCommit
3345
3346 DBIx::Class can do some wonderful magic with handling exceptions,
3347 disconnections, and transactions when you use C<< AutoCommit => 1 >>
3348 (the default) combined with L<txn_do|DBIx::Class::Storage/txn_do> for
3349 transaction support.
3350
3351 If you set C<< AutoCommit => 0 >> in your connect info, then you are always
3352 in an assumed transaction between commits, and you're telling us you'd
3353 like to manage that manually.  A lot of the magic protections offered by
3354 this module will go away.  We can't protect you from exceptions due to database
3355 disconnects because we don't know anything about how to restart your
3356 transactions.  You're on your own for handling all sorts of exceptional
3357 cases if you choose the C<< AutoCommit => 0 >> path, just as you would
3358 be with raw DBI.
3359
3360 =head1 FURTHER QUESTIONS?
3361
3362 Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
3363
3364 =head1 COPYRIGHT AND LICENSE
3365
3366 This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
3367 by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
3368 redistribute it and/or modify it under the same terms as the
3369 L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.