On Mon, Jun 02, 2003 at 02:27:13PM +0100, Dominic Mitchell wrote:
> >>Well, we're calling PQsetNoticeProcessor[1], from inside dbd_db_login,
> >>so I should be able to pass in imp_dbh as the "arg" argument. The bit
> >>that I wasn't sure about before was what to cast it to in order to
> >>retrieve it from a void *.
> >
> >You could always cast it to a void * :-)
>
> Right, I've tried to amend my patch to save a reference to the dbh, and
> only warn if DBIc_WARN(), just like all the other cases in the code.
>
> However, it doesn't work. When the callback function pg_warn() gets
> called, DBI complains that I've passed in undef. Which implies that the
> dbh I'm using has gone out of scope somewhere, but I can't see where.
>
> Would somebody who's more familiar with DBD::Pg mind having a look at
> the attached patch? I've got no idea why it isn't working. :-(
Ah, you're passing it the address of (probably temporary) reference.
It's the underlying object (which the ref points to) that you need.
Try something like:
PQsetNoticeProcessor(imp_dbh->conn, pg_warn, (void *)SvRV(dbh));
the D_imp_dbh( (SV *)arg ) will do-the-right-thing *if* the
handle is the 'last handle used' ($DBI::lasth) whenever it's called.
That's probably not a safe assumption so you could try something
more like this:
D_imp_dbh( sv_2mortal(newRV((SV*)arg)) );
Tim.