Re: Clarification sought on deleting connection attributes

"Martin J. Evans" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.dbi.sybase.devel
Message-ID <[email protected]>
Tim Bunce wrote:
> 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.
>
>   
Thanks - tis good to be the first ;-)

The replacement call works fine.

I will formulate a patch for the docs and send tomorrow which I'm 
presuming will need to include the name fix for DBD_ATTRIB_DELETE as 
I've not seen a checkin for that but I have seen a checkin for the above 
fix.

BTW, I am aware I /owe/ you a patch for the DBI::DBD docs for tracing 
flags but I was way too busy at the time; it is still on my list and I 
hope to address that too this week.

Martin
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.