On Mon, Jul 20, 2015 at 02:54:53PM +0100, Martin J. Evans wrote:
> On 20/07/15 14:15, Tim Bunce wrote:
> 
> I think that would work for me - I'm happy to test it our here if you want to 
> give it a go.
> 
> IIRC, when this was last discussed the problem is that some drivers
> might not set DBIc_ROW_COUNT so you can't just use DBIc_ROW_COUNT.

Hence the check that DBIc_ROW_COUNT is not zero. Since the DBI code sets
it to zero before the call, if it's non-zero after the call we can be
sure that the driver has set it.

> In fact, I just checked, and DBD::ODBC does not seem to call
> DBIc_ROW_COUNT other than to set it to 0 in ODBC.xsi (which is code
> from DBI anyway). Does that sound right?

Nope. Is it setting the underlying structure member directly?

> If a driver is supposed to set DBIc_ROW_COUNT I'd rather change the
> drivers I maintain to do that especially since in ODBC and 64bit
> SQLRowCount already returns a 64 bit value.

Yeap. That's best.

> Is there some docs on that or perhaps you could just tell me or point
> me at a driver that does it correctly.

No docs, sadly. And I'm not aware of any drivers that do.

I took a look at DBD:Pg and that uses it's own 'rows' structure
member which is defined as an int, and int is used in the code.

I also noticed something I should have seen before: dbd_st_rows() is
defined as returning an int. I _think_ it would be safe to change the
definition to returning an IV since it's only used internally by drivers
via the Driver.xst template file that does:

    XST_mIV(0, dbd_st_rows(sth, imp_sth));

> I'm having a frustrating day so far so perhaps have lost the ability to read 
> diffs and C but in your change at
> https://github.com/perl5-dbi/dbi/commit/29f6b9b76e9c637be31cb80f1a262ff68b42ef43#diff-cb6af96fe009d6f8d9d682415e1ab755
> 
> "if retval>0 (checked above) " I don't see where the "checked above" bit is.
> it looks like:
> if (retval == 0)
>   ..
> else if (retval == -1)
>   ..
> else if (retval <= -2)
>   ..
> else
>   new stuff here
>   retval could still be negative just not -1 or -2

The "else if (retval <= -2)" covers other negative values, doesn't it?

> Also, maybe a little picky but the comment "and DBIc_ROW_COUNT>0" does not 
> match the code.

Yeah, I was in two minds about that. I'll use DBIc_ROW_COUNT>0 in
practice, but !=0 seemed a better fit for the experimental warning.

> If no DBDs use DBIc_ROW_COUNT then that warning you've put in will do
> nothing. I'd like to see a driver which does use DBIc_ROW_COUNT and if
> there are none I'm happy to change DBD::ODBC initially to a) test the
> diff you just applied and b) test the suggested fix.

That would be great. Thank you Martin!

Tim.

Reply via email to