Got it.  Sorry, about the misunderstanding.

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


> I am sorry, I did not realize you do not know how to read or apply a
patch.
> The code you
> quote is the original, un-patched code. Let me walk you through the patch.
>
> (PATCH HEADER INFO - DESCRIBES THE PATCH)
> Index: src/java/org/apache/ojb/broker/accesslayer/JdbcAccess.java
>
> ===================================================================
> RCS file:
>
/home/cvspublic/jakarta-ojb/src/java/org/apache/ojb/broker/accesslayer/JdbcA
> ccess.java,v
> retrieving revision 1.21
> diff -u -r1.21 JdbcAccess.java
> --- src/java/org/apache/ojb/broker/accesslayer/JdbcAccess.java 14 Nov 2002
> 20:28:20 -0000 1.21
> +++ src/java/org/apache/ojb/broker/accesslayer/JdbcAccess.java 22 Nov 2002
> 05:08:08 -0000
> @@ -582,13 +582,13 @@
> (SOME CONTEXT TO SEE WHERE THE PATCH GOES, AND TO ALLOW THE PATCH TOOL TO
> INTEGRATE THE CHANGE - THIS "UN MARKED" CODE IS COMMON TO BOTH BEFORE AND
> AFTER)
>              case Types.CLOB :
>                  {
>                      java.sql.Clob aClob = rs.getClob(columnId);
> (A "REMOVE LINE" INDICATOR, MEANING REMOVE THIS LINE FROM THE ORIGINAL, AT
> THIS POSITION)
> -                    result = aClob.getSubString(1L, (int)
aClob.length());
> (A "ADD LINE" INDICATOR, MEANING ADD THIS LINE TO THE ORIGINAL, AT THIS
> POSITION)
> +                    result = ( rs.wasNull() ? null :
aClob.getSubString(1L,
> (int) aClob.length()) );
>                      break;
>                  }
>              case Types.BLOB :
>                  {
>                      java.sql.Blob aBlob = rs.getBlob(columnId);
> -                    result = aBlob.getBytes(1L, (int) aBlob.length());
> +                    result = ( rs.wasNull() ? null : aBlob.getBytes(1L,
> (int) aBlob.length()) );
>                      break;
>                  }
>              default :
>
>
> I hope this clears things up for you. As you can see, in my code
> result = ( rs.wasNull() ? null : aClob.getSubString(1L, (int)
> aClob.length()) );
> we do nothing with the blob/clob if it is null, just return null!
>
> Russell
> > -----Original Message-----
> > From: Rajeev Kaul [mailto:[EMAIL PROTECTED]]
> > Sent: Friday, November 22, 2002 11:35 AM
> > To: OJB Users List
> > Subject: Re: [PATCH]Re: null value for Blob/Clob causes
> > NullPointerException
> >
> >
> > 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.getObjectFromColu
> > mn(JdbcAccess.
> > > java:592)
> > > > >         at
> > >
> > org.apache.ojb.broker.accesslayer.JdbcAccess.getObjectFromColu
> > mn(JdbcAccess.
> > > java:469)
> > > > >         at
> > >
> > org.apache.ojb.broker.accesslayer.RowReaderDefaultImpl.readObj
> > ectArrayFrom(R
> > > owReaderDefaultImpl.java:141)
> > > > >         at
> > >
> > org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResu
> > ltSet(RsIterat
> > > or.java:385)
> > > > >         at
> > >
> > org.apache.ojb.broker.accesslayer.RsIterator.next(RsIterator.java:203)
> > > > >         at
> > >
> > org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollec
> > tionByQuery(Pe
> > > rsistenceBrokerImpl.java:1117)
> > > > >         at
> > >
> > org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollec
> > tionByQuery(Pe
> > > rsistenceBrokerImpl.java:1239)
> > > > >         at
> > >
> > org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollec
> > tionByQuery(Pe
> > > rsistenceBrokerImpl.java:1265)
> > > > >         at
> > >
> > org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.getCollec
> > tionByQuery(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]>
> >
>
> --
> To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>


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

Reply via email to