A massive amount of link fixes (just links, almost no rewording)
[dbsrgits/DBIx-Class-Historic.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
5529838f 26defined and resolves to a base RDBMS native type via
27L<_native_data_type|DBIx::Class::Storage::DBI/_native_data_type> as
ce012195 28defined in your Storage driver, the placeholder for this column will be
29converted to:
d047d650 30
ce012195 31 CAST(? as $mapped_type)
d047d650 32
8384a713 33This option can also be enabled in
34L<connect_info|DBIx::Class::Storage::DBI/connect_info> as:
d867eeda 35
36 on_connect_call => ['set_auto_cast']
37
d047d650 38=cut
39
40sub _prep_for_execute {
41 my $self = shift;
d047d650 42
43 my ($sql, $bind) = $self->next::method (@_);
44
45# If we're using ::NoBindVars, there are no binds by this point so this code
4a0eed52 46# gets skipped.
d047d650 47 if ($self->auto_cast && @$bind) {
48 my $new_sql;
0e773352 49 my @sql_part = split /\?/, $sql, scalar @$bind + 1;
50 for (@$bind) {
51 my $cast_type = $self->_native_data_type($_->[0]{sqlt_datatype});
52 $new_sql .= shift(@sql_part) . ($cast_type ? "CAST(? AS $cast_type)" : '?');
d047d650 53 }
0e773352 54 $sql = $new_sql . shift @sql_part;
d047d650 55 }
56
57 return ($sql, $bind);
58}
59
d867eeda 60=head2 connect_call_set_auto_cast
61
62Executes:
63
64 $schema->storage->auto_cast(1);
65
66on connection.
67
68Used as:
69
70 on_connect_call => ['set_auto_cast']
71
8384a713 72in L<connect_info|DBIx::Class::Storage::DBI/connect_info>.
d867eeda 73
74=cut
75
76sub connect_call_set_auto_cast {
77 my $self = shift;
78 $self->auto_cast(1);
79}
d047d650 80
07a5866e 81=head1 AUTHOR
d047d650 82
83See L<DBIx::Class/CONTRIBUTORS>
84
85=head1 LICENSE
86
87You may distribute this code under the same terms as Perl itself.
88
89=cut
90
911;