Yes, I assumed I would need to extend DBD::Oracle is some manner
to allow those handles to be extracted from a $dbh object.

The specific OCI handles that the C++ libraries use are

- Environment handle
- Service Context handle
- Session handle
- Server handle 

My initial thought process on how it might work is this

Create a method in the DBD::Oracle XS code to retrieve those
handles and return them back to Perl space as a scalar.

Then with the Perl scalars that hold the OCI handles obtained from
$dbh, pass those values to my Perl bindings to the custom C++ libraries.
(I would need to extend the C++ libraries to allow the set methods
to the objects that hold those OCI handles).

...then the C++ libraries should work the same.

The motivation for this approach is that I have a large code base
of these C++ libraries that have been tested, so it would cost
prohibitive to simply replace them with a pure Perl implementation.

However, it is so much easier to work with Perl and DBI, it would
be useful to have DBI connect to the database and do some table
lookups.  The C++ code could then be integrated seemlessly with my
Perl code.  As time allows, I would gradually peel away functionality
from the legacy C++ libraries and implement it in Perl.  But to 
ease the migration path, this approach seemed to have some merits.


Quoting John Scoles (byter...@hotmail.com):
> 
> 
>  
> 
> > Date: Wed, 26 Oct 2011 21:46:30 -0400
> > From: bro...@deseret.com
> > To: dbi-users@perl.org
> > Subject: DBD-Oracle - obtaining OCI handles from $dbh
> > 
> > I have created some Perl bindings for some existing custom C++ 
> > libraries.
> > 
> > One of these C++ libraries implements a class that uses Oracle
> > OCI calls.
> > 
> > I would like to create a connection to the Oracle database 
> > using Perl's DBI (DBD::Oracle) module, and then ideally share
> > that connection with the C++ libraries.
> > 
> > This would require me to extract the Oracle OCI handles from
> > the $dbh object...and then pass them to the C++ libraries.
> > 
> > What would be the best way to get access to the underlying
> > Oracle OCI handles from a $dbh object?
> 
> Hmm! Interesting concept.  Which OCI handles are we talking about??
> Like Matin said you would have to do that with .XS and you would pass I guess 
> a pointer to the 
> 'C' struct that holds the pointers to DBD::Oraclles pointers? 
>  
> You would have to cast that struct into you C++ somehow??
>  
> There would be a good number of handles to pass over.  You might be able to 
> find them by looking at the Perl process tree
> and finding the SV that holds the struct and then sening that over?
>  
> All just guesses on my part.
>  
> Interesting concept non the less.
>  
> Cheers
> John
>                                         

Reply via email to