=head1 NAME
-DBIx::Class::Storage::DBI::AutoCast
+DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing
=head1 SYNOPSIS
throw implicit type conversion errors.
As long as a column L<data_type|DBIx::Class::ResultSource/add_columns> is
-defined, and it resolves to a base RDBMS native type via L</_map_data_type> 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<connect_info|DBIx::Class::Storage::DBI/connect_info> 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->_map_data_type($col_info->{$col}{data_type});
-
- foreach my $data (@{$bound}[1..$#$bound]) { # <--- this will multiply the amount of ?'s no...?
- $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<connect_info|DBIx::Class::Storage::DBI/connect_info>.
+
+=cut
+
+sub connect_call_set_auto_cast {
+ my $self = shift;
+ $self->auto_cast(1);
+}
-=head1 AUTHORS
+=head1 FURTHER QUESTIONS?
-See L<DBIx::Class/CONTRIBUTORS>
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
-=head1 LICENSE
+=head1 COPYRIGHT AND LICENSE
-You may distribute this code under the same terms as Perl itself.
+This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
+by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
+redistribute it and/or modify it under the same terms as the
+L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
=cut