| DBIx-Class documentation | Contained in the DBIx-Class distribution. |
DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing
$schema->storage->auto_cast(1);
In some combinations of RDBMS and DBD drivers (e.g. FreeTDS and Sybase) statements with values bound to columns or conditions that are not strings will throw implicit type conversion errors.
As long as a column data_type is defined and resolves to a base RDBMS native type via _native_data_type as defined in your Storage driver, the placeholder for this column will be converted to:
CAST(? as $mapped_type)
This option can also be enabled in connect_info as:
on_connect_call => ['set_auto_cast']
Executes:
$schema->storage->auto_cast(1);
on connection.
Used as:
on_connect_call => ['set_auto_cast']
in connect_info.
You may distribute this code under the same terms as Perl itself.
| DBIx-Class documentation | Contained in the DBIx-Class distribution. |
package DBIx::Class::Storage::DBI::AutoCast; use strict; use warnings; use base qw/DBIx::Class::Storage::DBI/; use mro 'c3'; __PACKAGE__->mk_group_accessors('simple' => 'auto_cast' );
sub _prep_for_execute { my $self = shift; my ($sql, $bind) = $self->next::method (@_); # If we're using ::NoBindVars, there are no binds by this point so this code # gets skippeed. if ($self->auto_cast && @$bind) { my $new_sql; my @sql_part = split /\?/, $sql, scalar @$bind + 1; for (@$bind) { my $cast_type = $self->_native_data_type($_->[0]{sqlt_datatype}); $new_sql .= shift(@sql_part) . ($cast_type ? "CAST(? AS $cast_type)" : '?'); } $sql = $new_sql . shift @sql_part; } return ($sql, $bind); }
sub connect_call_set_auto_cast { my $self = shift; $self->auto_cast(1); }
1;