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