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 | |
13 | DBIx::Class::Storage::DBI::AutoCast |
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 |
0bd2c1cd |
26 | defined, and it 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 | |
32 | =cut |
33 | |
34 | sub _prep_for_execute { |
35 | my $self = shift; |
36 | my ($op, $extra_bind, $ident, $args) = @_; |
37 | |
38 | my ($sql, $bind) = $self->next::method (@_); |
39 | |
40 | # If we're using ::NoBindVars, there are no binds by this point so this code |
41 | # gets skippeed. |
42 | if ($self->auto_cast && @$bind) { |
43 | my $new_sql; |
44 | my @sql_part = split /\?/, $sql; |
45 | my $col_info = $self->_resolve_column_info($ident,[ map $_->[0], @$bind ]); |
46 | |
47 | foreach my $bound (@$bind) { |
48 | my $col = $bound->[0]; |
0bd2c1cd |
49 | my $type = $self->_native_data_type($col_info->{$col}{data_type}); |
d047d650 |
50 | |
a7741335 |
51 | foreach my $data (@{$bound}[1..$#$bound]) { |
d047d650 |
52 | $new_sql .= shift(@sql_part) . |
ce012195 |
53 | ($type ? "CAST(? AS $type)" : '?'); |
d047d650 |
54 | } |
55 | } |
56 | $new_sql .= join '', @sql_part; |
57 | $sql = $new_sql; |
58 | } |
59 | |
60 | return ($sql, $bind); |
61 | } |
62 | |
63 | |
64 | =head1 AUTHORS |
65 | |
66 | See L<DBIx::Class/CONTRIBUTORS> |
67 | |
68 | =head1 LICENSE |
69 | |
70 | You may distribute this code under the same terms as Perl itself. |
71 | |
72 | =cut |
73 | |
74 | 1; |