Author: bdaniel
Date: Wed Sep 27 12:54:22 2006
New Revision: 450559

URL: http://svn.apache.org/viewvc?view=rev&rev=450559
Log:
TUSCANY-758 Further changes for vendor-specific jdbc behavior

Modified:
    
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
    
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ConnectionImpl.java
    
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java
    
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/Statement.java

Modified: 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java?view=diff&rev=450559&r1=450558&r2=450559
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/generator/impl/InsertGenerator.java
 Wed Sep 27 12:54:22 2006
@@ -56,9 +56,12 @@
                Iterator i = getAttributeProperties(changedObject, 
config).iterator();
 
                ArrayList attributes = new ArrayList();
+               ArrayList generatedKeys = new ArrayList();
                while (i.hasNext()) {
                        Property attr = (Property) i.next();
-                       if (!table.isGeneratedColumnProperty(attr.getName())) {
+                       if (table.isGeneratedColumnProperty(attr.getName())) {
+                               generatedKeys.add(attr.getName());
+                       } else {
                                attributes.add(attr.getName());
                                
parameters.add(changedObject.getType().getProperty(
                                                attr.getName()));
@@ -86,7 +89,7 @@
                                statement.append(")");
                }
 
-               InsertCommandImpl cmd = new 
InsertCommandImpl(statement.toString());
+               InsertCommandImpl cmd = new 
InsertCommandImpl(statement.toString(), (String[]) generatedKeys.toArray(new 
String[0]));
                Iterator params = parameters.iterator();
                for (int idx = 1; params.hasNext(); idx++) {
                        Property property = (Property) params.next();

Modified: 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ConnectionImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ConnectionImpl.java?view=diff&rev=450559&r1=450558&r2=450559
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ConnectionImpl.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/ConnectionImpl.java
 Wed Sep 27 12:54:22 2006
@@ -24,6 +24,7 @@
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 
 import org.apache.log4j.Logger;
 import org.apache.tuscany.das.rdb.util.LoggerFactory;
@@ -35,18 +36,18 @@
        private Connection connection;
 
        private boolean managingTransaction = true;
-       private final boolean supportsGeneratedKeys;
+       private final boolean useGetGeneratedKeys;
 
        public ConnectionImpl(Connection connection) {
                this.connection = connection;
                
                try {
                        DatabaseMetaData dbmd = connection.getMetaData();
-                       // Derby says they don't support generated keys, but 
they do for our purposes. 
-                       if ( dbmd.supportsGetGeneratedKeys() || 
dbmd.getDatabaseProductName().contains("Derby") )
-                               this.supportsGeneratedKeys = true;
+                
+                       if (dbmd.getDatabaseProductName().contains("Oracle") )
+                               this.useGetGeneratedKeys = false;
                        else
-                               this.supportsGeneratedKeys = false;
+                               this.useGetGeneratedKeys = true;
                        if (connection.getAutoCommit())
                                throw new RuntimeException("AutoCommit must be 
off");
                } catch (SQLException e) {
@@ -85,16 +86,18 @@
                }
        }
 
-       public PreparedStatement prepareStatement(String queryString)
+       public PreparedStatement prepareStatement(String queryString, String[] 
returnKeys)
                        throws SQLException {
                if (this.logger.isDebugEnabled())
                        this.logger.debug("Preparing Statement: " + 
queryString);
 
-               if (this.supportsGeneratedKeys)
-                       return connection.prepareStatement(queryString,
-                                       
java.sql.Statement.RETURN_GENERATED_KEYS);
-               else
-                       return connection.prepareStatement(queryString);
+               if ( useGetGeneratedKeys )
+                       return connection.prepareStatement(queryString, 
Statement.RETURN_GENERATED_KEYS);
+               
+               else if (returnKeys.length > 0)
+                       return connection.prepareStatement(queryString, 
returnKeys);
+               
+               return connection.prepareStatement(queryString);
        }
 
        public PreparedStatement preparePagedStatement(String queryString) 
throws SQLException {
@@ -113,7 +116,7 @@
                return connection.prepareCall(queryString);
        }
 
-       public boolean supportsGeneratedKeys() {
-               return this.supportsGeneratedKeys;
+       public boolean useGetGeneratedKeys() {
+               return this.useGetGeneratedKeys;
        }
 }

Modified: 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java?view=diff&rev=450559&r1=450558&r2=450559
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/InsertCommandImpl.java
 Wed Sep 27 12:54:22 2006
@@ -24,39 +24,42 @@
 
 public class InsertCommandImpl extends WriteCommandImpl {
 
-       private int generatedKey;
-
-       private boolean hasGeneratedKey = false;
-
-       public InsertCommandImpl(String sqlString) {
+       private String[] keys;
+       
+       public InsertCommandImpl(String sqlString, String[] generatedKeys) {
                super(sqlString);
+               keys = generatedKeys;
        }
 
        public InsertCommandImpl(Create create) {
                super(create.getSql());
                addParameters(create.getParameters());
+               this.keys = new String[0];
        }
 
+       public void execute() {
 
-       public int getGeneratedKey() {
-
-               if (hasGeneratedKey)
-                       return generatedKey;
-               
-               throw new RuntimeException("No generated key is available");
-       }
+               boolean success = false;
+               try {
+                       statement.executeUpdate(parameters, keys);
+                       subtypeProcessing();
+                       success = true;
+               } catch (SQLException e) {
+                       throw new RuntimeException(e);
+               } finally {
+                       if (success)
+                               statement.getConnection().cleanUp();
+                       else
+                               statement.getConnection().errorCleanUp();
+               }
 
-       protected void subtypeProcessing() throws SQLException {
-               loadGeneratedKey();
        }
-
-       private void loadGeneratedKey() throws SQLException {
-               Integer key = statement.getGeneratedKey();
-               if (key != null) {
-                       hasGeneratedKey = true;
-                       generatedKey = key.intValue();
+       public int getGeneratedKey() {          
+               try {
+                       return statement.getGeneratedKey();
+               } catch (SQLException ex) {
+                       throw new RuntimeException(ex);
                }
-
        }
 
 

Modified: 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/Statement.java
URL: 
http://svn.apache.org/viewvc/incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/Statement.java?view=diff&rev=450559&r1=450558&r2=450559
==============================================================================
--- 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/Statement.java
 (original)
+++ 
incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb/impl/Statement.java
 Wed Sep 27 12:54:22 2006
@@ -49,7 +49,7 @@
 
     public List executeQuery(Parameters parameters) throws SQLException {
 
-        PreparedStatement ps = getPreparedStatement();
+        PreparedStatement ps = getPreparedStatement(new String[0]);
         ps = setParameters(ps, parameters);
         ResultSet rs = ps.executeQuery();
 
@@ -102,8 +102,6 @@
         Iterator inParams = parameters.inParams().iterator();
         while (inParams.hasNext()) {
             ParameterImpl param = (ParameterImpl) inParams.next();
-//            if (param.getIndex() == 0)
-//                
param.setIndex(queryString.getParameterIndex(param.getName()));
             cs.setObject(param.getIndex(), param.getValue());
         }
 
@@ -111,8 +109,6 @@
         Iterator outParams = parameters.outParams().iterator();
         while (outParams.hasNext()) {
             ParameterImpl param = (ParameterImpl) outParams.next();
-//            if (param.getIndex() == 0)
-//                
param.setIndex(queryString.getParameterIndex(param.getName()));
 
             if(this.logger.isDebugEnabled())
                 this.logger.debug("Registering parameter " + param.getName());
@@ -130,15 +126,22 @@
 
     }
 
+    public int executeUpdate(Parameters parameters, String[] generatedKeys) 
throws SQLException {
+       return executeUpdate(getPreparedStatement(generatedKeys), parameters);
+    }
+    
+    public int executeUpdate(Parameters parameters) throws SQLException {
+       return executeUpdate(parameters, new String[0]);
+    }
+    
     /**
      * TODO - We need to look at using specific ps.setXXX methods when a type
      * has been specified and try setObject otherwise.
      */
-    public int executeUpdate(Parameters parameters) throws SQLException {
+    private int executeUpdate(PreparedStatement ps, Parameters parameters) 
throws SQLException {
         if(this.logger.isDebugEnabled())
             this.logger.debug("Executing statement " + queryString);
-
-        PreparedStatement ps = getPreparedStatement();
+      
         Iterator i = parameters.inParams().iterator();
         while (i.hasNext()) {
             ParameterImpl param = (ParameterImpl) i.next();
@@ -181,23 +184,21 @@
         return this.jdbcConnection;
     }
 
-    private PreparedStatement getPreparedStatement() throws SQLException {
-        if(this.logger.isDebugEnabled())
-            this.logger.debug("Getting prepared statement");
+    private PreparedStatement getPreparedStatement(String[] returnKeys) throws 
SQLException {
 
         if (preparedStatement == null)
             if (isPaging)
                 preparedStatement = 
jdbcConnection.preparePagedStatement(queryString);
             else
-                preparedStatement = 
jdbcConnection.prepareStatement(queryString);
+                preparedStatement = 
jdbcConnection.prepareStatement(queryString, returnKeys);
 
         return preparedStatement;
     }
 
     public Integer getGeneratedKey() throws SQLException {
 
-       if ( getConnection().supportsGeneratedKeys() ) {
-               ResultSet rs = getPreparedStatement().getGeneratedKeys();
+       if ( getConnection().useGetGeneratedKeys() ) {
+               ResultSet rs = preparedStatement.getGeneratedKeys();
                if (rs.next())
                  return new Integer(rs.getInt(1));
        }



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

Reply via email to