Author: byterock
Date: Fri Mar 27 06:01:46 2009
New Revision: 12637

Modified:
   dbd-oracle/trunk/Oracle.xs

Log:
fix for blobs and utf8

Modified: dbd-oracle/trunk/Oracle.xs
==============================================================================
--- dbd-oracle/trunk/Oracle.xs  (original)
+++ dbd-oracle/trunk/Oracle.xs  Fri Mar 27 06:01:46 2009
@@ -4,43 +4,43 @@
 
 DBISTATE_DECLARE;
 
-MODULE = DBD::Oracle    PACKAGE = DBD::Oracle
+MODULE = DBD::Oracle   PACKAGE = DBD::Oracle
 
 I32
 constant(name=Nullch)
-    char *name
-    ALIAS:
-    ORA_VARCHAR2 = ORA_VARCHAR2
-    ORA_NUMBER  = ORA_NUMBER
-    ORA_STRING  = ORA_STRING
-    ORA_LONG    = ORA_LONG
-    ORA_ROWID   = ORA_ROWID
-    ORA_DATE    = ORA_DATE
-    ORA_RAW             = ORA_RAW
-    ORA_LONGRAW         = ORA_LONGRAW
-    ORA_CHAR    = ORA_CHAR
-    ORA_CHARZ   = ORA_CHARZ
-    ORA_MLSLABEL = 105
-    ORA_XMLTYPE         = ORA_XMLTYPE
-    ORA_CLOB    = ORA_CLOB
-    ORA_BLOB    = ORA_BLOB
-    ORA_RSET    = ORA_RSET
-    ORA_VARCHAR2_TABLE = ORA_VARCHAR2_TABLE
-    ORA_NUMBER_TABLE   = ORA_NUMBER_TABLE
-    ORA_SYSDBA                   = 0x0002
-    ORA_SYSOPER                          = 0x0004
-    SQLCS_IMPLICIT               = SQLCS_IMPLICIT
-       SQLCS_NCHAR               = SQLCS_NCHAR
-       SQLT_INT                  = SQLT_INT
-       SQLT_FLT                  = SQLT_FLT
-       OCI_BATCH_MODE        = 0x01
-       OCI_EXACT_FETCH       = 0x02
+       char *name
+       ALIAS:
+       ORA_VARCHAR2 = ORA_VARCHAR2
+       ORA_NUMBER       = ORA_NUMBER
+       ORA_STRING       = ORA_STRING
+       ORA_LONG         = ORA_LONG
+       ORA_ROWID        = ORA_ROWID
+       ORA_DATE         = ORA_DATE
+       ORA_RAW          = ORA_RAW
+       ORA_LONGRAW      = ORA_LONGRAW
+       ORA_CHAR         = ORA_CHAR
+       ORA_CHARZ        = ORA_CHARZ
+       ORA_MLSLABEL = 105
+       ORA_XMLTYPE      = ORA_XMLTYPE
+       ORA_CLOB         = ORA_CLOB
+       ORA_BLOB         = ORA_BLOB
+       ORA_RSET         = ORA_RSET
+       ORA_VARCHAR2_TABLE = ORA_VARCHAR2_TABLE
+       ORA_NUMBER_TABLE   = ORA_NUMBER_TABLE
+       ORA_SYSDBA                        = 0x0002
+       ORA_SYSOPER                       = 0x0004
+       SQLCS_IMPLICIT            = SQLCS_IMPLICIT
+       SQLCS_NCHAR                       = SQLCS_NCHAR
+       SQLT_INT                          = SQLT_INT
+       SQLT_FLT                          = SQLT_FLT
+       OCI_BATCH_MODE          = 0x01
+       OCI_EXACT_FETCH    = 0x02
        OCI_KEEP_FETCH_STATE  = 0x04
-       OCI_DESCRIBE_ONLY     = 0x10
+       OCI_DESCRIBE_ONLY        = 0x10
        OCI_COMMIT_ON_SUCCESS = 0x20
-       OCI_NON_BLOCKING      = 0x40
-       OCI_BATCH_ERRORS      = 0x80
-       OCI_PARSE_ONLY        = 0x100
+       OCI_NON_BLOCKING          = 0x40
+       OCI_BATCH_ERRORS          = 0x80
+       OCI_PARSE_ONLY          = 0x100
        OCI_SHOW_DML_WARNINGS = 0x400
        OCI_STMT_SCROLLABLE_READONLY = 0x08
        OCI_FETCH_CURRENT       = OCI_FETCH_CURRENT
