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