mkalen      2005/03/02 12:32:35

  Modified:    src/java/org/apache/ojb/broker/accesslayer Tag:
                        OJB_1_0_RELEASE StatementManager.java
               .        Tag: OJB_1_0_RELEASE release-notes.txt
  Log:
  Make sure StatementManager uses .setNull() for null-values, also when binding 
delete-statement parameters. Fixes SQLException on Oracle9i platform in 
FieldConversionTest_3. Test now passes on hsqldb and oracle9i.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.47.2.2  +33 -56    
db-ojb/src/java/org/apache/ojb/broker/accesslayer/StatementManager.java
  
  Index: StatementManager.java
  ===================================================================
  RCS file: 
/home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/StatementManager.java,v
  retrieving revision 1.47.2.1
  retrieving revision 1.47.2.2
  diff -u -r1.47.2.1 -r1.47.2.2
  --- StatementManager.java     17 Feb 2005 14:13:46 -0000      1.47.2.1
  +++ StatementManager.java     2 Mar 2005 20:32:35 -0000       1.47.2.2
  @@ -132,7 +132,7 @@
           {
               for (; i < pkValues.length; i++)
               {
  -                m_platform.setObjectForStatement(stmt, i + 1, pkValues[i], 
pkFields[i].getJdbcType().getType());
  +                setObjectForStatement(stmt, i + 1, pkValues[i], 
pkFields[i].getJdbcType().getType());
               }
           }
           catch (SQLException e)
  @@ -162,7 +162,7 @@
               values = getKeyValues(m_broker, cld, obj);
               for (int i = 0; i < values.length; i++)
               {
  -                m_platform.setObjectForStatement(stmt, index, 
values[i].getValue(), values[i].getJdbcType().getType());
  +                setObjectForStatement(stmt, index, values[i].getValue(), 
values[i].getJdbcType().getType());
                   index++;
               }
   
  @@ -170,7 +170,7 @@
               values = currentLockingValues;
               for (int i = 0; i < values.length; i++)
               {
  -                m_platform.setObjectForStatement(stmt, index, 
values[i].getValue(), values[i].getJdbcType().getType());
  +                setObjectForStatement(stmt, index, values[i].getValue(), 
values[i].getJdbcType().getType());
                   index++;
               }
           }
  @@ -443,15 +443,7 @@
               values = getAllValues(cld, obj);
               for (int i = 0; i < values.length; i++)
               {
  -                ValueContainer val = values[i];
  -                if (val.getValue() != null)
  -                {
  -                    m_platform.setObjectForStatement(stmt, i + 1, 
val.getValue(), val.getJdbcType().getType());
  -                }
  -                else
  -                {
  -                    m_platform.setNullForStatement(stmt, i + 1, 
val.getJdbcType().getType());
  -                }
  +                setObjectForStatement(stmt, i + 1, values[i].getValue(), 
values[i].getJdbcType().getType());
               }
           }
       }
  @@ -473,15 +465,7 @@
               values = getKeyValues(m_broker, cld, oid);
               for (i = 0; i < values.length; i++)
               {
  -                ValueContainer valContainer = values[i];
  -                if (valContainer.getValue() != null)
  -                {
  -                    m_platform.setObjectForStatement(stmt, i + 1, 
valContainer.getValue(), valContainer.getJdbcType().getType());
  -                }
  -                else
  -                {
  -                    m_platform.setNullForStatement(stmt, i + 1, 
valContainer.getJdbcType().getType());
  -                }
  +                setObjectForStatement(stmt, i + 1, values[i].getValue(), 
values[i].getJdbcType().getType());
               }
           }
           catch (SQLException e)
  @@ -512,29 +496,14 @@
               // parameters for SET-clause
               for (int i = 0; i < values.length; i++)
               {
  -                if (values[i].getValue() != null)
  -                {
  -                    m_platform.setObjectForStatement(stmt, index, 
values[i].getValue(), values[i].getJdbcType().getType());
  -                }
  -                else
  -                {
  -                    m_platform.setNullForStatement(stmt, index, 
values[i].getJdbcType().getType());
  -                }
  -
  +                setObjectForStatement(stmt, index, values[i].getValue(), 
values[i].getJdbcType().getType());
                   index++;
               }
               // parameters for WHERE-clause pk
               values = getKeyValues(m_broker, cld, obj);
               for (int i = 0; i < values.length; i++)
               {
  -                if (values[i].getValue() != null)
  -                {
  -                    m_platform.setObjectForStatement(stmt, index, 
values[i].getValue(), values[i].getJdbcType().getType());
  -                }
  -                else
  -                {
  -                    m_platform.setNullForStatement(stmt, index, 
values[i].getJdbcType().getType());
  -                }
  +                setObjectForStatement(stmt, index, values[i].getValue(), 
values[i].getJdbcType().getType());
                   index++;
               }
               // parameters for WHERE-clause locking
  @@ -542,14 +511,7 @@
               values = valuesSnapshot;
               for (int i = 0; i < values.length; i++)
               {
  -                if (values[i].getValue() != null)
  -                {
  -                    m_platform.setObjectForStatement(stmt, index, 
values[i].getValue(), values[i].getJdbcType().getType());
  -                }
  -                else
  -                {
  -                    m_platform.setNullForStatement(stmt, index, 
values[i].getJdbcType().getType());
  -                }
  +                setObjectForStatement(stmt, index, values[i].getValue(), 
values[i].getJdbcType().getType());
                   index++;
               }
           }
  @@ -566,7 +528,7 @@
           {
               for (int i = 0; i < values.length; i++)
               {
  -                m_platform.setObjectForStatement(stmt, index, 
values[i].getValue(), values[i].getJdbcType().getType());
  +                setObjectForStatement(stmt, index, values[i].getValue(), 
values[i].getJdbcType().getType());
                   index++;
               }
           }
  @@ -758,14 +720,7 @@
               ArgumentDescriptor arg = (ArgumentDescriptor) iterator.next();
               Object val = arg.getValue(obj);
               int jdbcType = arg.getJdbcType();
  -            if (val != null)
  -            {
  -                m_platform.setObjectForStatement(stmt, valueSub + 1, val, 
jdbcType);
  -            }
  -            else
  -            {
  -                m_platform.setNullForStatement(stmt, valueSub + 1, jdbcType);
  -            }
  +            setObjectForStatement(stmt, valueSub + 1, val, jdbcType);
               if ((arg.getIsReturnedByProcedure()) && (callable != null))
               {
                   callable.registerOutParameter(valueSub + 1, jdbcType);
  @@ -773,4 +728,26 @@
               valueSub++;
           }
       }
  +
  +    /**
  +     * Sets object for statement at specific index, adhering to platform- 
and null-rules.
  +     * @param stmt the statement
  +     * @param index the current parameter index
  +     * @param value the value to set
  +     * @param sqlType the JDBC SQL-type of the value
  +     * @throws SQLException on platform error
  +     */
  +    private void setObjectForStatement(PreparedStatement stmt, int index, 
Object value, int sqlType)
  +            throws SQLException
  +    {
  +        if (value == null)
  +        {
  +            m_platform.setNullForStatement(stmt, index, sqlType);
  +        }
  +        else
  +        {
  +            m_platform.setObjectForStatement(stmt, index, value, sqlType);
  +        }
  +    }
  +
   }
  
  
  
  No                   revision
  No                   revision
  1.54.2.29 +5 -1      db-ojb/release-notes.txt
  
  Index: release-notes.txt
  ===================================================================
  RCS file: /home/cvs/db-ojb/release-notes.txt,v
  retrieving revision 1.54.2.28
  retrieving revision 1.54.2.29
  diff -u -r1.54.2.28 -r1.54.2.29
  --- release-notes.txt 2 Mar 2005 16:25:28 -0000       1.54.2.28
  +++ release-notes.txt 2 Mar 2005 20:32:35 -0000       1.54.2.29
  @@ -72,6 +72,10 @@
   under http://issues.apache.org/scarab/servlet/scarab/issues/id/OJBxxx
   to see details for a bug with id OJBxxx.
   
  +- Fix problem with StatementManager when binding delete-statement parameters
  +  with null-values for numeric type columns under certain conditions.
  +  (Oracle9i and jdbc-type=NUMERIC with a conversion class that can return 
null-values
  +   was such a combination, resulting in SQLException in 
OracleStatement#get_internal_type.)
   - Fix bug in MetadataManager, when 'per thread changes' is enabled and 
CollectionProxy
     proxies are used. Using proxies in this mode used to be undefined, since 
the lazy
     loading might or might not succeed depending on in which thread the data 
was loaded.
  
  
  

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

Reply via email to