Commit | Line | Data |
d047d650 |
1 | package DBIx::Class::Storage::DBI::AutoCast; |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | use base qw/DBIx::Class::Storage::DBI/; |
7 | use mro 'c3'; |
8 | |
9 | __PACKAGE__->mk_group_accessors('simple' => 'auto_cast' ); |
10 | |
11 | =head1 NAME |
12 | |
d7d812cf |
13 | DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing |
d047d650 |
14 | |
15 | =head1 SYNOPSIS |
16 | |
17 | $schema->storage->auto_cast(1); |
18 | |
19 | =head1 DESCRIPTION |
20 | |
ce012195 |
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. |
d047d650 |
24 | |
25 | As long as a column L<data_type|DBIx::Class::ResultSource/add_columns> is |
48580715 |
26 | defined and resolves to a base RDBMS native type via L</_native_data_type> as |
ce012195 |
27 | defined in your Storage driver, the placeholder for this column will be |
28 | converted to: |
d047d650 |
29 | |
ce012195 |
30 | CAST(? as $mapped_type) |
d047d650 |
31 | |
8384a713 |
32 | This option can also be enabled in |
33 | L<connect_info|DBIx::Class::Storage::DBI/connect_info> as: |
d867eeda |
34 | |
35 | on_connect_call => ['set_auto_cast'] |
36 | |
d047d650 |
37 | =cut |
38 | |
39 | sub _prep_for_execute { |
40 | my $self = shift; |
d047d650 |
41 | |
42 | my ($sql, $bind) = $self->next::method (@_); |
43 | |
44 | # If we're using ::NoBindVars, there are no binds by this point so this code |
4a0eed52 |
45 | # gets skipped. |
d047d650 |
46 | if ($self->auto_cast && @$bind) { |
47 | my $new_sql; |
0e773352 |
48 | my @sql_part = split /\?/, $sql, scalar @$bind + 1; |
49 | for (@$bind) { |
50 | my $cast_type = $self->_native_data_type($_->[0]{sqlt_datatype}); |
51 | $new_sql .= shift(@sql_part) . ($cast_type ? "CAST(? AS $cast_type)" : '?'); |
d047d650 |
52 | } |
0e773352 |
53 | $sql = $new_sql . shift @sql_part; |
d047d650 |
54 | } |
55 | |
56 | return ($sql, $bind); |
57 | } |
58 | |
d867eeda |
59 | =head2 connect_call_set_auto_cast |
60 | |
61 | Executes: |
62 | |
63 | $schema->storage->auto_cast(1); |
64 | |
65 | on connection. |
66 | |
67 | Used as: |
68 | |
69 | on_connect_call => ['set_auto_cast'] |
70 | |
8384a713 |
71 | in L<connect_info|DBIx::Class::Storage::DBI/connect_info>. |
d867eeda |
72 | |
73 | =cut |
74 | |
75 | sub connect_call_set_auto_cast { |
76 | my $self = shift; |
77 | $self->auto_cast(1); |
78 | } |
d047d650 |
79 | |
07a5866e |
80 | =head1 AUTHOR |
d047d650 |
81 | |
82 | See L<DBIx::Class/CONTRIBUTORS> |
83 | |
84 | =head1 LICENSE |
85 | |
86 | You may distribute this code under the same terms as Perl itself. |
87 | |
88 | =cut |
89 | |
90 | 1; |