File Coverage

blib/lib/DBIx/Class/Storage/DBI/AutoCast.pm
Criterion Covered Total %
statement 22 24 91.6
branch 4 4 100.0
condition 2 3 66.6
subroutine 5 6 83.3
pod 1 1 100.0
total 34 38 89.4


line stmt bran cond sub pod time code
1             package DBIx::Class::Storage::DBI::AutoCast;
2              
3 4     4   1294 use strict;
  4         9  
  4         102  
4 4     4   21 use warnings;
  4         6  
  4         96  
5              
6 4     4   17 use base qw/DBIx::Class::Storage::DBI/;
  4         7  
  4         776  
7 4     4   24 use mro 'c3';
  4         9  
  4         2197  
8              
9             __PACKAGE__->mk_group_accessors('simple' => 'auto_cast' );
10              
11             =head1 NAME
12              
13             DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing
14              
15             =head1 SYNOPSIS
16              
17             $schema->storage->auto_cast(1);
18              
19             =head1 DESCRIPTION
20              
21             In some combinations of RDBMS and DBD drivers (e.g. FreeTDS and Sybase)
22             statements with values bound to columns or conditions that are not strings will
23             throw implicit type conversion errors.
24              
25             As long as a column L is
26             defined and resolves to a base RDBMS native type via
27             L<_native_data_type|DBIx::Class::Storage::DBI/_native_data_type> as
28             defined in your Storage driver, the placeholder for this column will be
29             converted to:
30              
31             CAST(? as $mapped_type)
32              
33             This option can also be enabled in
34             L as:
35              
36             on_connect_call => ['set_auto_cast']
37              
38             =cut
39              
40             sub _prep_for_execute {
41 25     25   60 my $self = shift;
42              
43 25         119 my ($sql, $bind) = $self->next::method (@_);
44              
45             # If we're using ::NoBindVars, there are no binds by this point so this code
46             # gets skipped.
47 25 100 66     132 if ($self->auto_cast && @$bind) {
48 1         4 my $new_sql;
49 1         8 my @sql_part = split /\?/, $sql, scalar @$bind + 1;
50 1         3 for (@$bind) {
51 4         10 my $cast_type = $self->_native_data_type($_->[0]{sqlt_datatype});
52 4 100       24 $new_sql .= shift(@sql_part) . ($cast_type ? "CAST(? AS $cast_type)" : '?');
53             }
54 1         3 $sql = $new_sql . shift @sql_part;
55             }
56              
57 25         553 return ($sql, $bind);
58             }
59              
60             =head2 connect_call_set_auto_cast
61              
62             Executes:
63              
64             $schema->storage->auto_cast(1);
65              
66             on connection.
67              
68             Used as:
69              
70             on_connect_call => ['set_auto_cast']
71              
72             in L.
73              
74             =cut
75              
76             sub connect_call_set_auto_cast {
77 0     0 1   my $self = shift;
78 0           $self->auto_cast(1);
79             }
80              
81             =head1 FURTHER QUESTIONS?
82              
83             Check the list of L.
84              
85             =head1 COPYRIGHT AND LICENSE
86              
87             This module is free software L
88             by the L. You can
89             redistribute it and/or modify it under the same terms as the
90             L.
91              
92             =cut
93              
94             1;