Your code will crash at the point where you are using the clob/blob object
without checking if it is null.  For example, at the following statement:

                    result = aClob.getSubString(1L, (int) aClob.length());

Now, I have not checked what happens if the CLOB field is of zero length but
not null.  If it is possible to have a zero-length CLOB field then we just
check for CLOB object being null and remove the check for its length.

----- Original Message -----
From: "Russell Smyth" <[EMAIL PROTECTED]>
To: "'OJB Users List'" <[EMAIL PROTECTED]>
Sent: Friday, November 22, 2002 10:21 AM
Subject: RE: [PATCH]Re: null value for Blob/Clob causes NullPointerException


> I fail to se how your change is different, except that your change will
> leave the return value as null if the CLOB/BLOB length is 0 - which I
think
> is incorrect.
> If the db reports that the CLOB/BLOB is there but empty, then it is NOT
> null.
>
> my change returns null if the db reports null,  and reports the value of
the
> BLOB/CLOB as reported by the db if not null.
>
> Your other changes I would have to look through the sources to see what
you
> intend. Diffs would be much easier to read here!
>
> -----Original Message-----
> From: Rajeev Kaul [mailto:[EMAIL PROTECTED]]
> Sent: Friday, November 22, 2002 11:11 AM
> To: OJB Users List
> Subject: Re: [PATCH]Re: null value for Blob/Clob causes
NullPointerException
>
>
> 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" <  <mailto:[EMAIL PROTECTED]> [EMAIL PROTECTED]>
> To: "OJB Users List" <  <mailto:[EMAIL PROTECTED]>
> [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(R
> owReaderDefaultImpl.java:141)
> > >         at
>
org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(RsIterat
> or.java:385)
> > >         at
> org.apache.ojb.broker.accesslayer.RsIterator.next(RsIterator.java:203)
> > >         at
>
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Pe
> rsistenceBrokerImpl.java:1117)
> > >         at
>
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Pe
> rsistenceBrokerImpl.java:1239)
> > >         at
>
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Pe
> rsistenceBrokerImpl.java:1265)
> > >         at
>
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollectionByQuery(Pe
> rsistenceBrokerImpl.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]>
> mailto:[EMAIL PROTECTED]>
> > For additional commands, e-mail: <
> <mailto:[EMAIL PROTECTED]>
> mailto:[EMAIL PROTECTED]>
>
>


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

Reply via email to