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