@@ -50,210 +50,210 @@
        OCI_FETCH_PRIOR         = OCI_FETCH_PRIOR
        OCI_FETCH_ABSOLUTE      = OCI_FETCH_ABSOLUTE
        OCI_FETCH_RELATIVE      = OCI_FETCH_RELATIVE
-       SQLT_CHR    = SQLT_CHR
+       SQLT_CHR        = SQLT_CHR
        SQLT_BIN        = SQLT_BIN
-    CODE:
-    if (!ix) {
+       CODE:
+       if (!ix) {
        if (!name) name = GvNAME(CvGV(cv));
        croak("Unknown DBD::Oracle constant '%s'", name);
-    }
-    else RETVAL = ix;
-    OUTPUT:
-    RETVAL
+       }
+       else RETVAL = ix;
+       OUTPUT:
+       RETVAL
 
 void
 ORA_OCI()
-    CODE:
-    SV *sv = sv_newmortal();
-    sv_setnv(sv, atof(ORA_OCI_VERSION));       /* 9.1! see docs */
-    sv_setpv(sv, ORA_OCI_VERSION);             /* 9.10.11.12    */
-    SvNOK_on(sv); /* dualvar hack */
-    ST(0) = sv;
+       CODE:
+       SV *sv = sv_newmortal();
+       sv_setnv(sv, atof(ORA_OCI_VERSION));    /* 9.1! see docs */
+       sv_setpv(sv, ORA_OCI_VERSION);          /* 9.10.11.12   */
+       SvNOK_on(sv); /* dualvar hack */
+       ST(0) = sv;
 
 void
 ora_env_var(name)
-    char *name
-    CODE:
-    char buf[1024];
-    char *p = ora_env_var(name, buf, sizeof(buf)-1);
-    SV *sv = sv_newmortal();
-    if (p)
-        sv_setpv(sv, p);
-    ST(0) = sv;
+       char *name
+       CODE:
+       char buf[1024];
+       char *p = ora_env_var(name, buf, sizeof(buf)-1);
+       SV *sv = sv_newmortal();
+       if (p)
+               sv_setpv(sv, p);
+       ST(0) = sv;
 
 #ifdef __CYGWIN32__
 void
 ora_cygwin_set_env(name, value)
-    char * name
-    char * value
-    CODE:
-    ora_cygwin_set_env(name, value);
+       char * name
+       char * value
+       CODE:
+       ora_cygwin_set_env(name, value);
 
 #endif /* __CYGWIN32__ */
 
 
 INCLUDE: Oracle.xsi
 
-MODULE = DBD::Oracle    PACKAGE = DBD::Oracle::st
+MODULE = DBD::Oracle   PACKAGE = DBD::Oracle::st
 
 void ora_stmt_type(sth)
  SV *  sth
-    PREINIT:
-    D_imp_sth(sth);
+       PREINIT:
+       D_imp_sth(sth);
    CODE:
