Fwd: Review request for 7145913 CachedRowSetSwriter.insertNewRow() throws SQLException

Lance Andersen - Oracle Lance.Andersen at oracle.com
Tue Jun 5 14:15:36 UTC 2012


Still looking for reviewer

Best
Lance

Begin forwarded message:

> From: Lance Andersen - Oracle <Lance.Andersen at oracle.com>
> Date: May 31, 2012 6:16:16 PM EDT
> Cc: core-libs-dev core-libs-dev <core-libs-dev at openjdk.java.net>
> Subject: Re: Review request for 7145913 CachedRowSetSwriter.insertNewRow() throws SQLException
> 
> Here is the revision using the try with resources as David suggested
> 
> http://cr.openjdk.java.net/~lancea/7145913/webrev.01/
> 
> Best
> Lance
> On May 31, 2012, at 3:10 PM, David Schlosnagle wrote:
> 
>> On Thu, May 31, 2012 at 1:50 PM, Lance Andersen - Oracle
>> <Lance.Andersen at oracle.com> wrote:
>>> Hi,
>>> 
>>> Looking for a reviewer for 7145913.  This addresses an issue with where a SQLException could be thrown when writing a row back with an auto-incremented column on some databases.
>>> 
>>> Webrev is http://cr.openjdk.java.net/~lancea/7145913/webrev.00/.  RowSet TCK, sqe tests and unit tests all pass with this fix.
>> 
>> Hi Lance,
>> 
>> I had a few quick comments:
>> 
>> * Do you need the multiple calls to CachedResultSet.getObject for the primary
>> key, or would it be worthwhile to store the result in a local variable?
>> 
>> * This seems to be pre-existing before your changes, but the PreparedStatement
>> pstmtSel and ResultSet rs, rs2 used within the insertNewRow method are never
>> closed, which could lead to resource leaks.
>> 
>> * Minor nit, the indentation in this file seems off, especially for the method
>> JavaDoc.
>> 
>> I've included a minor cleanup below of the insertNewRow method using
>> try-with-resources.
>> 
>> Thanks,
>> Dave
>> 
>> 
>>   /**
>>    * Inserts a row that has been inserted into the given
>>    * <code>CachedRowSet</code> object into the data source from which
>>    * the rowset is derived, returning <code>false</code> if the insertion
>>    * was successful.
>>    *
>>    * @param crs the <code>CachedRowSet</code> object that has had a
>> row inserted
>>    *            and to whose underlying data source the row will be inserted
>>    * @param pstmt the <code>PreparedStatement</code> object that will be used
>>    *              to execute the insertion
>>    * @return <code>false</code> to indicate that the insertion was successful;
>>    *         <code>true</code> otherwise
>>    * @throws SQLException if a database access error occurs
>>    */
>>   private boolean insertNewRow(CachedRowSet crs,
>>       PreparedStatement pstmt, CachedRowSetImpl crsRes) throws SQLException {
>> 
>>       boolean returnVal = false;
>> 
>>       try (PreparedStatement pstmtSel = con.prepareStatement(selectCmd,
>>                       ResultSet.TYPE_SCROLL_SENSITIVE,
>>                       ResultSet.CONCUR_READ_ONLY);
>>            ResultSet rs = pstmtSel.executeQuery();
>>            ResultSet rs2 = con.getMetaData().getPrimaryKeys(null, null,
>>                       crs.getTableName())
>>       ) {
>> 
>>           ResultSetMetaData rsmd = crs.getMetaData();
>>           int icolCount = rsmd.getColumnCount();
>>           String[] primaryKeys = new String[icolCount];
>>           int k = 0;
>>           while (rs2.next()) {
>>               primaryKeys[k] = rs2.getString("COLUMN_NAME");
>>               k++;
>>           }
>> 
>>           if (rs.next()) {
>>               for (String pkName : primaryKeys) {
>>                   if (!isPKNameValid(pkName, rsmd)) {
>> 
>>                       /* We came here as one of the the primary keys
>>                        * of the table is not present in the cached
>>                        * rowset object, it should be an autoincrement column
>>                        * and not included while creating CachedRowSet
>>                        * Object, proceed to check for other primary keys
>>                        */
>>                       continue;
>>                   }
>> 
>>                   Object crsPK = crs.getObject(pkName);
>>                   if (crsPK == null) {
>>                       /*
>>                        * It is possible that the PK is null on some databases
>>                        * and will be filled in at insert time (MySQL
>> for example)
>>                        */
>>                       break;
>>                   }
>> 
>>                   String rsPK = rs.getObject(pkName).toString();
>>                   if (crsPK.toString().equals(rsPK)) {
>>                       returnVal = true;
>>                       this.crsResolve.moveToInsertRow();
>>                       for (int i = 1; i <= icolCount; i++) {
>>                           String colname =
>> (rs.getMetaData()).getColumnName(i);
>>                           if (colname.equals(pkName))
>>                               this.crsResolve.updateObject(i,rsPK);
>>                           else
>>                               this.crsResolve.updateNull(i);
>>                       }
>>                       this.crsResolve.insertRow();
>>                       this.crsResolve.moveToCurrentRow();
>>                   }
>>               }
>>           }
>> 
>>           if (returnVal) {
>>               return returnVal;
>>           }
>> 
>>           try {
>>               int i;
>>               for (i = 1; i <= icolCount; i++) {
>>                   Object obj = crs.getObject(i);
>>                   if (obj != null) {
>>                       pstmt.setObject(i, obj);
>>                   } else {
>>                       pstmt.setNull(i,crs.getMetaData().getColumnType(i));
>>                   }
>>               }
>> 
>>               i = pstmt.executeUpdate();
>>               return false;
>> 
>>           } catch (SQLException ex) {
>>               /*
>>                * Cursor will come here if executeUpdate fails.
>>                * There can be many reasons why the insertion failed,
>>                * one can be violation of primary key.
>>                * Hence we cannot exactly identify why the insertion failed
>>                * Present the current row as a null row to the user.
>>                **/
>>               this.crsResolve.moveToInsertRow();
>> 
>>               for (int i = 1; i <= icolCount; i++) {
>>                   this.crsResolve.updateNull(i);
>>               }
>> 
>>               this.crsResolve.insertRow();
>>               this.crsResolve.moveToCurrentRow();
>> 
>>               return true;
>>           }
>>       }
>>   }
> 
> 
> Lance Andersen| Principal Member of Technical Staff | +1.781.442.2037
> Oracle Java Engineering 
> 1 Network Drive 
> Burlington, MA 01803
> Lance.Andersen at oracle.com
> 


Lance Andersen| Principal Member of Technical Staff | +1.781.442.2037
Oracle Java Engineering 
1 Network Drive 
Burlington, MA 01803
Lance.Andersen at oracle.com




More information about the core-libs-dev mailing list