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.