-    {
+       {
        XSRETURN_IV( imp_sth->stmt_type);
 }
 
 void
 ora_stmt_type_name(sth)
-    SV *       sth
-    PREINIT:
-    D_imp_sth(sth);
+       SV *    sth
+       PREINIT:
+       D_imp_sth(sth);
        CODE:
        char *p = oci_stmt_type_name(imp_sth->stmt_type);
        SV *sv = sv_newmortal();
        if (p)
          sv_setpv(sv, p);
-    ST(0) = sv;
+       ST(0) = sv;
 
 void
 ora_scroll_position(sth)
-    SV *       sth
-    PREINIT:
-    D_imp_sth(sth);
+       SV *    sth
+       PREINIT:
+       D_imp_sth(sth);
    CODE:
-    {
+       {
        XSRETURN_IV( imp_sth->fetch_position);
 }
 
 void
 ora_fetch_scroll(sth,fetch_orient,fetch_offset)
-    SV *       sth
-    IV  fetch_orient
-    IV         fetch_offset
-    PREINIT:
-    D_imp_sth(sth);
-    CODE:
-    {
-    AV *av;
+       SV *    sth
+       IV  fetch_orient
+       IV      fetch_offset
+       PREINIT:
+       D_imp_sth(sth);
+       CODE:
+       {
+       AV *av;
        imp_sth->fetch_orient=fetch_orient;
-    imp_sth->fetch_offset=fetch_offset;
-    av = dbd_st_fetch(sth,imp_sth);
-    ST(0) = (av) ? sv_2mortal(newRV((SV *)av)) : &PL_sv_undef;
+       imp_sth->fetch_offset=fetch_offset;
+       av = dbd_st_fetch(sth,imp_sth);
+       ST(0) = (av) ? sv_2mortal(newRV((SV *)av)) : &PL_sv_undef;
 }
 
 void
 ora_bind_param_inout_array(sth, param, av_ref, maxlen, attribs)
-    SV *       sth
-    SV *       param
-    SV *       av_ref
-    IV                 maxlen
-    SV *       attribs
-    CODE:
-    {
-    IV sql_type = 0;
-    D_imp_sth(sth);
-    SV *av_value;
-    if (!SvROK(av_ref) || SvTYPE(SvRV(av_ref)) != SVt_PVAV)
+       SV *    sth
+       SV *    param
+       SV *    av_ref
+       IV              maxlen
+       SV *    attribs
+       CODE:
+       {
+       IV sql_type = 0;
+       D_imp_sth(sth);
+       SV *av_value;
+       if (!SvROK(av_ref) || SvTYPE(SvRV(av_ref)) != SVt_PVAV)
        croak("bind_param_inout_array needs a reference to a array value");
-    av_value = av_ref;
-    if (SvREADONLY(av_value))
+       av_value = av_ref;
+       if (SvREADONLY(av_value))
        croak("Modification of a read-only value attempted");
-    if (attribs) {
-       if (SvNIOK(attribs)) {
-               sql_type = SvIV(attribs);
-               attribs = Nullsv;
+       if (attribs) {
+               if (SvNIOK(attribs)) {
+                       sql_type = SvIV(attribs);
+                       attribs = Nullsv;
                }
                else {
                        SV **svp;
-               DBD_ATTRIBS_CHECK("bind_param", sth, attribs);
-               DBD_ATTRIB_GET_IV(attribs, "ora_type",4, svp, sql_type);
+                       DBD_ATTRIBS_CHECK("bind_param", sth, attribs);
+                       DBD_ATTRIB_GET_IV(attribs, "ora_type",4, svp, sql_type);
                }
-    }
-    ST(0) = dbd_bind_ph(sth, imp_sth, param,av_value, sql_type, attribs, TRUE, 
maxlen)
+       }
+       ST(0) = dbd_bind_ph(sth, imp_sth, param,av_value, sql_type, attribs, 
TRUE, maxlen)
                ? &sv_yes : &sv_no;
 }
 
 
 void
 ora_fetch(sth)
-    SV *       sth
-    PPCODE:
-    /* fetchrow: but with scalar fetch returning NUM_FIELDS for Oraperl        
*/
-    /* This code is called _directly_ by Oraperl.pm bypassing the DBI. */
-    /* as a result we have to do some things ourselves (like calling   */
-    /* CLEAR_ERROR) and we loose the tracing that the DBI offers :-(   */
-    D_imp_sth(sth);
-    AV *av;
-    int debug = DBIc_DEBUGIV(imp_sth);
-    if (DBIS->debug > debug)
+       SV *    sth
+       PPCODE:
+       /* fetchrow: but with scalar fetch returning NUM_FIELDS for Oraperl     
*/
+       /* This code is called _directly_ by Oraperl.pm bypassing the DBI.      
*/
+       /* as a result we have to do some things ourselves (like calling        
*/
+       /* CLEAR_ERROR) and we loose the tracing that the DBI offers :-(        
*/
+       D_imp_sth(sth);
+       AV *av;
+       int debug = DBIc_DEBUGIV(imp_sth);
+       if (DBIS->debug > debug)
        debug = DBIS->debug;
-    DBIh_CLEAR_ERROR(imp_sth);
-    if (GIMME == G_SCALAR) {   /* XXX Oraperl  */
+       DBIh_CLEAR_ERROR(imp_sth);
+       if (GIMME == G_SCALAR) {        /* XXX Oraperl  */
        /* This non-standard behaviour added only to increase the       */
        /* performance of the oraperl emulation layer (Oraperl.pm)      */
        if (!imp_sth->done_desc && !dbd_describe(sth, imp_sth))
                XSRETURN_UNDEF;
        XSRETURN_IV(DBIc_NUM_FIELDS(imp_sth));
-    }
-    if (debug >= 2)
-       PerlIO_printf(DBILOGFP, "    -> ora_fetch\n");
-    av = dbd_st_fetch(sth, imp_sth);
-    if (av) {
+       }
+       if (debug >= 2)
+       PerlIO_printf(DBILOGFP, "       -> ora_fetch\n");
+       av = dbd_st_fetch(sth, imp_sth);
+       if (av) {
        int num_fields = AvFILL(av)+1;
        int i;
        EXTEND(sp, num_fields);
        for(i=0; i < num_fields; ++i) {
-           PUSHs(AvARRAY(av)[i]);
+               PUSHs(AvARRAY(av)[i]);
        }
        if (debug >= 2)
-           PerlIO_printf(DBILOGFP, "    <- (...) [%d items]\n", num_fields);
-    }
-    else {
+               PerlIO_printf(DBILOGFP, "       <- (...) [%d items]\n", 
num_fields);
+       }
+       else {
        if (debug >= 2)
-           PerlIO_printf(DBILOGFP, "    <- () [0 items]\n");
-    }
-    if (debug >= 2 && SvTRUE(DBIc_ERR(imp_sth)))
-       PerlIO_printf(DBILOGFP, "    !! ERROR: %s %s",
-           neatsvpv(DBIc_ERR(imp_sth),0), neatsvpv(DBIc_ERRSTR(imp_sth),0));
+               PerlIO_printf(DBILOGFP, "       <- () [0 items]\n");
+       }
+       if (debug >= 2 && SvTRUE(DBIc_ERR(imp_sth)))
+       PerlIO_printf(DBILOGFP, "       !! ERROR: %s %s",
+               neatsvpv(DBIc_ERR(imp_sth),0), 
neatsvpv(DBIc_ERRSTR(imp_sth),0));
 
 void
 ora_execute_array(sth, tuples, exe_count, tuples_status, cols=&sv_undef)
-    SV *        sth
-    SV *        tuples
-    IV         exe_count
-    SV *        tuples_status
-    SV *        cols
-    PREINIT:
-    D_imp_sth(sth);
-    int retval;
-    CODE:
-    /* XXX Need default bindings if any phs are so far unbound(?) */
-    /* XXX this code is duplicated in selectrow_arrayref above  */
-    if (DBIc_ROW_COUNT(imp_sth) > 0) /* reset for re-execute */
-        DBIc_ROW_COUNT(imp_sth) = 0;
-    retval = ora_st_execute_array(sth, imp_sth, tuples, tuples_status,
-                                  cols, (ub4)exe_count);
-    /* XXX Handle return value ... like DBI::execute_array(). */
-    /* remember that dbd_st_execute must return <= -2 for error */
-    if (retval == 0)            /* ok with no rows affected     */
-        XST_mPV(0, "0E0");      /* (true but zero)              */
-    else if (retval < -1)       /* -1 == unknown number of rows */
-        XST_mUNDEF(0);          /* <= -2 means error            */
-    else
-        XST_mIV(0, retval);     /* typically 1, rowcount or -1  */
+       SV *            sth
+       SV *            tuples
+       IV               exe_count
+       SV *            tuples_status
+       SV *            cols
+       PREINIT:
+       D_imp_sth(sth);
+       int retval;
+       CODE:
+       /* XXX Need default bindings if any phs are so far unbound(?) */
+       /* XXX this code is duplicated in selectrow_arrayref above  */
+       if (DBIc_ROW_COUNT(imp_sth) > 0) /* reset for re-execute */
+               DBIc_ROW_COUNT(imp_sth) = 0;
+       retval = ora_st_execute_array(sth, imp_sth, tuples, tuples_status,
+                                                                 cols, 
(ub4)exe_count);
+       /* XXX Handle return value ... like DBI::execute_array(). */
+       /* remember that dbd_st_execute must return <= -2 for error */
+       if (retval == 0)                        /* ok with no rows affected     
 */
+               XST_mPV(0, "0E0");        /* (true but zero)                    
  */
+       else if (retval < -1)      /* -1 == unknown number of rows */
+               XST_mUNDEF(0);            /* <= -2 means error                  
*/
+       else
+               XST_mIV(0, retval);      /* typically 1, rowcount or -1  */
 
 
 void
 cancel(sth)
-    SV *        sth
-    CODE:
-    D_imp_sth(sth);
-    ST(0) = dbd_st_cancel(sth, imp_sth) ? &sv_yes : &sv_no;
+       SV *            sth
+       CODE:
+       D_imp_sth(sth);
+       ST(0) = dbd_st_cancel(sth, imp_sth) ? &sv_yes : &sv_no;
 
 
-MODULE = DBD::Oracle    PACKAGE = DBD::Oracle::db
+MODULE = DBD::Oracle   PACKAGE = DBD::Oracle::db
 
 
 void
@@ -265,10 +265,10 @@
        text buf[2];
        CODE:
        /*simply does a call to OCIServerVersion which should make 1 round 
trip*/
-    /*later I will replace this with the actual OCIPing command*/
-    /*This will work if the DB goes down, */
-    /*If the listener goes down it is another case as the Listener is needed 
to establish the connection not maintain it*/
-    /*so we should stay connected but we cannot get nay new connections*/
+       /*later I will replace this with the actual OCIPing command*/
+       /*This will work if the DB goes down, */
+       /*If the listener goes down it is another case as the Listener is 
needed to establish the connection not maintain it*/
+       /*so we should stay connected but we cannot get nay new connections*/
        {
        
OCIServerVersion_log_stat(imp_dbh->svchp,imp_dbh->errhp,buf,2,OCI_HTYPE_SVCCTX,status);
        if (status != OCI_SUCCESS){
@@ -281,235 +281,238 @@
 
 void
 reauthenticate(dbh, uid, pwd)
-    SV *       dbh
-    char *     uid
-    char *     pwd
-    CODE:
-    D_imp_dbh(dbh);
-    ST(0) = ora_db_reauthenticate(dbh, imp_dbh, uid, pwd) ? &sv_yes : &sv_no;
+       SV *    dbh
+       char *  uid
+       char *  pwd
+       CODE:
+       D_imp_dbh(dbh);
+       ST(0) = ora_db_reauthenticate(dbh, imp_dbh, uid, pwd) ? &sv_yes : 
&sv_no;
 
 void
 ora_lob_write(dbh, locator, offset, data)
-    SV *dbh
-    OCILobLocator   *locator
-    UV offset
-    SV *data
-    PREINIT:
-    D_imp_dbh(dbh);
-    ub4 amtp;
-    STRLEN data_len; /* bytes not chars */
-    dvoid *bufp;
-    sword status;
-    ub2 csid;
-    ub1 csform;
-    CODE:
-    csid = 0;
-    csform = SQLCS_IMPLICIT;
-    bufp = SvPV(data, data_len);
-    amtp = data_len;
-    /* if locator is CLOB and data is UTF8 and not in bytes pragma */
-    /* if (0 && SvUTF8(data) && !IN_BYTES) { amtp = sv_len_utf8(data); }  */
-    /* added by lab: */
-    /* LAB do something about length here? see above comment */
-     OCILobCharSetForm_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, 
&csform, status );
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetForm");
+       SV *dbh
+       OCILobLocator   *locator
+       UV      offset
+       SV      *data
+       PREINIT:
+       D_imp_dbh(dbh);
+       ub4 amtp;
+       STRLEN data_len; /* bytes not chars */
+       dvoid *bufp;
+       sword status;
+       ub2 csid;
+       ub1 csform;
+       CODE:
+       csid = 0;
+       csform = SQLCS_IMPLICIT;
+       bufp = SvPV(data, data_len);
+       amtp = data_len;
+       /* if locator is CLOB and data is UTF8 and not in bytes pragma */
+       /* if (0 && SvUTF8(data) && !IN_BYTES) { amtp = sv_len_utf8(data); }  */
+       /* added by lab: */
+       /* LAB do something about length here? see above comment */
+        OCILobCharSetForm_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, 
&csform, status );
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetForm");
        ST(0) = &sv_undef;
-        return;
-    }
+               return;
+       }
 #ifdef OCI_ATTR_CHARSET_ID
-    /* Effectively only used so AL32UTF8 works properly */
-    OCILobCharSetId_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, &csid, 
status );
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetId");
+       /* Effectively only used so AL32UTF8 works properly */
+       OCILobCharSetId_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, 
&csid, status );
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetId");
        ST(0) = &sv_undef;
-        return;
-    }
+               return;
+       }
 #endif /* OCI_ATTR_CHARSET_ID */
