You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tuscany.apache.org by bd...@apache.org on 2006/09/27 21:54:23 UTC

svn commit: r450559 - in /incubator/tuscany/java/das/rdb/src/main/java/org/apache/tuscany/das/rdb: generator/impl/InsertGenerator.java impl/ConnectionImpl.java impl/InsertCommandImpl.java impl/Statement.java

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: tuscany-commits-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-commits-help@ws.apache.org