On Tue, Dec 08, 2009 at 01:32:33PM +0000, Martin Evans wrote:
> 
> Done and one last (I'm hoping) thing. The PurePerl version that was
> added does not match the XS version as the success of the cast (or not)
> is not reflected in the return value.

That PurePerl one I did was just a rough sketch.

> The following change fixes it but
> I'd rather see some comment on it before committing:
> 
> Index: lib/DBI/PurePerl.pm
> ===================================================================
> --- lib/DBI/PurePerl.pm       (revision 13653)
> +++ lib/DBI/PurePerl.pm       (working copy)
> @@ -682,21 +682,30 @@
> 
>      return -1 unless defined $_[0];
> 
> -    my $cast_ok = 0;
> +    my $cast_ok = 1;
> 
> -    if ($sql_type == SQL_INTEGER) {
> -        my $dummy = $_[0] + 0;
> -    }
> -    elsif ($sql_type == SQL_DOUBLE) {
> -        my $dummy = $_[0] + 0.0;
> -    }
> -    elsif ($sql_type == SQL_NUMERIC) {
> -        my $dummy = $_[0] + 0.0;
> -    }
> -    else {
> -        return -2;
> -    }
> +    my $evalret = eval {
> +        use warnings FATAL => qw(numeric);
> +        if ($sql_type == SQL_INTEGER) {
> +            my $dummy = $_[0] + 0;
> +            return 1;
> +        }
> +        elsif ($sql_type == SQL_DOUBLE) {
> +            my $dummy = $_[0] + 0.0;
> +            return 1;
> +        }
> +        elsif ($sql_type == SQL_NUMERIC) {
> +            my $dummy = $_[0] + 0.0;
> +            return 1;
> +        }
> +        else {
> +            return -2;
> +        }
> +    } or warn $@;
> 
> +    return $evalret if defined($evalret) && ($evalret == -2);
> +    $cast_ok = 0 unless $evalret;
> +
>      # DBIstcf_DISCARD_STRING not supported for PurePerl currently
> 
>      return 2 if $cast_ok;
> 
> With this in place all the tests pass on 5.10.1 and 5.10.0.

use warnings FATAL => qw(numeric); is s nice approach.
I don't think that'll affect the minimum perl version (5.8.1)

The lack of difference in the code between SQL_DOUBLE and SQL_NUMERIC is
a little troubling, though I've no time to think about it right now.

Go ahead and commit anyway.

I think docs for DBI::sql_type_cast are the next thing we need.

Tim.

Reply via email to