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