You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/05/09 18:44:26 UTC

svn commit: r654880 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne: access/jdbc/RowDescriptorBuilder.java access/jdbc/SQLTemplateAction.java dba/oracle/OracleSQLTemplateAction.java

Author: aadamchik
Date: Fri May  9 09:44:26 2008
New Revision: 654880

URL: http://svn.apache.org/viewvc?rev=654880&view=rev
Log:
further improving Java type guessing algorithm for Oracle used in SQLTemplates

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSQLTemplateAction.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java?rev=654880&r1=654879&r2=654880&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/RowDescriptorBuilder.java Fri May  9 09:44:26 2008
@@ -189,11 +189,16 @@
     }
 
     public RowDescriptorBuilder overrideColumnType(String columnName, String type) {
+
         if (typeOverrides == null) {
             typeOverrides = new HashMap<String, String>();
         }
-
+        
         typeOverrides.put(columnName, type);
         return this;
     }
+    
+    public boolean isOverriden(String columnName) {
+        return typeOverrides != null && typeOverrides.containsKey(columnName);
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java?rev=654880&r1=654879&r2=654880&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/SQLTemplateAction.java Fri May  9 09:44:26 2008
@@ -218,6 +218,40 @@
         boolean iteratedResult = callback.isIteratedResult();
 
         ExtendedTypeMap types = adapter.getExtendedTypes();
+        RowDescriptorBuilder builder = configureRowDescriptorBuilder(compiled, resultSet);
+
+        JDBCResultIterator result = new JDBCResultIterator(
+                connection,
+                statement,
+                resultSet,
+                builder.getDescriptor(types),
+                query.getFetchLimit());
+
+        if (!iteratedResult) {
+            List<DataRow> resultRows = result.dataRows(false);
+            QueryLogger.logSelectCount(resultRows.size(), System.currentTimeMillis()
+                    - startTime);
+
+            callback.nextDataRows(query, resultRows);
+        }
+        else {
+            try {
+                result.setClosingConnection(true);
+                callback.nextDataRows(query, result);
+            }
+            catch (Exception ex) {
+                result.close();
+                throw ex;
+            }
+        }
+    }
+
+    /**
+     * @since 3.0
+     */
+    protected RowDescriptorBuilder configureRowDescriptorBuilder(
+            SQLStatement compiled,
+            ResultSet resultSet) throws SQLException {
         RowDescriptorBuilder builder = new RowDescriptorBuilder();
 
         // SQLTemplate #result columns take precedence over other ways to determine the
@@ -238,9 +272,13 @@
                     }
 
                     builder.overrideColumnType(column, attribute.getType());
+
+                    // note that some DB's (Oracle) also add default JDBC overrides for
+                    // DbAttributes that have no ObjAttributes (very common for PK's). If
+                    // we find that there is more than one such DB, we can make that a
+                    // default policy.
                 }
             }
-
         }
 
         if (query.getColumnNamesCapitalization() != null) {
@@ -254,30 +292,7 @@
             }
         }
 
-        JDBCResultIterator result = new JDBCResultIterator(
-                connection,
-                statement,
-                resultSet,
-                builder.getDescriptor(types),
-                query.getFetchLimit());
-
-        if (!iteratedResult) {
-            List<DataRow> resultRows = result.dataRows(false);
-            QueryLogger.logSelectCount(resultRows.size(), System.currentTimeMillis()
-                    - startTime);
-
-            callback.nextDataRows(query, resultRows);
-        }
-        else {
-            try {
-                result.setClosingConnection(true);
-                callback.nextDataRows(query, result);
-            }
-            catch (Exception ex) {
-                result.close();
-                throw ex;
-            }
-        }
+        return builder;
     }
 
     /**

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSQLTemplateAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSQLTemplateAction.java?rev=654880&r1=654879&r2=654880&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSQLTemplateAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSQLTemplateAction.java Fri May  9 09:44:26 2008
@@ -40,9 +40,13 @@
 import java.util.Map;
 
 import org.apache.cayenne.access.OperationObserver;
+import org.apache.cayenne.access.jdbc.RowDescriptorBuilder;
 import org.apache.cayenne.access.jdbc.SQLStatement;
 import org.apache.cayenne.access.jdbc.SQLTemplateAction;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.TypesMapping;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.SQLTemplate;
 
@@ -52,8 +56,12 @@
  */
 class OracleSQLTemplateAction extends SQLTemplateAction {
 
-    OracleSQLTemplateAction(SQLTemplate query, DbAdapter adapter, EntityResolver resolver) {
-        super(query, adapter, resolver);
+    protected DbEntity dbEntity;
+
+    OracleSQLTemplateAction(SQLTemplate query, DbAdapter adapter,
+            EntityResolver entityResolver) {
+        super(query, adapter, entityResolver);
+        this.dbEntity = query.getMetaData(entityResolver).getDbEntity();
     }
 
     @Override
@@ -81,6 +89,36 @@
                 startTime);
     }
 
+    /**
+     * @since 3.0
+     */
+    @Override
+    protected RowDescriptorBuilder configureRowDescriptorBuilder(
+            SQLStatement compiled,
+            ResultSet resultSet) throws SQLException {
+
+        RowDescriptorBuilder builder = super.configureRowDescriptorBuilder(
+                compiled,
+                resultSet);
+
+        // override numeric Java types based on JDBC defaults for DbAttributes, as Oracle
+        // ResultSetMetadata is not very precise about NUMERIC distinctions...
+        // (BigDecimal vs Long vs. Integer)
+        if (dbEntity != null) {
+            for (DbAttribute attribute : dbEntity.getAttributes()) {
+
+                if (!builder.isOverriden(attribute.getName())
+                        && TypesMapping.isNumeric(attribute.getType())) {
+
+                    builder.overrideColumnType(attribute.getName(), TypesMapping
+                            .getJavaBySqlType(attribute.getType()));
+                }
+            }
+        }
+
+        return builder;
+    }
+
     final class OracleResultSetWrapper implements ResultSet {
 
         private ResultSet delegate;
@@ -709,6 +747,7 @@
         public int getColumnType(int column) throws SQLException {
             int type = delegate.getColumnType(column);
 
+            // this only detects INTEGER but not BIGINT...
             if (type == Types.NUMERIC) {
                 int precision = delegate.getPrecision(column);
                 if ((precision == 10 || precision == 38)