-    /* if data is utf8 but charset isn't then switch to utf8 csid */
-    csid = (SvUTF8(data) && !CS_IS_UTF8(csid)) ? utf8_csid : 
CSFORM_IMPLIED_CSID(csform);
+       /* if data is utf8 but charset isn't then switch to utf8 csid */
+       csid = (SvUTF8(data) && !CS_IS_UTF8(csid)) ? utf8_csid : 
CSFORM_IMPLIED_CSID(csform);
 
-    OCILobWrite_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator,
-           &amtp, (ub4)offset,
-           bufp, (ub4)data_len, OCI_ONE_PIECE,
-           NULL, NULL,
-           (ub2)0, csform , status);
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobWrite");
+       OCILobWrite_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator,
+               &amtp, (ub4)offset,
+               bufp, (ub4)data_len, OCI_ONE_PIECE,
+               NULL, NULL,
+               (ub2)0, csform , status);
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobWrite");
        ST(0) = &sv_undef;
-    }
-    else {
+       }
+       else {
        ST(0) = &sv_yes;
-    }
+       }
 
 void
 ora_lob_append(dbh, locator, data)
-    SV *dbh
-    OCILobLocator   *locator
-    SV *data
-    PREINIT:
-    D_imp_dbh(dbh);
-    ub4 amtp;
-    STRLEN data_len; /* bytes not chars */
-    dvoid *bufp;
-    sword status;
+       SV *dbh
+       OCILobLocator   *locator
+       SV      *data
+       PREINIT:
+       D_imp_dbh(dbh);
+       ub4 amtp;
+       STRLEN data_len; /* bytes not chars */
+       dvoid *bufp;
+       sword status;
 #if !defined(OCI_HTYPE_DIRPATH_FN_CTX) /* Oracle is < 9.0 */
