Re: DBI-Users> RE: DBD-Oracle - obtaining OCI handles from $dbh
"Martin J. Evans" <[email protected]>
| Newsgroups | gmane.comp.lang.perl.modules.dbi.general |
|---|---|
| Organization | Easysoft Limited |
| Message-ID | <[email protected]> |
On 27/10/2011 17:43, John Scoles wrote: > Hmm....!! > > Well yes could be done but not as part of any release of DBD::Oracle it would have to be you own hacked version > Why is that John? What is the problem with returning a C pointer via a DBD::Oracle attribute? It is just a pointer to some memory and loads of XS modules do this. There is an Oracle OCI module I played with for a short time but it is problematic to build. I looked at it as I could implement OCI calls separately from DBD::Oracle. I don't seem the harm in exposing OCI handles via DBD::Oracle - it would be useful for people like the OP. > A few pointers to start. > > You will not be able to 'get' a handle and retrun it as a Scalar it will only ever be a pointer so you will just get some sort of number, > > You would simly edit the Oracle.xs file > > add in the includes to your C++ .h files > > then add a few extra > > 'ora_' > > functions to take care of you C++ calls; > > A quick example > > void > ora_some_c_call(dbh) > SV *dbh > PREINIT: > D_imp_dbh(dbh); //this gets all the OCI handles for you (see dbdimp.h for the sturct imp_dbh_st) > CODE: > MYSomeC_Plus_Plus_method(dbh->envhp,dbh->svchp,dbh->seshp,dbh->srvhp); > > He does not need to do this surely. So long as the C++ code and DBD::Oracle XS is running in the same process the pointers obtained from DBD::Oracle are just as valid in the C++ code as XS. However, if the code is multi-threaded there could be issues of multiple threads accessing the OCI handles at the same time. > > Myself I would write a small 'c' wrapper that would call you c++ and just a single .XS function that calls that small 'c' wrapper to fire your function. > My impression was that this was already done. I quote: "I have created some Perl bindings for some existing custom C++ libraries." Martin -- Martin J. Evans Easysoft Limited http://www.easysoft.com > Hope this helps > > Cheers > John > > >> Date: Thu, 27 Oct 2011 09:48:54 -0400 >> From: [email protected] >> To: [email protected] >> CC: [email protected] >> Subject: Re: DBI-Users> RE: DBD-Oracle - obtaining OCI handles from $dbh >> >> 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 ([email protected]): >>> >>> >>> >>>> Date: Wed, 26 Oct 2011 21:46:30 -0400 >>>> From: [email protected] >>>> To: [email protected] >>>> 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 >>> >