[svn:dbd-oracle] r12637 - dbd-oracle/trunk

[email protected]
Newsgroups perl.dbd.oracle.changes
Message-ID <[email protected]>
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) ;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.