On 24/02/10 10:18, Martin Evans wrote:
> Tim Bunce wrote:
>> The Oracle::OCI module might be useful. See lob examples in
>> http://cpansearch.perl.org/src/TIMB/Oracle-OCI-0.06/05dbi.t
>>
>> Tim.
> 
> I tried but I don't have a full Oracle distribution just an instant
> client and after an hour of hackery I got close:

[ snip ]

> In the end I can change my procedure to return a reference cursor
> (although that will be annoying) or just an empty clob. I wish I had
> more time to look at this but I'm really struggling.

Oracle::OCI has received no maintenance since August 2001.

I have attached a patch I have used to make a version which
can be built against a full Oracle 10.2 client. 

I am offering this patch *completely unsupported*. I simply
do not have the time to maintain Oracle::OCI.

-- 
Charles Jardine - Computing Service, University of Cambridge
[email protected]    Tel: +44 1223 334506, Fax: +44 1223 334679
diff -r -u Oracle-OCI-0.06/01base.t Oracle-OCI-0.06.patched/01base.t
--- Oracle-OCI-0.06/01base.t    2001-08-31 23:02:45.000000000 +0100
+++ Oracle-OCI-0.06.patched/01base.t    2009-11-02 10:22:57.724121690 +0000
@@ -96,7 +96,7 @@
 ok OCIAttrSet($$authp, OCI_HTYPE_SESSION, @user_buf_len, OCI_ATTR_USERNAME, 
$errhp), 0;
 ok OCIAttrSet($$authp, OCI_HTYPE_SESSION, @pass_buf_len, OCI_ATTR_PASSWORD, 
$errhp), 0;
 
-ok $status=OCISessionBegin($svchp, $errhp, $authp, OCI_CRED_RDBMS, 
OCI_DEFAULT), 0;
+ok $status=OCISessionBegin($svchp, $errhp, $authp, $user ? OCI_CRED_RDBMS : 
OCI_CRED_EXT, OCI_DEFAULT), 0;
 warn get_oci_error($errhp, $status) unless $status == OCI_SUCCESS;
 
 ok OCIAttrSet($$svchp, OCI_HTYPE_SVCCTX, $$authp, 0, OCI_ATTR_SESSION, 
$errhp), 0;
diff -r -u Oracle-OCI-0.06/boot Oracle-OCI-0.06.patched/boot
--- Oracle-OCI-0.06/boot        2001-08-30 16:49:24.000000000 +0100
+++ Oracle-OCI-0.06.patched/boot        2009-11-02 10:22:57.740121753 +0000
@@ -1,9 +1,8 @@
-#!/opt/perl5/bin/perl -w
-
 require 5.6.0;
 use strict;
 
 use Carp;
+use Config;
 use File::Path;
 use File::Copy;
 use File::Basename;
@@ -17,6 +16,15 @@
 
 $| = 1;
 
+# The following is based on conventions entirely local to Jackdaw.
+# Perl install trees are at /usr/local/perl/<version>-<letter>.
+# Libraries for DBD::Oracle are at 
$ORACLE_HOME/PERL/<version>-<letter>/lib/DBD/Oracle.
+
+my $perlpath = $Config{perlpath};
+my $perlvl = (split /\//, $perlpath)[-3];
+my $ora_arch_dir = "$ENV{ORACLE_HOME}/PERL/$perlvl/lib/auto/DBD/Oracle";
+
+print "Oracle arch dir is $ora_arch_dir\n";
 
 ########################################################################
 # configuration section.  
@@ -99,6 +107,9 @@
        TypeArrayByRef  => "?",
        EnvCallback     => "?",
        SharedLibInit   => "uses 'dvoid *argv[]' type that we've not supported 
yet",
+        XmlDbInitXmlCtx => "",
+        XmlDbFreeXmlCtx => "",
+       NumberToRealArray => "",
        '_ORACLE'       => "empty define - used to prevent multiple #includes",
        '_FLAGS'        => "empty define - used to prevent multiple #includes",
     } } ],
