I do not think your patch addresses the problem of either CLOB or BLOB object being null.  The fix that worked for me is shown below:
 
 case Types.CLOB :
                {
                    java.sql.Clob aClob = rs.getClob(columnId);
                    if (aClob != null && aClob.length() > 0)
                    {
                        result =
                            aClob
                                .getSubString(1L, (int) aClob.length())
                                .toCharArray();
                    }
                    break;
                }
            case Types.BLOB :
                {
                    java.sql.Blob aBlob = rs.getBlob(columnId);
                    if (aBlob != null && aBlob.length() > 0)
                    {
                        result = aBlob.getBytes(1L, (int) aBlob.length());
                    }
                    break;
                }
 
I had earlier submitted fixes for other CLOB issues.  I am resending them in case somebody finds them useful.
 
To fix the problem, I made the following changes:
 
1. Modified ojbtest_schema.xml BLOB_TEST table to  (the changes are shown in Red).
 
  <table name="BLOB_TEST">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="BLOB_VALUE_" type="BLOB"/>
    <column name="CLOB_VALUE_" type="CLOB"/>
  </table>
 
2.  Modified the setObjectForStatement method of PlatformOracleImpl class to write CLOB data as shown below:
 

public void setObjectForStatement(PreparedStatement ps, int index, Object value, int sqlType) throws SQLException

{

    if (((sqlType == Types.VARBINARY) ||

         (sqlType == Types.LONGVARBINARY) ||

         (sqlType == Types.BLOB)) &&

         (value instanceof byte[]))

    {

        byte buf[] = (byte[])value;

        ByteArrayInputStream inputStream = new ByteArrayInputStream(buf);

        changePreparedStatementResultSetType(ps);

        ps.setBinaryStream(index, inputStream, buf.length);

    }

    else if (sqlType == Types.CLOB)

    {

        CharArrayReader inputStream = new CharArrayReader((char[]) value);

        ps.setCharacterStream(index, inputStream, ((char[])value).length);

    }

    else if (value instanceof Double)

    {

        // workaround for the bug in Oracle thin driver

        ps.setDouble(index, ((Double) value).doubleValue());

    }

    else

    {

        super.setObjectForStatement(ps, index, value, sqlType);

    }

}

3. In JdbcAccess class modified the getObjectFromColumn method for CLOB/BLOB to what is shown at the top of this e-mail.
 
 
The CLOB should return an object of type char[] to be consistent with BLOBs returning objects of type byte[].  However, it is not mandatory to do so.  We could leave this as is, and modify the CLOB fields in corresponding classes to be of type String.  That is, for example,  the ObjectWithBlob class will have to be modified to have the clob property defined as a String.  But if we make the change shown above, you do not have to modify the ObjectWithBlob class - the clob property can remain as character array.
 
 
----- Original Message -----
From: "J. Russell Smyth" <[EMAIL PROTECTED]>
To: "OJB Users List" <[EMAIL PROTECTED]>
Sent: Thursday, November 21, 2002 9:51 PM
Subject: [PATCH]Re: null value for Blob/Clob causes NullPointerException

> We just happened to also run into that today.
>
> Attatched is a patch to fix, and a patch to the test case for blobs to
> verify the fix. Unfortunately HSQLDB does not support the blob
> functions, hence this test is commented out of AllTests, and I do not at
> the moment have access to my other db's to run this test. However, it
> should be good.
>
> On Thu, 2002-11-21 at 20:11, Michael Mogley wrote:
> > I've just started experimenting with Ojb and seem to have run across a bug.  Specifically, a Clob or Blob field whose value is undefined in the db gives the following stack trace:
> >
> > java.lang.NullPointerException
> >         at org.apache.ojb.broker.accesslayer.JdbcAccess.getObjectFromColumn(JdbcAccess.java:592)
> >         at org.apache.ojb.broker.accesslayer.JdbcAccess.getObjectFromColumn(JdbcAccess.java:469)
> >         at org.apache.ojb.broker.accesslayer.RowReaderDefaultImpl.readObjectArrayFrom(RowReaderDefaultImpl.java:141)
> >         at org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(RsIterator.java:385)
> >         at org.apache.ojb.broker.accesslayer.RsIterator.next(RsIterator.java:203)
> >         at org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(PersistenceBrokerImpl.java:1117)
> >         at org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(PersistenceBrokerImpl.java:1239)
> >         at org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(PersistenceBrokerImpl.java:1265)
> >         at org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(PersistenceBrokerImpl.java:1252)
> >
> > Ojb attempts to perform operations on the Blob/Clob before checking to see if the returned value is null.
> >
> > Or am I missing something?
> >
> > Michael
>
>


