Tim,

Thanks, I do keep forgetting about Driver.xst.

So, just to be clear. In DBI.pm, selectrow_array calls _do_selectrow which
calls prepare/execute/fetchsomething but this may be overriden by a driver
using selectrow_array in Driver.xst. If this is the case:

a) is there any way for my subclassed DBI to know this?
b) is there an easy way to identify which other methods this could apply to

Martin
--
Martin J. Evans
Easysoft Ltd, UK
http://www.easysoft.com


On 29-Mar-2006 Tim Bunce wrote:
> On Wed, Mar 29, 2006 at 11:54:32AM +0100, Martin J. Evans wrote:
>> The issue I am seeing is not quite as general as I made it sound. For
>> selectrow_hashref I see prepare/execute/fetch/fetchrow_hashref (as I expect)
>> but
>> for selectrow_arrayref and selectrow_array I only see prepare.
> 
> Generally... Drivers are free to implement any method in any way they choose.
> Their own methods don't have to call execute(), for example.
> 
> Specifically... you're probably seeing the effect of the Driver.xst
> C code that most compiled drivers embed into themselves. That code
> embeds C implementations of selectall_arrayref and several other
> methods into the driver itself. The selectall_arrayref code calls the
> drivers C functions to do the work. The result is much, much, faster
> than going though perl/DBI method dispatch for each row.
> 
> Tim.
> 
>> Martin
>> --
>> Martin J. Evans
>> Easysoft Ltd, UK
>> http://www.easysoft.com
>> 
>> 
>> On 29-Mar-2006 Martin J. Evans wrote:
>> > Hi,
>> > 
>> > I have subclassed DBI and override many methods including prepare, execute
>> > and
>> > select* although they are predominantly just passed on to DBI.
>> > 
>> > If I do:
>> > 
>> > my $sth->prepare(sql);
>> > $sth->execute;
>> > 
>> > I see the prepare and execute and pass them on to DBI.
>> > 
>> > If I do:
>> > 
>> > $dbh->selectrow_array(sql);
>> > 
>> > I see prepare and pass it on, but do not see execute. In my case this is
>> > more
>> > than an annoyance as I cannot see any bound parameter passed to execute.
>> > 
>> > e.g.
>> > 
>> > $selectrow_array = [
>> >                      'select b from mytest where a = ?',
>> >                      undef,
>> >                      \1
>> >                    ];
>> > prepare: select b from mytest where a = ?
>> > !!! no execute here
>> > 
>> > Or, perhaps I'm doing something wrong.
>> > 
>> > Can anyone tell me if I should be seeing the execute when $dbh->select***
>> > is
>> > called? I think I should.
>> > 
>> > Thanks
>> > 
>> > Martin
>> > --
>> > Martin J. Evans
>> > Easysoft Ltd, UK
>> > http://www.easysoft.com

Reply via email to