On 20/07/15 14:15, Tim Bunce wrote:
On Mon, Jul 20, 2015 at 08:55:40AM +0100, Martin J. Evans wrote:
On 19/07/15 15:41, Tim Bunce wrote:

Please also see the issue I reported in DBI back in 2012:

https://rt.cpan.org/Ticket/Display.html?id=81911

I had to add various workarounds and a warning to DBD::ODBC.

Ah, thanks for the reminder Martin! I'll add a comment on that case.

Any thoughts about the general principle of changing the XS execute to
return the value of the DBIc_ROW_COUNT IV if the int returned by
dbd_st_execute is > 0 and DBIc_ROW_COUNT > 0?

Tim.


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. 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?

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. Is there some docs on that or perhaps you could just 
tell me or point me at a driver that does it correctly.

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

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

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.

Martin

Reply via email to