X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FAutoCast.pm;h=aa08f505032b7ae8c1b8f3e3ad66db9255df1b25;hb=5529838f7afff91467ef2664087999ab222da48d;hp=850015b6b15a1b521d99e6f405923e4a0eaca068;hpb=26283ee38f220f6c6bae720ea5a189c9c0f47f6f;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/AutoCast.pm b/lib/DBIx/Class/Storage/DBI/AutoCast.pm index 850015b..aa08f50 100644 --- a/lib/DBIx/Class/Storage/DBI/AutoCast.pm +++ b/lib/DBIx/Class/Storage/DBI/AutoCast.pm @@ -10,7 +10,7 @@ __PACKAGE__->mk_group_accessors('simple' => 'auto_cast' ); =head1 NAME -DBIx::Class::Storage::DBI::AutoCast +DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing =head1 SYNOPSIS @@ -23,43 +23,60 @@ statements with values bound to columns or conditions that are not strings will throw implicit type conversion errors. As long as a column L is -defined, and it resolves to a base RDBMS native type via L as +defined and resolves to a base RDBMS native type via +L<_native_data_type|DBIx::Class::Storage::DBI/_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 +L as: + + on_connect_call => ['set_auto_cast'] + =cut sub _prep_for_execute { my $self = shift; - my ($op, $extra_bind, $ident, $args) = @_; my ($sql, $bind) = $self->next::method (@_); # If we're using ::NoBindVars, there are no binds by this point so this code -# gets skippeed. +# gets skipped. if ($self->auto_cast && @$bind) { my $new_sql; - my @sql_part = split /\?/, $sql; - my $col_info = $self->_resolve_column_info($ident,[ map $_->[0], @$bind ]); - - foreach my $bound (@$bind) { - my $col = $bound->[0]; - my $type = $self->_native_data_type($col_info->{$col}{data_type}); - - foreach my $data (@{$bound}[1..$#$bound]) { - $new_sql .= shift(@sql_part) . - ($type ? "CAST(? AS $type)" : '?'); - } + 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)" : '?'); } - $new_sql .= join '', @sql_part; - $sql = $new_sql; + $sql = $new_sql . shift @sql_part; } return ($sql, $bind); } +=head2 connect_call_set_auto_cast + +Executes: + + $schema->storage->auto_cast(1); + +on connection. + +Used as: + + on_connect_call => ['set_auto_cast'] + +in L. + +=cut + +sub connect_call_set_auto_cast { + my $self = shift; + $self->auto_cast(1); +} =head1 AUTHOR