> --
> To unsubscribe, e-mail:   <
mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <
mailto:[EMAIL PROTECTED]>

Attachment: JdbcAccess.java
Description: Binary data

Attachment: PlatformOracleImpl.java
Description: Binary data

<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?>
<!DOCTYPE database SYSTEM "http://jakarta.apache.org/turbine/dtd/database.dtd";>


<database name="@DATABASE_DEFAULT@" defaultIdMethod="none"
  baseClass="">

  <!-- =================================================== -->
  <!-- B O O K  T A B L E                                  -->
  <!-- =================================================== -->

  <!--
  <table name="">
    <column name="" required="true" primaryKey="true" type="INTEGER"/>
    <column name="" required="true" type=""/>
    <foreign-key foreignTable="">
      <reference local="" foreign=""/>
    </foreign-key>
  </table>
  -->

  <table name="Artikel"
         javaName="Article">
    <column name="Artikel_Nr" required="true" primaryKey="true" type="INTEGER"
            javaName="articleId"/>
    <column name="Artikelname" type="VARCHAR" size="60"
            javaName="articleName"/>
    <column name="Lieferanten_Nr" type="INTEGER"
            javaName="supplierId"/>
    <column name="Kategorie_Nr" type="INTEGER"
            javaName="productGroupId"/>
    <column name="Liefereinheit" type="VARCHAR" size="30"
            javaName="unit"/>
    <column name="Einzelpreis" type="FLOAT"
            javaName="price"/>
    <column name="Lagerbestand" type="INTEGER"
            javaName="stock"/>
    <column name="BestellteEinheiten" type="INTEGER"
            javaName="orderedUnits"/>
    <column name="MindestBestand" type="INTEGER"
            javaName="minimumStock"/>
    <column name="Auslaufartikel" type="INTEGER"
            javaName="inSelloutArticle"/>
  </table>

  <table name="BOOKS">
    <column name="Artikel_Nr" required="true" primaryKey="true" type="INTEGER"/>
    <column name="Artikelname" type="VARCHAR" size="60"/>
    <column name="Lieferanten_Nr" type="INTEGER"/>
    <column name="Kategorie_Nr" type="INTEGER"/>
    <column name="Liefereinheit" type="VARCHAR" size="30"/>
    <column name="Einzelpreis" type="FLOAT"/>
    <column name="Lagerbestand" type="INTEGER"/>
    <column name="BestellteEinheiten" type="INTEGER"/>
    <column name="MindestBestand" type="INTEGER"/>
    <column name="Auslaufartikel" type="INTEGER"/>
    <column name="ISBN" type="CHAR" size="10"/>
    <column name="AUTHOR" type="VARCHAR" size="50"/>
  </table>

  <table name="CDS">
    <column name="Artikel_Nr" required="true" primaryKey="true" type="INTEGER"/>
    <column name="Artikelname" type="VARCHAR" size="60"/>
    <column name="Lieferanten_Nr" type="INTEGER"/>
    <column name="Kategorie_Nr" type="INTEGER"/>
    <column name="Liefereinheit" type="VARCHAR" size="30"/>
    <column name="Einzelpreis" type="FLOAT"/>
    <column name="Lagerbestand" type="INTEGER"/>
    <column name="BestellteEinheiten" type="INTEGER"/>
    <column name="MindestBestand" type="INTEGER"/>
    <column name="Auslaufartikel" type="INTEGER"/>
    <column name="LABEL" type="VARCHAR" size="50"/>
    <column name="MUSICIANS" type="VARCHAR" size="250"/>
  </table>

  <table name="Kategorien"
         javaName="ProductGroup">
    <column name="Kategorie_Nr" required="true" primaryKey="true" type="INTEGER"
            javaName="groupId"/>
    <column name="KategorieName" type="VARCHAR" size="20"
            javaName="groupName"/>
    <column name="Beschreibung" type="VARCHAR" size="60"
            javaName="description"/>
  </table>

  <table name="ORDER_POSITION">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="ORDER_ID" type="INTEGER"/>
    <column name="ARTICLE_ID" type="INTEGER"/>
  </table>

  <table name="TREE">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="DATA" type="VARCHAR" size="50"/>
    <column name="PARENT_ID" type="INTEGER"/>
  </table>

  <table name="TREEGROUP">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="DATA" type="VARCHAR" size="50"/>
    <column name="PARENT_ID" type="INTEGER"/>
    <column name="GROUP_ID" type="INTEGER"/>
  </table>

  <table name="AB_TABLE">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="CLASS_NAME" type="VARCHAR" size="60"/>
    <column name="VALUE_" type="INTEGER"/>
  </table>

  <!-- Product Table for Tutorial 1, 2 & 4-->
  <table name="PRODUCT">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"
            javaName="_id"/>
    <column name="NAME" type="VARCHAR" size="100"/>
    <column name="PRICE" type="FLOAT"/>
    <column name="STOCK" type="INTEGER"/>
  </table>

  <table name="PERSON">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="FIRSTNAME" type="VARCHAR" size="50"/>
    <column name="LASTNAME" type="VARCHAR" size="50"/>
  </table>

  <table name="PROJECT">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="TITLE" type="VARCHAR" size="50"/>
    <column name="DESCRIPTION" type="VARCHAR" size="250"/>
  </table>

  <table name="PERSON_PROJECT">
    <column name="PERSON_ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="PROJECT_ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="ROLENAME" type="VARCHAR" size="20"/>
  </table>

  <table name="TASK">
    <column name="TASK_ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="PERSON_ID" required="true" type="INTEGER"/>
    <column name="PROJECT_ID" required="true" type="INTEGER"/>
    <column name="TASKNAME" type="VARCHAR" size="20"/>
    <foreign-key foreignTable="PERSON_PROJECT">
      <reference local="PERSON_ID" foreign="PERSON_ID"/>
      <reference local="PROJECT_ID" foreign="PROJECT_ID"/>
    </foreign-key>
  </table>

  <table name="FAMILY_MEMBER">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="FIRSTNAME" type="VARCHAR" size="50"/>
    <column name="LASTNAME" type="VARCHAR" size="50"/>
    <column name="MOTHER_ID" type="INTEGER"/>
    <column name="FATHER_ID" type="INTEGER"/>
  </table>

  <table name="LOCKED_BY_VERSION">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="VALUE_" type="VARCHAR" size="60"/>
    <column name="VERSION_" type="INTEGER"/>
  </table>

  <table name="LOCKED_BY_TIMESTAMP">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="VALUE_" type="VARCHAR" size="60"/>
    <column name="TIMESTAMP_" type="TIMESTAMP"/>
  </table>

  <table name="BLOB_TEST">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="BLOB_VALUE_" type="BLOB"/>
    <column name="CLOB_VALUE_" type="CLOB"/>
  </table>

  <table name="MDTEST_MASTER">
    <column name="MASTERID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="MASTER_TEXT" type="VARCHAR" size="255"/>
  </table>

  <table name="MDTEST_DETAIL_FKINPK">
    <column name="MASTERID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="DETAILID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="DETAIL_TEXT" type="VARCHAR" size="255"/>
    <foreign-key foreignTable="MDTEST_MASTER">
      <reference local="MASTERID" foreign="MASTERID"/>
    </foreign-key>
  </table>

  <table name="MDTEST_DETAIL_FKNOPK">
    <column name="DETAILID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="MASTERID" required="true" type="INTEGER"/>
    <column name="DETAIL_TEXT" type="VARCHAR" size="255"/>
    <foreign-key foreignTable="MDTEST_MASTER">
      <reference local="MASTERID" foreign="MASTERID"/>
    </foreign-key>
  </table>

  <table name="POINT_TABLE">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="X" required="true" type="INTEGER"/>
    <column name="Y" required="true" type="INTEGER"/>
  </table>

  <table name="GRAPH_NODE">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="NAME" required="true" type="VARCHAR" size="50"/>
    <column name="LOCATION" type="INTEGER"/>
  </table>

  <table name="GRAPH_EDGE">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="SOURCE" required="true" type="INTEGER"/>
    <column name="SINK" required="true" type="INTEGER"/>
  </table>

  <table name="TestClassA">
    <column name="id" required="true" primaryKey="true" type="VARCHAR" size="48"/>
    <column name="value1" required="false" type="VARCHAR" size="64"/>
    <column name="value2" required="false" type="VARCHAR" size="64"/>
    <column name="value3" required="true" type="INTEGER" />
    <column name="bOid" required="false" type="VARCHAR" size="48"/>
  </table>

  <table name="TestClassB">
    <column name="id" required="true" primaryKey="true" type="VARCHAR" size="48"/>
    <column name="value1" required="false" type="VARCHAR" size="64"/>
    <column name="aOid" required="false" type="VARCHAR" size="48"/>
  </table>
    <table name="RelatedToContract">
        <column name="pk" required="true" primaryKey="true" type="VARCHAR" size="48"/>
        <column name="relatedValue1" required="false" type="VARCHAR" size="64"/>
        <column name="relatedValue2" required="false" type="INTEGER"/>
        <column name="relatedValue3" required="false" type="TIMESTAMP"/>
    </table>

    <table name="Contract">
        <column name="pk" required="true" primaryKey="true" type="VARCHAR" size="48"/>
        <column name="fk_to_related" required="false" type="VARCHAR" size="48"/>
        <column name="contract_value1" required="false" type="VARCHAR" size="64"/>
        <column name="contract_value2" required="false" type="INTEGER"/>
        <column name="contract_value3" required="false" type="VARCHAR" size="64"/>
        <column name="contract_value4" required="false" type="TIMESTAMP"/>
        <foreign-key foreignTable="RelatedToContract">
          <reference local="fk_to_related" foreign="pk"/>
        </foreign-key>
    </table>
    <table name="Version">
        <column name="pk" required="true" primaryKey="true" type="VARCHAR" size="48"/>
        <column name="fk_to_contract" required="true" type="VARCHAR" size="48"/>
        <column name="version_value1" required="false" type="VARCHAR" size="64"/>
        <column name="version_value2" required="false" type="INTEGER"/>
        <column name="version_value3" required="false" type="TIMESTAMP"/>
        <foreign-key foreignTable="Contract">
          <reference local="fk_to_contract" foreign="pk"/>
        </foreign-key>
    </table>
    <table name="Effectiveness">
        <column name="pk" required="true" primaryKey="true" type="VARCHAR" size="48"/>
        <column name="fk_to_version" required="true" type="VARCHAR" size="48"/>
        <column name="eff_value1" required="false" type="VARCHAR" size="64"/>
        <column name="eff_value2" required="false" type="INTEGER"/>
        <column name="eff_value3" required="false" type="TIMESTAMP"/>
        <foreign-key foreignTable="Version">
          <reference local="fk_to_version" foreign="pk"/>
        </foreign-key>
    </table>

    <table name="MultiMappedTable">
        <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
        <column name="value1" required="false" type="VARCHAR" size="64"/>
        <column name="value2" required="false" type="INTEGER"/>
        <column name="value3" required="false" type="TIMESTAMP"/>
        <column name="value4" required="false" type="VARCHAR" size="64"/>
        <column name="value5" required="false" type="INTEGER"/>
        <column name="value6" required="false" type="TIMESTAMP"/>
        <column name="value7" required="false" type="VARCHAR" size="64"/>
        <column name="ojbConcreteClass" required="true" type="VARCHAR" size="64"/>
    </table>

     <table name="TABLE_1">
        <column name="pk" required="true" primaryKey="true" type="INTEGER"/>
        <column name="fk_to_related" required="false" type="INTEGER"/>
        <foreign-key foreignTable="TABLE_2">
          <reference local="fk_to_related" foreign="pk"/>
        </foreign-key>
    </table>

    <table name="TABLE_2">
        <column name="pk" required="true" primaryKey="true" type="INTEGER"/>
    </table>

    <table name="BIDIR_A">
       <column name="pk" required="true" primaryKey="true" type="VARCHAR" size="48"/>
       <column name="fk_to_B" required="false" type="VARCHAR" size="48"/>
       <foreign-key foreignTable="BIDIR_B">
         <reference local="fk_to_B" foreign="pk"/>
       </foreign-key>
   </table>

   <table name="BIDIR_B">
       <column name="pk" required="true" primaryKey="true" type="VARCHAR" size="48"/>
       <column name="fk_to_A" required="false" type="VARCHAR" size="48"/>
       <foreign-key foreignTable="BIDIR_A">
         <reference local="fk_to_A" foreign="pk"/>
       </foreign-key>
   </table>

  <table name="MAMMAL">
    <column name="animalId" required="true" primaryKey="true" type="INTEGER"/>
    <column name="name" type="VARCHAR" size="60"/>
    <column name="age" type="INTEGER"/>
    <column name="numLegs" type="INTEGER"/>
    <column name="zooId" type="INTEGER"/>
  </table>

  <table name="REPTILE">
    <column name="animalId" required="true" primaryKey="true" type="INTEGER"/>
    <column name="name" type="VARCHAR" size="60"/>
    <column name="age" type="INTEGER"/>
    <column name="color" type="VARCHAR" size="60"/>
    <column name="zooId" type="INTEGER"/>
  </table>

  <table name="ZOO">
    <column name="zooId" required="true" primaryKey="true" type="INTEGER"/>
    <column name="name" type="VARCHAR" size="60"/>
  </table>

  <table name="FISH">
    <column name="foodId" required="true" primaryKey="true" type="INTEGER"/>
    <column name="name" type="VARCHAR" size="60"/>
    <column name="calories" type="INTEGER"/>
    <column name="typeOfWater" type="VARCHAR" size="60"/>
  </table>

  <table name="SALAD">
    <column name="foodId" required="true" primaryKey="true" type="INTEGER"/>
    <column name="name" type="VARCHAR" size="60"/>
    <column name="calories" type="INTEGER"/>
    <column name="color" type="VARCHAR" size="60"/>
  </table>

  <table name="GOURMET">
    <column name="gourmetId" required="true" primaryKey="true" type="INTEGER"/>
    <column name="name" type="VARCHAR" size="60"/>
  </table>

  <table name="GOURMET_FOOD">
    <column name="GOURMET_ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="FOOD_ID" required="true" primaryKey="true" type="INTEGER"/>
  </table>

  <table name="GUIDTEST">
    <column name="GUID" required="true" primaryKey="true" type="VARCHAR" size="60"/>
    <column name="GUIDVALUE" type="VARCHAR" size="60"/>
  </table>
  <table name="CONV_REFERER" javaName="ConversionReferrer">
    <column name="PK1" required="true" primaryKey="true" type="INTEGER"/>
    <column name="REF1" type="INTEGER"/>
  </table>

  <table name="CONV_REFERED" javaName="ConversionReferred">
    <column name="PK1" required="true" primaryKey="true" type="INTEGER"/>
  </table>


  <table name="SITE">
    <column name="ID" required="true" primaryKey="true" type="INTEGER"/>
    <column name="NAME" required="true" type="VARCHAR" size="100"/>
    <column name="SITEYEAR" type="INTEGER"/>
    <column name="SEMESTER" type="INTEGER"/>
    <unique name="NAME_UNIQUE">
        <unique-column name="NAME"/>
    </unique>
  </table>



    <!-- =================================================== -->
    <!-- Sequence mangager test tables                       -->
    <!-- =================================================== -->
    <table name="SM_TAB_A">
        <column name="id" required="true" primaryKey="true" type="INTEGER"/>
        <column name="name" type="VARCHAR" size="60"/>
    </table>

    <table name="SM_TAB_AA">
        <column name="id" required="true" primaryKey="true" type="INTEGER"/>
        <column name="name" type="VARCHAR" size="60"/>
    </table>

    <table name="SM_TAB_AAA">
        <column name="id" required="true" primaryKey="true" type="INTEGER"/>
        <column name="name" type="VARCHAR" size="60"/>
    </table>

    <table name="SM_TAB_B">
        <column name="id" required="true" primaryKey="true" type="INTEGER"/>
        <column name="name" type="VARCHAR" size="60"/>
    </table>

    <table name="SM_TAB_BB">
        <column name="id" required="true" primaryKey="true" type="INTEGER"/>
        <column name="name" type="VARCHAR" size="60"/>
    </table>

    <table name="SM_SAME_TAB">
        <column name="id" required="true" primaryKey="true" type="INTEGER"/>
        <column name="name" type="VARCHAR" size="60"/>
    </table>


</database>

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to