Author: tomdz
Date: Mon Dec 19 14:42:53 2005
New Revision: 357822
URL: http://svn.apache.org/viewcvs?rev=357822&view=rev
Log:
Made object retrieval via the iterator more robust regarding errorneous jdbc
drivers that don't follow the standard JDBC mapping as defined by the spec
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java
Modified:
db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java
URL:
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java?rev=357822&r1=357821&r2=357822&view=diff
==============================================================================
---
db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java
(original)
+++
db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java
Mon Dec 19 14:42:53 2005
@@ -21,6 +21,7 @@
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
+import java.sql.Types;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -37,6 +38,7 @@
import org.apache.ddlutils.model.Column;
import org.apache.ddlutils.model.Database;
import org.apache.ddlutils.model.Table;
+import org.apache.ddlutils.util.Jdbc3Utils;
/**
* This is an iterator that is specifically targeted at traversing result sets.
@@ -223,13 +225,24 @@
{
try
{
- DynaBean bean = _dynaClass.newInstance();
+ DynaBean bean = _dynaClass.newInstance();
+ Table table = null;
+
+ if (bean instanceof SqlDynaBean)
+ {
+ SqlDynaClass dynaClass =
(SqlDynaClass)((SqlDynaBean)bean).getDynaClass();
+
+ table = dynaClass.getTable();
+ }
for (Iterator it = _columnsToProperties.entrySet().iterator();
it.hasNext();)
{
- Map.Entry entry = (Map.Entry)it.next();
+ Map.Entry entry = (Map.Entry)it.next();
+ String columnName = (String)entry.getKey();
+ String propName = (String)entry.getKey();
+ Object value = getObjectFromResultSet(_resultSet,
columnName, table);
- bean.set((String)entry.getValue(),
_resultSet.getObject((String)entry.getKey()));
+ bean.set(propName, value);
}
_needsAdvancing = true;
return bean;
@@ -242,6 +255,102 @@
}
}
+ /**
+ * Extracts the value for the specified column from the result set. If a
table was specified,
+ * and it contains the column, then the jdbc type defined for the column
is used for extracting
+ * the value, otherwise the object directly retrieved from the result set
is returned.
+ *
+ * @param resultSet The result set
+ * @param columnName The name of the column
+ * @param table The table
+ * @return The value
+ */
+ private Object getObjectFromResultSet(ResultSet resultSet, String
columnName, Table table) throws SQLException
+ {
+ Column column = (table == null ? null : table.findColumn(columnName,
true));
+ Object value = null;
+
+ if (column != null)
+ {
+ int jdbcType = column.getTypeCode();
+
+ // we're returning values according to the standard mapping as
defined by the JDBC spec
+ switch (jdbcType)
+ {
+ case Types.CHAR:
+ case Types.VARCHAR:
+ case Types.LONGVARCHAR:
+ value = resultSet.getString(columnName);
+ break;
+ case Types.NUMERIC:
+ case Types.DECIMAL:
+ value = resultSet.getBigDecimal(columnName);
+ break;
+ case Types.BIT:
+ value = new Boolean(resultSet.getBoolean(columnName));
+ break;
+ case Types.TINYINT:
+ case Types.SMALLINT:
+ case Types.INTEGER:
+ value = new Integer(resultSet.getInt(columnName));
+ break;
+ case Types.BIGINT:
+ value = new Long(resultSet.getLong(columnName));
+ break;
+ case Types.REAL:
+ value = new Float(resultSet.getFloat(columnName));
+ break;
+ case Types.FLOAT:
+ case Types.DOUBLE:
+ value = new Double(resultSet.getDouble(columnName));
+ break;
+ case Types.BINARY:
+ case Types.VARBINARY:
+ case Types.LONGVARBINARY:
+ value = resultSet.getBytes(columnName);
+ break;
+ case Types.DATE:
+ value = resultSet.getDate(columnName);
+ break;
+ case Types.TIME:
+ value = resultSet.getTime(columnName);
+ break;
+ case Types.TIMESTAMP:
+ value = resultSet.getTimestamp(columnName);
+ break;
+ case Types.CLOB:
+ value = resultSet.getClob(columnName);
+ break;
+ case Types.BLOB:
+ value = resultSet.getBlob(columnName);
+ break;
+ case Types.ARRAY:
+ value = resultSet.getArray(columnName);
+ break;
+ case Types.REF:
+ value = resultSet.getRef(columnName);
+ break;
+ default:
+ // special handling for Java 1.4/JDBC 3 types
+ if (Jdbc3Utils.supportsJava14JdbcTypes() &&
+ (jdbcType == Jdbc3Utils.determineBooleanTypeCode()))
+ {
+ value = new Boolean(resultSet.getBoolean(columnName));
+ }
+ else
+ {
+ value = resultSet.getObject(columnName);
+ }
+ break;
+ }
+ }
+ else
+ {
+ value = _resultSet.getObject(columnName);
+ }
+ return value;
+ }
+
/**
* Advances the result set if necessary.
*/