You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2016/01/08 14:25:27 UTC
[1/4] metamodel git commit: METAMODEL-6: Added UpdateSummary building
for JDBC module
Repository: metamodel
Updated Branches:
refs/heads/5.x c51994c1f -> 95226631f
METAMODEL-6: Added UpdateSummary building for JDBC module
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/d888907b
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/d888907b
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/d888907b
Branch: refs/heads/5.x
Commit: d888907b3b27d821e0b8fd9291987e9b56e44c68
Parents: c51994c
Author: Kasper Sørensen <i....@gmail.com>
Authored: Sat Jan 2 21:59:14 2016 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Sat Jan 2 21:59:14 2016 +0100
----------------------------------------------------------------------
.../metamodel/AbstractUpdateCallback.java | 12 +-
.../apache/metamodel/UpdateSummaryBuilder.java | 130 +++++++++++++++++++
.../metamodel/jdbc/JdbcBatchUpdateCallback.java | 8 +-
.../metamodel/jdbc/JdbcDeleteBuilder.java | 4 +-
.../metamodel/jdbc/JdbcDropTableBuilder.java | 4 +-
.../metamodel/jdbc/JdbcInsertBuilder.java | 4 +-
.../jdbc/JdbcSimpleUpdateCallback.java | 11 +-
.../metamodel/jdbc/JdbcUpdateBuilder.java | 4 +-
.../metamodel/jdbc/JdbcUpdateCallback.java | 108 +++++++++++----
.../metamodel/jdbc/JdbcTestTemplates.java | 4 +-
.../jdbc/integrationtests/PostgresqlTest.java | 39 ++++++
11 files changed, 287 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java b/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java
index 20842a6..a1c2f1a 100644
--- a/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java
+++ b/core/src/main/java/org/apache/metamodel/AbstractUpdateCallback.java
@@ -48,14 +48,14 @@ public abstract class AbstractUpdateCallback implements UpdateCallback {
}
@Override
- public TableDropBuilder dropTable(String schemaName, String tableName) throws IllegalArgumentException,
+ public final TableDropBuilder dropTable(String schemaName, String tableName) throws IllegalArgumentException,
IllegalStateException, UnsupportedOperationException {
final Table table = getTable(schemaName, tableName);
return dropTable(table);
}
@Override
- public TableDropBuilder dropTable(Schema schema, String tableName) throws IllegalArgumentException,
+ public final TableDropBuilder dropTable(Schema schema, String tableName) throws IllegalArgumentException,
IllegalStateException, UnsupportedOperationException {
final Table table = schema.getTableByName(tableName);
if (table == null) {
@@ -72,7 +72,7 @@ public abstract class AbstractUpdateCallback implements UpdateCallback {
}
@Override
- public RowInsertionBuilder insertInto(String schemaName, String tableName) throws IllegalArgumentException,
+ public final RowInsertionBuilder insertInto(String schemaName, String tableName) throws IllegalArgumentException,
IllegalStateException, UnsupportedOperationException {
return insertInto(getTable(schemaName, tableName));
}
@@ -101,7 +101,7 @@ public abstract class AbstractUpdateCallback implements UpdateCallback {
}
@Override
- public RowDeletionBuilder deleteFrom(String schemaName, String tableName) throws IllegalArgumentException,
+ public final RowDeletionBuilder deleteFrom(String schemaName, String tableName) throws IllegalArgumentException,
IllegalStateException, UnsupportedOperationException {
final Table table = getTable(schemaName, tableName);
return deleteFrom(table);
@@ -138,7 +138,7 @@ public abstract class AbstractUpdateCallback implements UpdateCallback {
@Override
public boolean isInsertSupported() {
- // since 2.0 all updateable datacontext have create table support
+ // since 2.0 all updateable datacontext have insert into table support
return true;
}
@@ -148,7 +148,7 @@ public abstract class AbstractUpdateCallback implements UpdateCallback {
}
@Override
- public RowUpdationBuilder update(String schemaName, String tableName) throws IllegalArgumentException,
+ public final RowUpdationBuilder update(String schemaName, String tableName) throws IllegalArgumentException,
IllegalStateException, UnsupportedOperationException {
final Table table = getTable(schemaName, tableName);
return update(table);
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/core/src/main/java/org/apache/metamodel/UpdateSummaryBuilder.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/metamodel/UpdateSummaryBuilder.java b/core/src/main/java/org/apache/metamodel/UpdateSummaryBuilder.java
new file mode 100644
index 0000000..6469a1b
--- /dev/null
+++ b/core/src/main/java/org/apache/metamodel/UpdateSummaryBuilder.java
@@ -0,0 +1,130 @@
+/**
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel;
+
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * A builder object for {@link UpdateSummary}.
+ */
+public class UpdateSummaryBuilder {
+
+ private int _inserts;
+ private int _updates;
+ private int _deletes;
+ private Set<Object> _generatedKeys;
+
+ public UpdateSummaryBuilder() {
+ }
+
+ public UpdateSummary build() {
+ final Integer insertedRows = (_inserts == -1 ? null : _inserts);
+ final Integer updatedRows = (_updates == -1 ? null : _updates);
+ final Integer deletedRows = (_deletes == -1 ? null : _deletes);
+ final Iterable<Object> generatedKeys;
+ if (_generatedKeys != null) {
+ generatedKeys = new LinkedHashSet<>(_generatedKeys);
+ } else {
+ generatedKeys = null;
+ }
+ return new DefaultUpdateSummary(insertedRows, updatedRows, deletedRows, generatedKeys);
+ }
+
+ public UpdateSummaryBuilder addInsert() {
+ return addInserts(1);
+ }
+
+ public UpdateSummaryBuilder addInserts(int inserts) {
+ if (_inserts != -1) {
+ _inserts += inserts;
+ }
+ return this;
+ }
+
+ public UpdateSummaryBuilder makeInsertsUnknown() {
+ _inserts = -1;
+ return this;
+ }
+
+ public UpdateSummaryBuilder addUpdate() {
+ return addUpdates(1);
+ }
+
+ public UpdateSummaryBuilder addUpdates(int updates) {
+ if (_updates != -1) {
+ _updates += updates;
+ }
+ return this;
+ }
+
+ public UpdateSummaryBuilder makeUpdatesUnknown() {
+ _updates = -1;
+ return this;
+ }
+
+ public UpdateSummaryBuilder addDelete() {
+ return addDeletes(1);
+ }
+
+ public UpdateSummaryBuilder addDeletes(int deletes) {
+ if (_deletes != -1) {
+ _deletes += deletes;
+ }
+ return this;
+ }
+
+ public UpdateSummaryBuilder makeDeletesUnknown() {
+ _deletes = -1;
+ return this;
+ }
+
+ public UpdateSummaryBuilder addGeneratedKey(Object key) {
+ if (_generatedKeys == null) {
+ _generatedKeys = new HashSet<>();
+ }
+ _generatedKeys.add(key);
+ return this;
+ }
+
+ public UpdateSummaryBuilder addGeneratedKeys(Object... keys) {
+ if (_generatedKeys == null) {
+ _generatedKeys = new HashSet<>();
+ }
+ for (Object key : keys) {
+ _generatedKeys.add(key);
+ }
+ return this;
+ }
+
+ public UpdateSummaryBuilder addGeneratedKeys(Iterable<?> keys) {
+ if (_generatedKeys == null) {
+ _generatedKeys = new HashSet<>();
+ }
+ for (Object key : keys) {
+ _generatedKeys.add(key);
+ }
+ return this;
+ }
+
+ public UpdateSummaryBuilder makeGeneratedKeysUnknown() {
+ _generatedKeys = null;
+ return this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcBatchUpdateCallback.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcBatchUpdateCallback.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcBatchUpdateCallback.java
index 100c5d0..52478fc 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcBatchUpdateCallback.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcBatchUpdateCallback.java
@@ -68,7 +68,13 @@ final class JdbcBatchUpdateCallback extends JdbcUpdateCallback {
}
@Override
- protected void executePreparedStatement(PreparedStatement st) throws SQLException {
+ protected int executePreparedStatement(PreparedStatement st) throws SQLException {
st.addBatch();
+ return -1;
+ }
+
+ @Override
+ protected boolean isGeneratedKeysCollectionEnabled() {
+ return false;
}
}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDeleteBuilder.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDeleteBuilder.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDeleteBuilder.java
index bf6aaf2..98d0245 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDeleteBuilder.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDeleteBuilder.java
@@ -62,7 +62,7 @@ final class JdbcDeleteBuilder extends AbstractRowDeletionBuilder {
logger.debug("Delete statement created: {}", sql);
final boolean reuseStatement = !_inlineValues;
- final PreparedStatement st = _updateCallback.getPreparedStatement(sql, reuseStatement);
+ final PreparedStatement st = _updateCallback.getPreparedStatement(sql, reuseStatement, false);
try {
if (reuseStatement) {
int valueCounter = 1;
@@ -75,7 +75,7 @@ final class JdbcDeleteBuilder extends AbstractRowDeletionBuilder {
}
}
}
- _updateCallback.executePreparedStatement(st, reuseStatement);
+ _updateCallback.executeDelete(st, reuseStatement);
} catch (SQLException e) {
throw JdbcUtils.wrapException(e, "execute delete statement: " + sql);
} finally {
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDropTableBuilder.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDropTableBuilder.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDropTableBuilder.java
index e4f387b..87ae31d 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDropTableBuilder.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDropTableBuilder.java
@@ -46,9 +46,9 @@ final class JdbcDropTableBuilder extends AbstractTableDropBuilder implements Tab
@Override
public void execute() {
final String sql = createSqlStatement();
- final PreparedStatement statement = _updateCallback.getPreparedStatement(sql, false);
+ final PreparedStatement statement = _updateCallback.getPreparedStatement(sql, false, false);
try {
- _updateCallback.executePreparedStatement(statement, false);
+ _updateCallback.executePreparedStatement(statement, false, false);
// remove the table reference from the schema
final Schema schema = getTable().getSchema();
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcInsertBuilder.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcInsertBuilder.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcInsertBuilder.java
index 66cdbe7..5b17c9a 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcInsertBuilder.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcInsertBuilder.java
@@ -66,7 +66,7 @@ final class JdbcInsertBuilder extends AbstractRowInsertionBuilder<JdbcUpdateCall
}
final JdbcUpdateCallback updateCallback = getUpdateCallback();
final boolean reuseStatement = !_inlineValues;
- final PreparedStatement st = updateCallback.getPreparedStatement(sql, reuseStatement);
+ final PreparedStatement st = updateCallback.getPreparedStatement(sql, reuseStatement, true);
try {
if (reuseStatement) {
Column[] columns = getColumns();
@@ -81,7 +81,7 @@ final class JdbcInsertBuilder extends AbstractRowInsertionBuilder<JdbcUpdateCall
}
}
}
- updateCallback.executePreparedStatement(st, reuseStatement);
+ updateCallback.executeInsert(st, reuseStatement);
} catch (SQLException e) {
throw JdbcUtils.wrapException(e, "execute insert statement: " + sql);
} finally {
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSimpleUpdateCallback.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSimpleUpdateCallback.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSimpleUpdateCallback.java
index 3d44e42..6d174bf 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSimpleUpdateCallback.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcSimpleUpdateCallback.java
@@ -34,14 +34,19 @@ final class JdbcSimpleUpdateCallback extends JdbcUpdateCallback {
public JdbcSimpleUpdateCallback(JdbcDataContext dataContext) {
super(dataContext);
}
-
+
@Override
protected void closePreparedStatement(PreparedStatement preparedStatement) {
FileHelper.safeClose(preparedStatement);
}
@Override
- protected void executePreparedStatement(PreparedStatement st) throws SQLException {
- st.executeUpdate();
+ protected int executePreparedStatement(PreparedStatement st) throws SQLException {
+ return st.executeUpdate();
+ }
+
+ @Override
+ protected boolean isGeneratedKeysCollectionEnabled() {
+ return true;
}
}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateBuilder.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateBuilder.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateBuilder.java
index 6610a7e..bcdb810 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateBuilder.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateBuilder.java
@@ -62,7 +62,7 @@ final class JdbcUpdateBuilder extends AbstractRowUpdationBuilder {
String sql = createSqlStatement();
logger.debug("Update statement created: {}", sql);
final boolean reuseStatement = !_inlineValues;
- final PreparedStatement st = _updateCallback.getPreparedStatement(sql, reuseStatement);
+ final PreparedStatement st = _updateCallback.getPreparedStatement(sql, reuseStatement, false);
try {
if (reuseStatement) {
Column[] columns = getColumns();
@@ -90,7 +90,7 @@ final class JdbcUpdateBuilder extends AbstractRowUpdationBuilder {
}
}
}
- _updateCallback.executePreparedStatement(st, reuseStatement);
+ _updateCallback.executeUpdate(st, reuseStatement);
} catch (SQLException e) {
throw JdbcUtils.wrapException(e, "execute update statement: " + sql);
} finally {
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateCallback.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateCallback.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateCallback.java
index 5e60826..29fc263 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateCallback.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcUpdateCallback.java
@@ -20,10 +20,15 @@ package org.apache.metamodel.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
+import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.Statement;
import org.apache.metamodel.AbstractUpdateCallback;
import org.apache.metamodel.UpdateCallback;
+import org.apache.metamodel.UpdateSummary;
+import org.apache.metamodel.UpdateSummaryBuilder;
import org.apache.metamodel.create.TableCreationBuilder;
import org.apache.metamodel.delete.RowDeletionBuilder;
import org.apache.metamodel.drop.TableDropBuilder;
@@ -31,6 +36,7 @@ import org.apache.metamodel.insert.RowInsertionBuilder;
import org.apache.metamodel.schema.Schema;
import org.apache.metamodel.schema.Table;
import org.apache.metamodel.update.RowUpdationBuilder;
+import org.apache.metamodel.util.FileHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,32 +44,60 @@ abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements Upda
private static final Logger logger = LoggerFactory.getLogger(JdbcUpdateCallback.class);
- private final JdbcDataContext _dataContext;
private Connection _connection;
private String _preparedStatementSql;
private PreparedStatement _preparedStatement;
+ private final UpdateSummaryBuilder _updateSummaryBuilder;
public JdbcUpdateCallback(JdbcDataContext dataContext) {
super(dataContext);
- _dataContext = dataContext;
+ _updateSummaryBuilder = new UpdateSummaryBuilder();
}
+ protected final UpdateSummaryBuilder getUpdateSummaryBuilder() {
+ return _updateSummaryBuilder;
+ }
+
+ protected abstract boolean isGeneratedKeysCollectionEnabled();
+
protected abstract void closePreparedStatement(PreparedStatement preparedStatement);
- protected abstract void executePreparedStatement(PreparedStatement preparedStatement) throws SQLException;
+ protected abstract int executePreparedStatement(PreparedStatement preparedStatement) throws SQLException;
+
+ public int executePreparedStatement(PreparedStatement preparedStatement, boolean reusedStatement,
+ boolean collectGeneratedKeys) throws SQLException {
+ final int result = executePreparedStatement(preparedStatement);
+
+ if (collectGeneratedKeys && isGeneratedKeysCollectionEnabled()) {
+ try {
+ final ResultSet generatedKeysResultSet = preparedStatement.getGeneratedKeys();
+ try {
+ while (generatedKeysResultSet.next()) {
+ final Object key = generatedKeysResultSet.getObject(1);
+ getUpdateSummaryBuilder().addGeneratedKey(key);
+ }
+ } finally {
+ FileHelper.safeClose(generatedKeysResultSet);
+ }
+ } catch (SQLFeatureNotSupportedException e) {
+ // ignore
+ logger.debug("Getting generated keys from JDBC statement is not supported by driver: {}", e
+ .getMessage(), e);
+ } catch (SQLException | RuntimeException e) {
+ logger.warn("Failed to get generated keys from JDBC statement: {}", e.getMessage(), e);
+ }
+ }
- public void executePreparedStatement(PreparedStatement preparedStatement, boolean reusedStatement)
- throws SQLException {
- executePreparedStatement(preparedStatement);
if (!reusedStatement) {
closePreparedStatement(preparedStatement);
}
+ return result;
}
protected final Connection getConnection() {
if (_connection == null) {
_connection = getDataContext().getConnection();
- if (_dataContext.getQueryRewriter().isTransactional()) {
+ if (getDataContext().getQueryRewriter().isTransactional()) {
try {
_connection.setAutoCommit(false);
} catch (SQLException e) {
@@ -80,11 +114,11 @@ abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements Upda
closePreparedStatement(_preparedStatement);
}
- if (_dataContext.getQueryRewriter().isTransactional()) {
+ if (getDataContext().getQueryRewriter().isTransactional()) {
try {
commitOrRollback(success);
- if (_dataContext.isDefaultAutoCommit()) {
+ if (getDataContext().isDefaultAutoCommit()) {
try {
getConnection().setAutoCommit(true);
} catch (SQLException e) {
@@ -122,19 +156,20 @@ abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements Upda
@Override
public final RowInsertionBuilder insertInto(Table table) throws IllegalArgumentException, IllegalStateException {
- return new JdbcInsertBuilder(this, table, _dataContext.getQueryRewriter());
+ return new JdbcInsertBuilder(this, table, getDataContext().getQueryRewriter());
}
+ // override the return type to the more specific subtype.
@Override
public final JdbcDataContext getDataContext() {
- return _dataContext;
+ return (JdbcDataContext) super.getDataContext();
}
protected String quoteIfNescesary(String identifier) {
if (identifier == null) {
return null;
}
- final String quote = _dataContext.getIdentifierQuoteString();
+ final String quote = getDataContext().getIdentifierQuoteString();
if (quote == null) {
return identifier;
}
@@ -153,7 +188,8 @@ abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements Upda
return identifier;
}
- public final PreparedStatement getPreparedStatement(String sql, boolean reuseStatement) {
+ public final PreparedStatement getPreparedStatement(String sql, boolean reuseStatement,
+ boolean returnGeneratedKeys) {
final PreparedStatement preparedStatement;
if (reuseStatement) {
if (sql.equals(_preparedStatementSql)) {
@@ -167,20 +203,27 @@ abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements Upda
throw e;
}
}
- preparedStatement = createPreparedStatement(sql);
+ preparedStatement = createPreparedStatement(sql, returnGeneratedKeys);
_preparedStatement = preparedStatement;
_preparedStatementSql = sql;
}
} else {
- preparedStatement = createPreparedStatement(sql);
+ preparedStatement = createPreparedStatement(sql, returnGeneratedKeys);
}
return preparedStatement;
}
-
- private final PreparedStatement createPreparedStatement(String sql) {
+
+ private final PreparedStatement createPreparedStatement(String sql, boolean returnGeneratedKeys) {
try {
+ if (returnGeneratedKeys && isGeneratedKeysCollectionEnabled()) {
+ return getConnection().prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
+ }
return getConnection().prepareStatement(sql);
} catch (SQLException e) {
+ if (returnGeneratedKeys) {
+ // not all databases support the RETURN_GENERATED_KEYS flag, so retry without
+ return createPreparedStatement(sql, false);
+ }
throw JdbcUtils.wrapException(e, "create prepared statement for: " + sql);
}
}
@@ -191,9 +234,9 @@ abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements Upda
}
@Override
- public RowDeletionBuilder deleteFrom(Table table) throws IllegalArgumentException, IllegalStateException,
+ public final RowDeletionBuilder deleteFrom(Table table) throws IllegalArgumentException, IllegalStateException,
UnsupportedOperationException {
- return new JdbcDeleteBuilder(this, table, _dataContext.getQueryRewriter());
+ return new JdbcDeleteBuilder(this, table, getDataContext().getQueryRewriter());
}
@Override
@@ -204,7 +247,7 @@ abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements Upda
@Override
public TableDropBuilder dropTable(Table table) throws IllegalArgumentException, IllegalStateException,
UnsupportedOperationException {
- return new JdbcDropTableBuilder(this, table, _dataContext.getQueryRewriter());
+ return new JdbcDropTableBuilder(this, table, getDataContext().getQueryRewriter());
}
@Override
@@ -213,8 +256,29 @@ abstract class JdbcUpdateCallback extends AbstractUpdateCallback implements Upda
}
@Override
- public RowUpdationBuilder update(Table table) throws IllegalArgumentException, IllegalStateException,
+ public final RowUpdationBuilder update(Table table) throws IllegalArgumentException, IllegalStateException,
UnsupportedOperationException {
- return new JdbcUpdateBuilder(this, table, _dataContext.getQueryRewriter());
+ return new JdbcUpdateBuilder(this, table, getDataContext().getQueryRewriter());
+ }
+
+ public void executeInsert(PreparedStatement st, boolean reuseStatement) throws SQLException {
+ executePreparedStatement(st, reuseStatement, true);
+ _updateSummaryBuilder.addInsert();
+ }
+
+ public void executeUpdate(PreparedStatement st, boolean reuseStatement) throws SQLException {
+ final int updates = executePreparedStatement(st, reuseStatement, false);
+ _updateSummaryBuilder.addUpdates(updates);
}
+
+ public void executeDelete(PreparedStatement st, boolean reuseStatement) throws SQLException {
+ final int deletes = executePreparedStatement(st, reuseStatement, false);
+ _updateSummaryBuilder.addDeletes(deletes);
+ }
+
+ @Override
+ public UpdateSummary getUpdateSummary() {
+ return _updateSummaryBuilder.build();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
index f7d0cf2..c4dd018 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
@@ -40,6 +40,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.metamodel.BatchUpdateScript;
import org.apache.metamodel.UpdateCallback;
import org.apache.metamodel.UpdateScript;
+import org.apache.metamodel.UpdateSummary;
import org.apache.metamodel.create.ColumnCreationBuilder;
import org.apache.metamodel.create.CreateTable;
import org.apache.metamodel.create.TableCreationBuilder;
@@ -73,7 +74,7 @@ public class JdbcTestTemplates {
final Map<Object, Object> map = new HashMap<Object, Object>();
try {
- dc.executeUpdate(new UpdateScript() {
+ final UpdateSummary summary = dc.executeUpdate(new UpdateScript() {
@Override
public void run(UpdateCallback cb) {
ColumnCreationBuilder createTableBuilder = cb.createTable(schema, "test_table").withColumn("id")
@@ -86,6 +87,7 @@ public class JdbcTestTemplates {
cb.insertInto(table).value("id", 4.0).value("code", "C02").execute();
}
});
+ assertEquals(4, summary.getInsertedRows().get().intValue());
assertEquals(1, getCount(dc.query().from("test_table").selectCount().where("code").isNull().execute()));
assertEquals(3, getCount(dc.query().from("test_table").selectCount().where("code").isNotNull().execute()));
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d888907b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
index 5cf6822..ef3ae28 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/integrationtests/PostgresqlTest.java
@@ -23,6 +23,7 @@ import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
import java.util.concurrent.TimeUnit;
import javax.swing.table.TableModel;
@@ -31,8 +32,10 @@ import org.apache.metamodel.BatchUpdateScript;
import org.apache.metamodel.DataContext;
import org.apache.metamodel.UpdateCallback;
import org.apache.metamodel.UpdateScript;
+import org.apache.metamodel.UpdateSummary;
import org.apache.metamodel.data.DataSet;
import org.apache.metamodel.data.DataSetTableModel;
+import org.apache.metamodel.drop.DropTable;
import org.apache.metamodel.insert.RowInsertionBuilder;
import org.apache.metamodel.jdbc.JdbcDataContext;
import org.apache.metamodel.jdbc.JdbcTestTemplates;
@@ -430,6 +433,42 @@ public class PostgresqlTest extends AbstractJdbIntegrationTest {
});
}
}
+
+ public void testGetGeneratedKeys() throws Exception {
+ if (!isConfigured()) {
+ return;
+ }
+
+ final JdbcDataContext dc = new JdbcDataContext(getConnection());
+ final Schema schema = dc.getDefaultSchema();
+ final String tableName = "my_table_with_generated_keys";
+
+ if (schema.getTableByName(tableName) != null) {
+ dc.executeUpdate(new DropTable(schema, tableName));
+ }
+
+ final UpdateSummary updateSummary = dc.executeUpdate(new UpdateScript() {
+ @Override
+ public void run(UpdateCallback cb) {
+ Table table = cb.createTable(schema, tableName).withColumn("id").ofType(ColumnType.INTEGER)
+ .ofNativeType("SERIAL").nullable(false).asPrimaryKey().withColumn("foo").ofType(
+ ColumnType.STRING).execute();
+ assertEquals(tableName, table.getName());
+
+ cb.insertInto(table).value("foo", "hello").execute();
+ cb.insertInto(table).value("foo", "world").execute();
+ }
+ });
+
+ final Optional<Integer> insertedRows = updateSummary.getInsertedRows();
+ assertTrue(insertedRows.isPresent());
+ assertEquals(2, insertedRows.get().intValue());
+
+ final Optional<Iterable<Object>> generatedKeys = updateSummary.getGeneratedKeys();
+ assertTrue(generatedKeys.isPresent());
+ assertEquals("[1, 2]", generatedKeys.get().toString());
+
+ }
public void testBlob() throws Exception {
if (!isConfigured()) {
[4/4] metamodel git commit: Fixes #84
Posted by ka...@apache.org.
Fixes #84
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/95226631
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/95226631
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/95226631
Branch: refs/heads/5.x
Commit: 95226631fbff65dd2f97cf99da77477a421ac03e
Parents: aa55e6a
Author: Kasper Sørensen <i....@gmail.com>
Authored: Fri Jan 8 14:25:02 2016 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Fri Jan 8 14:25:02 2016 +0100
----------------------------------------------------------------------
----------------------------------------------------------------------
[3/4] metamodel git commit: Updated CHANGES.md
Posted by ka...@apache.org.
Updated CHANGES.md
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/aa55e6a7
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/aa55e6a7
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/aa55e6a7
Branch: refs/heads/5.x
Commit: aa55e6a7098f77bc6b9e73b82a1bf0b17fb905f7
Parents: d19a7aa
Author: Kasper Sørensen <i....@gmail.com>
Authored: Fri Jan 8 14:24:43 2016 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Fri Jan 8 14:24:43 2016 +0100
----------------------------------------------------------------------
CHANGES.md | 5 +++++
1 file changed, 5 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel/blob/aa55e6a7/CHANGES.md
----------------------------------------------------------------------
diff --git a/CHANGES.md b/CHANGES.md
index a5d8796..388bfb1 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,8 @@
+### Apache MetaModel 5.0
+
+ * [METAMODEL-6] - Added update summary containing information about changes on returning UpdateableDataContext.executeUpdate(..)
+ * [METAMODEL-222] - Added support for Java 8 lambdas, removed support for Java 7.
+
### Apache MetaModel 4.5.0
* [METAMODEL-212] - New module for ElasticSearch via REST client.
[2/4] metamodel git commit: METAMODEL-6: Added unittest assertions on
update count and delete count
Posted by ka...@apache.org.
METAMODEL-6: Added unittest assertions on update count and delete count
Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/d19a7aa6
Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/d19a7aa6
Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/d19a7aa6
Branch: refs/heads/5.x
Commit: d19a7aa66d89b9acea5a56e021efd09e2e98dc58
Parents: d888907
Author: Kasper Sørensen <i....@gmail.com>
Authored: Fri Jan 8 13:51:03 2016 +0100
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Fri Jan 8 13:51:03 2016 +0100
----------------------------------------------------------------------
.../java/org/apache/metamodel/jdbc/JdbcTestTemplates.java | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/metamodel/blob/d19a7aa6/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
index c4dd018..eb9f4e3 100644
--- a/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
+++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/JdbcTestTemplates.java
@@ -335,12 +335,15 @@ public class JdbcTestTemplates {
assertFalse(ds.next());
ds.close();
- dc.executeUpdate(new UpdateScript() {
+ final UpdateSummary updateSummary = dc.executeUpdate(new UpdateScript() {
@Override
public void run(UpdateCallback callback) {
callback.deleteFrom("test_table").where("id").in(Arrays.<String> asList("1", "2")).execute();
}
});
+ assertEquals(2, updateSummary.getDeletedRows().get().intValue());
+ assertEquals(0, updateSummary.getUpdatedRows().get().intValue());
+ assertEquals(0, updateSummary.getInsertedRows().get().intValue());
ds = dc.query().from("test_table").selectCount().where("id").eq(2).or("id").eq(1).execute();
assertTrue(ds.next());
@@ -433,7 +436,7 @@ public class JdbcTestTemplates {
assertFalse(ds.next());
ds.close();
- dc.executeUpdate(new UpdateScript() {
+ final UpdateSummary updateSummary = dc.executeUpdate(new UpdateScript() {
@Override
public void run(UpdateCallback callback) {
// update record 1
@@ -450,6 +453,9 @@ public class JdbcTestTemplates {
.where("birthdate").isEquals(DateUtils.get(1982, Month.APRIL, 20)).execute();
}
});
+ assertEquals(0, updateSummary.getInsertedRows().get().intValue());
+ assertEquals(0, updateSummary.getDeletedRows().get().intValue());
+ assertEquals(1, updateSummary.getUpdatedRows().get().intValue());
ds = dc.query().from(schema.getTableByName(tableName)).select("id", "birthdate", "wakemeup").orderBy("id")
.execute();