Massive rewrite of bind handling, and overall simplification of ::Storage::DBI
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / AutoCast.pm
CommitLineData
d047d650 1package DBIx::Class::Storage::DBI::AutoCast;
2
3use strict;
4use warnings;
5
6use base qw/DBIx::Class::Storage::DBI/;
7use mro 'c3';
8
9__PACKAGE__->mk_group_accessors('simple' => 'auto_cast' );
10
11=head1 NAME
12
d7d812cf 13DBIx::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 21In some combinations of RDBMS and DBD drivers (e.g. FreeTDS and Sybase)
22statements with values bound to columns or conditions that are not strings will
23throw implicit type conversion errors.
d047d650 24
25As long as a column L<data_type|DBIx::Class::ResultSource/add_columns> is
48580715 26defined and resolves to a base RDBMS native type via L</_native_data_type> as
ce012195 27defined in your Storage driver, the placeholder for this column will be
28converted to:
d047d650 29
ce012195 30 CAST(? as $mapped_type)
d047d650 31
8384a713 32This option can also be enabled in
33L<connect_info|DBIx::Class::Storage::DBI/connect_info> as:
d867eeda 34
35 on_connect_call => ['set_auto_cast']
36
d047d650 37=cut
38
39sub _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
45# gets skippeed.
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
61Executes:
62
63 $schema->storage->auto_cast(1);
64
65on connection.
66
67Used as:
68
69 on_connect_call => ['set_auto_cast']
70
8384a713 71in L<connect_info|DBIx::Class::Storage::DBI/connect_info>.
d867eeda 72
73=cut
74
75sub connect_call_set_auto_cast {
76 my $self = shift;
77 $self->auto_cast(1);
78}
d047d650 79
07a5866e 80=head1 AUTHOR
d047d650 81
82See L<DBIx::Class/CONTRIBUTORS>
83
84=head1 LICENSE
85
86You may distribute this code under the same terms as Perl itself.
87
88=cut
89
901;