On Mon, Jul 28, 2008 at 05:09:03PM +0100, Martin Evans wrote:
> Tim Bunce wrote:
>> On Mon, Jul 28, 2008 at 01:13:50PM +0100, Martin Evans wrote:
>>> Hi,
>>>
>>> From the DBI::DBD docs in "The dbd_db_login6 method" I read:
>>>
>>> =====
>>> Here’s how you fetch them; as an example we use hostname attribute,
>>> which can be up to 12 characters long excluding null terminator:
>>>
>>> SV** svp;
>>> STRLEN len;
>>> char* hostname;
>>>
>>> if ( (svp = DBD_ATTRIB_GET_SVP(attr, "drv_hostname", 12)) && SvTRUE(*svp)) {
>>>    hostname = SvPV(*svp, len);
>>>    DBD__ATTRIB_DELETE(attr, "drv_hostname", 12); /* avoid later STORE */
>>> } else {
>>>     hostname = "localhost";
>>> }
>>> =====
>>>
>>> My question concerns the comment saying "avoid later STORE". If I have a 
>>> DBD::ODBC specific attribute which a) may be specified on the connect 
>>> call and b) is copied to any statement handles when they are created and 
>>> c) may also be on a statement handle, should I be calling 
>>> DBD__ATTRIB_DELETE? and what does that "avoid later STORE" really mean?
>>
>> After $drh->connect(..., $attr) returns a handle DBI->connect(...)
>> effectively does $dbh->STORE($_, $attr->{$_}) for keys %$attr;
>>
>> If the handle has already dealt with the attribute during the drivers
>> connect/login processing then the later STORE by the DBI is at best
>> redundant and could, at worse, cause problems/errors/whatever.
>>
>> So the driver can delete from %$attr any attributes it doesn't want the
>> DBI to call STORE on later.
>>
>> Tim.
>>
>> p.s. patch to DBI::DBD docs most welcome!
>
> Thanks for the clarification.
>
> First patch appears to be:
>
> DBD__ATTRIB_DELETE => DBD_ATTRIB_DELETE
>
> as I can find the latter and not the former. Unless I've got something else 
> wrong I get a segfault the minute I used DBD_ATTRIB_DELETE and I notice 
> DBD::Oracle does not use it. Is anyone using DBD_ATTRIB_DELETE and can 
> confirm it works?

Ah. Bug. It's missing an SvRV. Fixed in r11605. Thanks!
Meanwhile, just use 
    hv_delete((HV*)SvRV(attribs), key, key_len, G_DISCARD)
instead.

Tim.

Reply via email to