-    ub4 startp;
+       ub4 startp;
 #endif
-    ub1 csform;
-    ub2 csid;
-    CODE:
-    csid = 0;
-    csform = SQLCS_IMPLICIT;
-    bufp = SvPV(data, data_len);
-    amtp = data_len;
-    /* if locator is CLOB and data is UTF8 and not in bytes pragma */
-    /* if (1 && SvUTF8(data) && !IN_BYTES) */
-    /* added by lab: */
-    /* LAB do something about length here? see above comment */
-    OCILobCharSetForm_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, 
&csform, status );
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetForm");
+       ub1 csform;
+       ub2 csid;
+       CODE:
+       csid = 0;
+       csform = SQLCS_IMPLICIT;
+       bufp = SvPV(data, data_len);
+       amtp = data_len;
+       /* if locator is CLOB and data is UTF8 and not in bytes pragma */
+       /* if (1 && SvUTF8(data) && !IN_BYTES) */
+       /* added by lab: */
+       /* LAB do something about length here? see above comment */
+       OCILobCharSetForm_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, 
&csform, status );
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetForm");
        ST(0) = &sv_undef;
-        return;
-    }
+               return;
+       }
+       PerlIO_printf(DBILOGFP, " csform=%d\n",csform);
 #ifdef OCI_ATTR_CHARSET_ID
