DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing


DBIx-Class documentation Contained in the DBIx-Class distribution.

Index


Code Index:

NAME

Top

DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing

SYNOPSIS

Top

  $schema->storage->auto_cast(1);

DESCRIPTION

Top

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']

connect_call_set_auto_cast

Executes:

  $schema->storage->auto_cast(1);

on connection.

Used as:

    on_connect_call => ['set_auto_cast']

in connect_info.

AUTHOR

Top

See CONTRIBUTORS in DBIx::Class

LICENSE

Top

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;