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]>

Reply via email to