-    /* Effectively only used so AL32UTF8 works properly */
-    OCILobCharSetId_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, &csid, 
status );
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetId");
+       /* Effectively only used so AL32UTF8 works properly */
+       OCILobCharSetId_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, 
&csid, status );
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetId");
        ST(0) = &sv_undef;
-        return;
-    }
+               return;
+       }
 #endif /* OCI_ATTR_CHARSET_ID */
-    /* if data is utf8 but charset isn't then switch to utf8 csid */
-    csid = (SvUTF8(data) && !CS_IS_UTF8(csid)) ? utf8_csid : 
CSFORM_IMPLIED_CSID(csform);
-    OCILobWriteAppend_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator,
-                              &amtp, bufp, (ub4)data_len, OCI_ONE_PIECE,
-                              NULL, NULL,
-                              csid, csform, status);
-    if (status != OCI_SUCCESS) {
-       oci_error(dbh, imp_dbh->errhp, status, "OCILobWriteAppend");
-       ST(0) = &sv_undef;
-    }
-    else {
-       ST(0) = &sv_yes;
-    }
+       /* if data is utf8 but charset isn't then switch to utf8 csid */
+       csid = (SvUTF8(data) && !CS_IS_UTF8(csid)) ? utf8_csid : 
CSFORM_IMPLIED_CSID(csform);
+       OCILobWriteAppend_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator,
+                                  &amtp, bufp, (ub4)data_len, OCI_ONE_PIECE,
+                                  NULL, NULL,
+                                  csid, csform, status);
+       if (status != OCI_SUCCESS) {
+          oci_error(dbh, imp_dbh->errhp, status, "OCILobWriteAppend");
+          ST(0) = &sv_undef;
+       }
+       else {
+          ST(0) = &sv_yes;
+       }
 
 
 
 
 void
 ora_lob_read(dbh, locator, offset, length)