@@ -131,15 +142,14 @@
 -d $orahome  or croak "Error:  no such directory: $orahome";
 -r _ && -x _ or croak "Error:  bad mods on $orahome";
 
-my $demodir  = "$orahome/rdbms/demo";
--d $demodir  or croak "Error:  no directory '$demodir'";
--r _ && -x _ or croak "Error:  bad mods on '$demodir'";
-my $oci_hdr = "$demodir/oci.h";
+my $publicdir  = "$orahome/rdbms/public";
+-d $publicdir  or croak "Error:  no directory '$publicdir'";
+-r _ && -x _ or croak "Error:  bad mods on '$publicdir'";
+my $oci_hdr = "$publicdir/oci.h";
 -e $oci_hdr or croak "Error:  hit by a missing oci.h";
 -r _        or croak "Error:  unreadable $oci_hdr";
 
-my @ora_dirs = ($demodir,
-       "$orahome/rdbms/public",
+my @ora_dirs = ($publicdir,
        "$orahome/network/public",
        "$orahome/plsql/public",
 );
@@ -165,7 +175,8 @@
 my $skip_regex = '^OCI(?!' . join('|',@skip_list) . ')|^SQL';
 
 my @h2xsargz = (
-    qw( ./h2xs -d -O -n Oracle::OCI ),
+    $perlpath,
+    qw( h2xs -d -O -n Oracle::OCI ),
     "-F ".join(" ", map { "-I$_" } @ora_dirs),
     "-I".join(",", @ora_dirs),
     "-E get_oci_error,get_oci_handle,oci_buf_len,OCIAttrGet",
@@ -293,8 +304,7 @@
                use DBI::DBD;
                my $dbi_dir      = dbd_dbi_dir();
                my $dbi_arch_dir = dbd_dbi_arch_dir();
-               (my $ora_arch_dir = $dbi_arch_dir) =~ s!DBI$!DBD/Oracle!;
-       }."\n" if $. == 1;
+               my $ora_arch_dir = }."'$ora_arch_dir';\n\n" if $. == 1;
        s!^\);!      CONFIGURE => \\&wmf_config,\n);!;
        print $new_mk $_;
     }
@@ -323,7 +333,7 @@
 }
 
 print "Building...\n";
-system("perl Makefile.PL && make && make test");
+system("$perlpath Makefile.PL && make && make test") && exit 1;
 
 exit 0;
 
diff -r -u Oracle-OCI-0.06/extra.typemap Oracle-OCI-0.06.patched/extra.typemap
--- Oracle-OCI-0.06/extra.typemap       2001-08-05 23:58:29.000000000 +0100
+++ Oracle-OCI-0.06.patched/extra.typemap       2009-11-02 10:22:57.752121800 
+0000
@@ -1,7 +1,10 @@
 OCIRaw *               T_PTROBJ
 OCIRef *               T_PTROBJ
+OCIString *            T_PTROBJ
 OCITrans *             T_PTROBJ
 OCIType *              T_PTROBJ
+OCITypeElem *          T_PTROBJ
+OCITypeMethod *                T_PTROBJ
 int *                  T_PTROBJ
 void *                 T_PTROBJ
 sb1                    T_IV
