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!