-    SV *dbh
-    OCILobLocator   *locator
-    UV offset
-    UV length
-    PREINIT:
-    D_imp_dbh(dbh);
-    ub4 amtp;
-    STRLEN bufp_len;
-    SV *dest_sv;
-    dvoid *bufp;
-    sword status;
-    ub1 csform;
-    CODE:
-    csform = SQLCS_IMPLICIT;
-    dest_sv = sv_2mortal(newSV(length*4)); /*LAB: crude hack that works... tim 
did it else where XXX */
-    SvPOK_on(dest_sv);
-    bufp_len = SvLEN(dest_sv); /* XXX bytes not chars? (lab: yes) */
-    bufp = SvPVX(dest_sv);
-    amtp = length;     /* if utf8 and clob/nclob: in: chars, out: bytes */
-    /* 
http://www.lc.leidenuniv.nl/awcourse/oracle/appdev.920/a96584/oci16m40.htm#427818
 */
-    /* if locator is CLOB and data is UTF8 and not in bytes pragma */
-    /* if (0 && SvUTF8(dest_sv) && !IN_BYTES) { amtp = sv_len_utf8(dest_sv); } 
 */
-    /* added by lab: */
-    OCILobCharSetForm_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, 
&csform, status );
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetForm");
+       SV *dbh
+       OCILobLocator   *locator
+       UV      offset
+       UV      length
+       PREINIT:
+       D_imp_dbh(dbh);
+       ub4 amtp;
+       STRLEN bufp_len;
+       SV *dest_sv;
+       dvoid *bufp;
+       sword status;
+       ub1 csform;
+       CODE:
+       csform = SQLCS_IMPLICIT;
+       dest_sv = sv_2mortal(newSV(length*4)); /*LAB: crude hack that works... 
tim did it else where XXX */
+       SvPOK_on(dest_sv);
+       bufp_len = SvLEN(dest_sv);      /* XXX bytes not chars? (lab: yes) */
+       bufp = SvPVX(dest_sv);
+       amtp = length;  /* if utf8 and clob/nclob: in: chars, out: bytes */
+       /* 
http://www.lc.leidenuniv.nl/awcourse/oracle/appdev.920/a96584/oci16m40.htm#427818
 */
+       /* if locator is CLOB and data is UTF8 and not in bytes pragma */
+       /* if (0 && SvUTF8(dest_sv) && !IN_BYTES) { amtp = 
sv_len_utf8(dest_sv); }  */
+       /* added by lab: */
+       OCILobCharSetForm_log_stat( imp_dbh->envhp, imp_dbh->errhp, locator, 
&csform, status );
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobCharSetForm");
        dest_sv = &sv_undef;