diff -r -u Oracle-OCI-0.06/extra.xsh Oracle-OCI-0.06.patched/extra.xsh
--- Oracle-OCI-0.06/extra.xsh   2001-09-01 00:57:00.000000000 +0100
+++ Oracle-OCI-0.06.patched/extra.xsh   2009-11-02 10:35:52.187172901 +0000
@@ -82,8 +82,7 @@
         int ptr_len = (SvNIOK(result_type)) ? SvIV(result_type) : 0;
        if (ptr_len==0 && !looks_like_number(result_type) ) {
            /* result_type is the name of a class to bless pointer into */
-           /* so we set ptr_len 4 and arrange to return a blessed ref. */
-           ptr_len = 4;
+           /* so we arrange to return a blessed ref.                   */
            bless = SvPV(result_type,lna);
        }
        switch (ptr_len) {
@@ -92,14 +91,23 @@
            RETVAL = OCIAttrGet(trgthndlp, trghndltyp, (void*)&b4_val, 0, 
attrtype, errhp);
            if (RETVAL==OCI_SUCCESS || RETVAL==OCI_SUCCESS_WITH_INFO) {
                switch (ptr_len) {
-               case  1: sv_setiv(attributep_sv, (IV)*((ub1*)&b4_val)); break;
+               case  1: sv_setuv(attributep_sv, (UV)*((ub1*)&b4_val)); break;
                case -1: sv_setiv(attributep_sv, (IV)*((sb1*)&b4_val)); break;
-               case  2: sv_setiv(attributep_sv, (IV)*((ub2*)&b4_val)); break;
+               case  2: sv_setuv(attributep_sv, (UV)*((ub2*)&b4_val)); break;
                case -2: sv_setiv(attributep_sv, (IV)*((sb2*)&b4_val)); break;
                case  4: sv_setuv(attributep_sv, (UV)*((ub4*)&b4_val)); break;
                case -4: sv_setiv(attributep_sv, (IV)*((sb4*)&b4_val)); break;
                }
                if (bless) {
+               }
+           }
+           else SvOK_off(attributep_sv);
+           break;
+       case 0:
+           if (bless) {
+               RETVAL = OCIAttrGet(trgthndlp, trghndltyp, &ptr, 0, attrtype, 
errhp);
+               if (RETVAL==OCI_SUCCESS || RETVAL==OCI_SUCCESS_WITH_INFO) {
+                   sv_setuv(attributep_sv, (UV)ptr);
                    SV *rv = newRV(sv_mortalcopy(attributep_sv));
                    HV * bless_stash = gv_stashpv(bless, 0);
                    if (!bless_stash) {
@@ -111,20 +119,20 @@
                    sv_bless(rv, bless_stash);
                    sv_setsv(attributep_sv, rv);
                }
+               else SvOK_off(attributep_sv);
            }
-           else SvOK_off(attributep_sv);
-           break;
-       case 0:
-           RETVAL = OCIAttrGet(trgthndlp, trghndltyp, &ptr, &sizep, attrtype, 
errhp);
-           if (RETVAL==OCI_SUCCESS || RETVAL==OCI_SUCCESS_WITH_INFO) {
-               /* OCIAttrGet may set ptr to null, sv_setpvn() treats that as 
undef */
-               sv_setpvn(attributep_sv, ptr, sizep);
-               if (!SvREADONLY(sizep_sv)) {
-                   sv_setiv(sizep_sv, sizep);
-                   SvSETMAGIC(sizep_sv); /* redundant */
+           else {
+               RETVAL = OCIAttrGet(trgthndlp, trghndltyp, &ptr, &sizep, 
attrtype, errhp);
+               if (RETVAL==OCI_SUCCESS || RETVAL==OCI_SUCCESS_WITH_INFO) {
+                   /* OCIAttrGet may set ptr to null, sv_setpvn() treats that 
as undef */
+                   sv_setpvn(attributep_sv, ptr, sizep);
+                   if (!SvREADONLY(sizep_sv)) {
+                       sv_setiv(sizep_sv, sizep);
+                       SvSETMAGIC(sizep_sv); /* redundant */
+                   }
                }
+               else SvOK_off(attributep_sv);
            }
-           else SvOK_off(attributep_sv);
            break;
        default:
            croak("Invalid pointer width '%s' for OCIAttrGet", 
SvPV(result_type,lna));
diff -r -u Oracle-OCI-0.06/getptrdef.h Oracle-OCI-0.06.patched/getptrdef.h
--- Oracle-OCI-0.06/getptrdef.h 2001-07-11 10:32:56.000000000 +0100
+++ Oracle-OCI-0.06.patched/getptrdef.h 2009-11-02 10:22:57.800121989 +0000
@@ -1,13 +1,25 @@
 #define ora_getptr_Lda_DefPtr ora_getptr_generic
+#define ora_getptr_OCIAdminPtr ora_getptr_generic
+#define ora_getptr_OCIAnyDataPtr ora_getptr_generic
+#define ora_getptr_OCIAnyDataSetPtr ora_getptr_generic
 #define ora_getptr_OCIAQDeqOptionsPtr ora_getptr_generic
 #define ora_getptr_OCIAQEnqOptionsPtr ora_getptr_generic
 #define ora_getptr_OCIAQMsgPropertiesPtr ora_getptr_generic
+#define ora_getptr_OCIAuthInfoPtr ora_getptr_generic
 #define ora_getptr_OCIBindPtr ora_getptr_generic
 #define ora_getptr_OCICallbackDefine ora_getptr_generic
 #define ora_getptr_OCICallbackInBind ora_getptr_generic
+#define ora_getptr_OCICallbackLobArrayRead ora_getptr_generic
+#define ora_getptr_OCICallbackLobArrayWrite ora_getptr_generic
+#define ora_getptr_OCICallbackLobRead ora_getptr_generic
+#define ora_getptr_OCICallbackLobRead2 ora_getptr_generic
+#define ora_getptr_OCICallbackLobWrite ora_getptr_generic
+#define ora_getptr_OCICallbackLobWrite2 ora_getptr_generic
 #define ora_getptr_OCICallbackOutBind ora_getptr_generic
 #define ora_getptr_OCICollPtr ora_getptr_generic
 #define ora_getptr_OCIComplexObjectPtr ora_getptr_generic
+#define ora_getptr_OCICPoolPtr ora_getptr_generic
+#define ora_getptr_OCIDOMDocumentPtr ora_getptr_generic
 #define ora_getptr_OCIDatePtr ora_getptr_generic
 #define ora_getptr_OCIDateTimePtr ora_getptr_generic
 #define ora_getptr_OCIDefinePtr ora_getptr_generic
@@ -18,6 +30,7 @@
 #define ora_getptr_OCIDurationPtr ora_getptr_generic
 #define ora_getptr_OCIEnvPtr ora_getptr_generic
 #define ora_getptr_OCIErrorPtr ora_getptr_generic
+#define ora_getptr_OCIEventPtr ora_getptr_generic
 #define ora_getptr_OCIFileObjectPtr ora_getptr_generic
 #define ora_getptr_OCIIndPtr ora_getptr_generic
 #define ora_getptr_OCIIntervalPtr ora_getptr_generic
@@ -27,6 +40,7 @@
 #define ora_getptr_OCIMsgPtr ora_getptr_generic
 #define ora_getptr_OCINumberPtr ora_getptr_generic
 #define ora_getptr_OCIObjectEvent ora_getptr_generic
+#define ora_getptr_OCIParamPtr ora_getptr_generic
 #define ora_getptr_OCIObjectProperty ora_getptr_generic
 #define ora_getptr_OCIPicklerFdoPtr ora_getptr_generic
 #define ora_getptr_OCIPicklerImagePtr ora_getptr_generic
@@ -38,10 +52,12 @@
 #define ora_getptr_OCIRefPtr ora_getptr_generic
 #define ora_getptr_OCIRefreshOpt ora_getptr_generic
 #define ora_getptr_OCIResultPtr ora_getptr_generic
+#define ora_getptr_OCIRowidPtr ora_getptr_generic
 #define ora_getptr_OCISecurityPtr ora_getptr_generic
 #define ora_getptr_OCIServerPtr ora_getptr_generic
 #define ora_getptr_OCISessionPtr ora_getptr_generic
 #define ora_getptr_OCISnapshotPtr ora_getptr_generic
+#define ora_getptr_OCISPoolPtr ora_getptr_generic
 #define ora_getptr_OCIStmtPtr ora_getptr_generic
 #define ora_getptr_OCIStringPtr ora_getptr_generic
 #define ora_getptr_OCISubscriptionPtr ora_getptr_generic
@@ -63,6 +79,10 @@
 #define ora_getptr_OCIUserCallback ora_getptr_generic
 #define ora_getptr_OCIUserCallbackPtr ora_getptr_generic
 #define ora_getptr_OCIWcharPtr ora_getptr_generic
+#define ora_getptr_OCIXADFieldPtr ora_getptr_generic
+#define ora_getptr_OCIXADTablePtr ora_getptr_generic
+#define ora_getptr_OCIXMLTypePtr ora_getptr_generic
+#define ora_getptr_OraTextPtr ora_getptr_generic
 #define ora_getptr_nzttBufferBlockPtr ora_getptr_generic
 #define ora_getptr_nzttCipherType ora_getptr_generic
 #define ora_getptr_nzttIdentType ora_getptr_generic
diff -r -u Oracle-OCI-0.06/h2xs Oracle-OCI-0.06.patched/h2xs
--- Oracle-OCI-0.06/h2xs        2001-08-07 10:54:42.000000000 +0100
+++ Oracle-OCI-0.06.patched/h2xs        2009-11-02 10:22:57.824122084 +0000
@@ -1,7 +1,3 @@
-#!/opt/perl5/bin/perl
-    eval 'exec /opt/perl5/bin/perl -S $0 ${1+"$@"}'
-       if $running_under_some_shell;
-
 =head1 NAME
 
 h2xs - convert .h C header files to Perl extensions
@@ -557,6 +553,7 @@
     my @td;
     my @good_td;
     my $addflags = $opt_F || '';
+    $addflags = "-D__extension__= -D__inline= -P $addflags";
 
     # pass -I dirs on into C::Scan
     my @dirs_h = split /,/, $opt_I||'';
@@ -571,8 +568,10 @@
        $filter = $';
       }
       warn "Scanning $filename for functions...\n";
+      my @styles = $Config{gccversion} ? qw(C++ C9X GNU) : qw(C++ C9X);
+      warn "c_styles: " , join(' ', @styles), "\n";
       $c = new C::Scan 'filename' => $filename, 'filename_filter' => $filter,
-       'add_cppflags' => $addflags, 'c_styles' => [qw(C++ C9X)];
+       'add_cppflags' => $addflags, 'c_styles' => \...@styles;
       $c->set('includeDirs' => [...@dirs_h,"$Config::Config{archlib}/CORE"]);
 
       # force addition of __restrict into keywords (asap)
diff -r -u Oracle-OCI-0.06/utility.c Oracle-OCI-0.06.patched/utility.c
--- Oracle-OCI-0.06/utility.c   2001-09-01 01:03:05.000000000 +0100
+++ Oracle-OCI-0.06.patched/utility.c   2009-11-02 10:22:57.848122179 +0000
@@ -39,7 +39,7 @@
 
 
 I32
-oci_buf_getmaxlen(IV svptr_iv, SV* len_sv)
+oci_buf_getmaxlen(pTHX_ IV svptr_iv, SV* len_sv)
 {
     STRLEN lna;
     SV *buf_sv = (SV*)svptr_iv;
@@ -50,7 +50,7 @@
 }
 
 I32
-oci_buf_setcurlen(IV svptr_iv, SV* len_sv)
+oci_buf_setcurlen(pTHX_ IV svptr_iv, SV* len_sv)
 {
     SV *buf_sv = (SV*)svptr_iv;
     IV len = SvIV(len_sv);
diff -r -u Oracle-OCI-0.06/utility.h Oracle-OCI-0.06.patched/utility.h
--- Oracle-OCI-0.06/utility.h   2001-07-07 21:29:46.000000000 +0100
+++ Oracle-OCI-0.06.patched/utility.h   2009-11-02 10:22:57.856122210 +0000
@@ -9,8 +9,8 @@
 
 void *ora_getptr_generic(SV *arg, char *var, char *type, char *func);
 
-I32 oci_buf_getmaxlen(IV svptr_iv, SV* len_sv);
-I32 oci_buf_setcurlen(IV svptr_iv, SV* len_sv);
+I32 oci_buf_getmaxlen(pTHX_ IV svptr_iv, SV* len_sv);
+I32 oci_buf_setcurlen(pTHX_ IV svptr_iv, SV* len_sv);
 
 
 #include "getptrdef.h"

Reply via email to