From 332dcb41e97efaa9ea26d2ba636e6aff5ae8a5e7 Mon Sep 17 00:00:00 2001 From: kkomyak Date: Thu, 12 Apr 2018 09:20:03 +0300 Subject: [PATCH] CAY-2424 Added setting selected catalog to connection before executing scripts. --- RELEASE-NOTES.txt | 1 + .../merge/token/db/CreateTableToDb.java | 11 ++--- .../apache/cayenne/dba/JdbcPkGenerator.java | 42 +++++++++++++------ .../org/apache/cayenne/dba/PkGenerator.java | 11 +++++ .../dba/frontbase/FrontBasePkGenerator.java | 2 +- .../dba/openbase/OpenBasePkGenerator.java | 2 +- .../cayenne/dba/oracle/OraclePkGenerator.java | 2 +- .../cayenne/dba/sybase/SybasePkGenerator.java | 4 +- .../apache/cayenne/dba/JdbcPkGeneratorIT.java | 2 +- .../org/apache/cayenne/dba/PkGeneratorIT.java | 2 +- .../cayenne/unit/di/server/SchemaBuilder.java | 2 +- 11 files changed, 56 insertions(+), 25 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index 64400656cd..ca85d73a18 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -35,6 +35,7 @@ CAY-2414 Modeler: new icon design CAY-2415 Transaction isolation and propagation support CAY-2416 Change TreeMap for HashMap to store data in Cayenne model classes CAY-2422 Modeler: Open driver setup window on driver load error +CAY-2424 Modeler: Migrate DB error query is not skipped, further excecution is not possible Bug Fixes: diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java index 29b6f5b554..21bcd144f8 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/token/db/CreateTableToDb.java @@ -50,14 +50,15 @@ public List createSql(DbAdapter adapter) { } @Override - public void execute(MergerContext mergerContext) { + public void execute(final MergerContext mergerContext) { try { - DataNode node = mergerContext.getDataNode(); - DbAdapter adapter = node.getAdapter(); - if(needAutoPkSupport()) { + final DataNode node = mergerContext.getDataNode(); + final DbAdapter adapter = node.getAdapter(); + if (needAutoPkSupport()) { adapter.getPkGenerator().createAutoPk( node, - Collections.singletonList(getEntity())); + Collections.singletonList(getEntity()), + mergerContext.getDataMap().getDefaultCatalog()); } executeSql(mergerContext, adapter.createTable(getEntity())); } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java index 329caed6fa..c02eda0e5e 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcPkGenerator.java @@ -73,22 +73,26 @@ public JdbcAdapter getAdapter() { return this.adapter; } - public void createAutoPk(DataNode node, List dbEntities) throws Exception { + public void createAutoPk(final DataNode node, final List dbEntities) throws Exception { + createAutoPk(node, dbEntities, null); + } + + public void createAutoPk(final DataNode node, final List dbEntities, final String catalog) throws Exception { // check if a table exists // create AUTO_PK_SUPPORT table if (!autoPkTableExists(node)) { - runUpdate(node, pkTableCreateString()); + runUpdate(node, pkTableCreateString(), catalog); } // delete any existing pk entries if (!dbEntities.isEmpty()) { - runUpdate(node, pkDeleteString(dbEntities)); + runUpdate(node, pkDeleteString(dbEntities), catalog); } // insert all needed entries - for (DbEntity ent : dbEntities) { - runUpdate(node, pkCreateString(ent.getName())); + for (final DbEntity ent : dbEntities) { + runUpdate(node, pkCreateString(ent.getName()), catalog); } } @@ -175,15 +179,29 @@ protected boolean autoPkTableExists(DataNode node) throws SQLException { * * @throws SQLException in case of query failure. */ - public int runUpdate(DataNode node, String sql) throws SQLException { + public int runUpdate(final DataNode node, final String sql) throws SQLException { + return runUpdate(node, sql, null); + } + + + /** + * Runs JDBC update over a Connection obtained from DataNode with preferred catalog name. Returns a + * number of objects returned from update. + * + * @throws SQLException + * in case of query failure. + */ + public int runUpdate(final DataNode node, final String sql, final String catalog) throws SQLException { adapter.getJdbcEventLogger().log(sql); - try (Connection con = node.getDataSource().getConnection()) { - try (Statement upd = con.createStatement()) { - return upd.executeUpdate(sql); - } - } - } + try (Connection con = node.getDataSource().getConnection()) { + if (catalog != null) { + con.setCatalog(catalog); + }try (Statement upd = con.createStatement()) { + return upd.executeUpdate(sql); + } + } + } /** * Generates a unique and non-repeating primary key for specified dbEntity. diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/PkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/PkGenerator.java index 0d625f0d02..dbbd819817 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/dba/PkGenerator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/PkGenerator.java @@ -38,8 +38,19 @@ public interface PkGenerator { * @param dbEntities a list of entities that require primary key auto-generation * support */ + @Deprecated void createAutoPk(DataNode node, List dbEntities) throws Exception; + /** + * Generates necessary database objects to provide automatic primary key support for specified catalog. + * + * @param node node that provides access to a DataSource. + * @param dbEntities a list of entities that require primary key auto-generation + * support + * @param catalog catalog name + */ + void createAutoPk(DataNode node, List dbEntities, String catalog) throws Exception; + /** * Returns a list of SQL strings needed to generates database objects to provide * automatic primary support for the list of entities. No actual database operations diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java index e7bbddead5..2f82fdc514 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/frontbase/FrontBasePkGenerator.java @@ -61,7 +61,7 @@ public int getPkCacheSize() { } @Override - public void createAutoPk(DataNode node, List dbEntities) throws Exception { + public void createAutoPk(final DataNode node, final List dbEntities, final String catalog) throws Exception { // For each entity (re)set the unique counter for (DbEntity entity : dbEntities) { runUpdate(node, pkCreateString(entity.getName())); diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java index 53e3bc68bb..07b4b601c3 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/openbase/OpenBasePkGenerator.java @@ -133,7 +133,7 @@ protected String newIDString(DbEntity ent) { } @Override - public void createAutoPk(DataNode node, List dbEntities) throws Exception { + public void createAutoPk(final DataNode node, final List dbEntities, final String catalog) throws Exception { // looks like generating a PK on top of an existing one does not // result in errors... diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java index 0e2b8634ee..69ab417f1a 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OraclePkGenerator.java @@ -67,7 +67,7 @@ protected OraclePkGenerator(JdbcAdapter adapter) { private static final String _SEQUENCE_PREFIX = "pk_"; @Override - public void createAutoPk(DataNode node, List dbEntities) throws Exception { + public void createAutoPk(final DataNode node, final List dbEntities, final String catalog) throws Exception { List sequences = getExistingSequences(node); // create needed sequences for (DbEntity dbEntity : dbEntities) { diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java index 0b246538ad..f872c5dd19 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sybase/SybasePkGenerator.java @@ -98,8 +98,8 @@ protected String pkTableCreateString() { * node that provides access to a DataSource. */ @Override - public void createAutoPk(DataNode node, List dbEntities) throws Exception { - super.createAutoPk(node, dbEntities); + public void createAutoPk(DataNode node, List dbEntities, String catalog) throws Exception { + super.createAutoPk(node, dbEntities, catalog); super.runUpdate(node, safePkProcDrop()); super.runUpdate(node, unsafePkProcCreate()); } diff --git a/cayenne-server/src/test/java/org/apache/cayenne/dba/JdbcPkGeneratorIT.java b/cayenne-server/src/test/java/org/apache/cayenne/dba/JdbcPkGeneratorIT.java index 25774df4dc..1e6733e4da 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/dba/JdbcPkGeneratorIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/dba/JdbcPkGeneratorIT.java @@ -85,7 +85,7 @@ public void testLongPk() throws Exception { !DerbyPkGenerator.class.equals(adapter.getPkGenerator().getClass())) { // AUTO_PK_SUPPORT doesn't allow dropping PK support for a single entity pkGenerator.dropAutoPk(node, Collections.singletonList(artistEntity)); } - pkGenerator.createAutoPk(node, Collections.singletonList(artistEntity)); + pkGenerator.createAutoPk(node, Collections.singletonList(artistEntity), null); pkGenerator.reset(); Object pk = pkGenerator.generatePk(node, pkAttribute); diff --git a/cayenne-server/src/test/java/org/apache/cayenne/dba/PkGeneratorIT.java b/cayenne-server/src/test/java/org/apache/cayenne/dba/PkGeneratorIT.java index 4a2ea0e7bd..efd1162bf9 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/dba/PkGeneratorIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/dba/PkGeneratorIT.java @@ -55,7 +55,7 @@ public void setUp() throws Exception { List list = new ArrayList(); list.add(paintingEntity); - pkGenerator.createAutoPk(node, list); + pkGenerator.createAutoPk(node, list, null); pkGenerator.reset(); } diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java index 1d6ae86374..87b1eef377 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/SchemaBuilder.java @@ -374,7 +374,7 @@ private void dropPKSupport(DataNode node, DataMap map) throws Exception { private void createPKSupport(DataNode node, DataMap map) throws Exception { List filteredEntities = dbEntitiesInInsertOrder(node, map); - node.getAdapter().getPkGenerator().createAutoPk(node, filteredEntities); + node.getAdapter().getPkGenerator().createAutoPk(node, filteredEntities, null); } private void createSchema(DataNode node, DataMap map) throws Exception {