-        return;
-    }
-    OCILobRead_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator,
-           &amtp, (ub4)offset, /* offset starts at 1 */
-           bufp, (ub4)bufp_len,
-           0, 0, (ub2)0, csform, status);
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobRead");
-        dest_sv = &sv_undef;
-    }
-    else {
-        SvCUR(dest_sv) = amtp; /* always bytes here */
-        *SvEND(dest_sv) = '\0';
-       if (CSFORM_IMPLIES_UTF8(csform))
-           SvUTF8_on(dest_sv);
-
-    }
-    ST(0) = dest_sv;
+               return;
+       }
+       OCILobRead_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator,
+               &amtp, (ub4)offset, /* offset starts at 1 */
+               bufp, (ub4)bufp_len,
+               0, 0, (ub2)0, csform, status);
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobRead");
+               dest_sv = &sv_undef;
+       }
+       else {
+               SvCUR(dest_sv) = amtp; /* always bytes here */
+               *SvEND(dest_sv) = '\0';
+               if (csform){
+                       if (CSFORM_IMPLIES_UTF8(csform)){
+                               SvUTF8_on(dest_sv);
+                       }
+               }
+       }
+       ST(0) = dest_sv;
 
 void
 ora_lob_trim(dbh, locator, length)
-    SV *dbh
-    OCILobLocator   *locator
-    UV length
-    PREINIT:
-    D_imp_dbh(dbh);
-    sword status;
-    CODE:
-    OCILobTrim_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator, length, 
status);
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobTrim");
+       SV *dbh
+       OCILobLocator   *locator
+       UV      length
+       PREINIT:
+       D_imp_dbh(dbh);
+       sword status;
+       CODE:
+       OCILobTrim_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator, length, 
status);
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobTrim");
        ST(0) = &sv_undef;
-    }
-    else {
+       }
+       else {
        ST(0) = &sv_yes;
-    }
+       }
 
 void
 ora_lob_length(dbh, locator)
-    SV *dbh
-    OCILobLocator   *locator
-    PREINIT:
-    D_imp_dbh(dbh);
-    sword status;
-    ub4 len = 0;
-    CODE:
-    OCILobGetLength_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator, &len, 
status);
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobGetLength");
+       SV *dbh
+       OCILobLocator   *locator
+       PREINIT:
+       D_imp_dbh(dbh);
+       sword status;
+       ub4 len = 0;
+       CODE:
+       OCILobGetLength_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator, &len, 
status);
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobGetLength");
        ST(0) = &sv_undef;
-    }
-    else {
+       }
+       else {
        ST(0) = sv_2mortal(newSVuv(len));
-    }
+       }
 
 
 void
 ora_lob_chunk_size(dbh, locator)
-    SV *dbh
-    OCILobLocator   *locator
-    PREINIT:
-    D_imp_dbh(dbh);
-    sword status;
-    ub4 chunk_size = 0;
-    CODE:
-    OCILobGetChunkSize_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator, 
&chunk_size, status);
-    if (status != OCI_SUCCESS) {
-        oci_error(dbh, imp_dbh->errhp, status, "OCILobGetChunkSize");
-        ST(0) = &sv_undef;
-    }
-    else {
-        ST(0) = sv_2mortal(newSVuv(chunk_size));
-    }
+       SV *dbh
+       OCILobLocator   *locator
+       PREINIT:
+       D_imp_dbh(dbh);
+       sword status;
+       ub4 chunk_size = 0;
+       CODE:
+       OCILobGetChunkSize_log_stat(imp_dbh->svchp, imp_dbh->errhp, locator, 
&chunk_size, status);
+       if (status != OCI_SUCCESS) {
+               oci_error(dbh, imp_dbh->errhp, status, "OCILobGetChunkSize");
+               ST(0) = &sv_undef;
+       }
+       else {
+               ST(0) = sv_2mortal(newSVuv(chunk_size));
+       }
 
 
-MODULE = DBD::Oracle    PACKAGE = DBD::Oracle::dr
+MODULE = DBD::Oracle   PACKAGE = DBD::Oracle::dr
 
 void
 init_oci(drh)
-    SV *       drh
-    CODE:
-    D_imp_drh(drh);
+       SV *    drh
+       CODE:
+       D_imp_drh(drh);
        dbd_init_oci(DBIS) ;
        dbd_init_oci_drh(imp_drh) ;
 

Reply via email to