From 569c348d22c24d3f7a51a57142b8de6d7a2a86e9 Mon Sep 17 00:00:00 2001 From: Axel Fontaine Date: Sat, 17 Feb 2018 20:50:17 +0100 Subject: [PATCH] Simplified nullType logic --- CONTRIBUTING.md | 6 +-- .../core/internal/database/Connection.java | 7 ++++ .../core/internal/database/Database.java | 39 ++++++++++--------- .../internal/database/DatabaseFactory.java | 15 ++++++- .../cockroachdb/CockroachDBConnection.java | 5 ++- .../cockroachdb/CockroachDBDatabase.java | 15 ++++--- .../internal/database/db2/DB2Connection.java | 5 ++- .../internal/database/db2/DB2Database.java | 11 +++--- .../database/derby/DerbyConnection.java | 5 ++- .../database/derby/DerbyDatabase.java | 11 +++--- .../internal/database/h2/H2Connection.java | 5 ++- .../core/internal/database/h2/H2Database.java | 12 +++--- .../database/hsqldb/HSQLDBConnection.java | 5 ++- .../database/hsqldb/HSQLDBDatabase.java | 9 ++--- .../database/mysql/MySQLConnection.java | 5 ++- .../database/mysql/MySQLDatabase.java | 11 +++--- .../database/oracle/OracleConnection.java | 5 ++- .../database/oracle/OracleDatabase.java | 18 ++++----- .../postgresql/PostgreSQLConnection.java | 38 ++++++++++++++---- .../postgresql/PostgreSQLDatabase.java | 11 +++--- .../database/redshift/RedshiftConnection.java | 7 ++-- .../database/redshift/RedshiftDatabase.java | 7 ++-- .../database/saphana/SAPHANAConnection.java | 6 +-- .../database/saphana/SAPHANADatabase.java | 7 ++-- .../database/sqlite/SQLiteConnection.java | 10 ++--- .../database/sqlite/SQLiteDatabase.java | 10 ++--- .../sqlserver/SQLServerConnection.java | 5 ++- .../database/sqlserver/SQLServerDatabase.java | 13 +++---- .../sybasease/SybaseASEConnection.java | 10 ++--- .../database/sybasease/SybaseASEDatabase.java | 12 +++--- .../core/internal/util/jdbc/JdbcTemplate.java | 8 +--- 31 files changed, 183 insertions(+), 150 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f83776623c..c6f8bb70ed 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,6 +3,6 @@ Contribute So you've got an awesome idea to throw into Flyway. Great! Please keep the following in mind: -* **Use http://stackoverflow.com/questions/tagged/flyway for indirect Flyway questions that are not bugs.** -* **Contributions will not be accepted without tests or necessary documentation updates.** -* Make sure to read https://flywaydb.org/documentation/contribute/ first \ No newline at end of file +* **Use http://stackoverflow.com/questions/tagged/flyway for Flyway questions that are not bugs.** +* **Contributions must include the necessary documentation updates.** +* **Make sure to read https://flywaydb.org/documentation/contribute/ first** \ No newline at end of file diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/Connection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/Connection.java index 50ba4cf999..fa559c67a0 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/Connection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/Connection.java @@ -163,9 +163,16 @@ public JdbcTemplate getJdbcTemplate() { @Override public void close() { + restoreOriginalState(); JdbcUtils.closeConnection(jdbcConnection); } + /** + * Restores this connection to its original state. + */ + protected void restoreOriginalState() { + } + public java.sql.Connection getJdbcConnection() { return jdbcConnection; } diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/Database.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/Database.java index 16da6bf77b..40b0ddbe93 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/Database.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/Database.java @@ -48,10 +48,15 @@ public abstract class Database implements Closeable { */ protected final DatabaseMetaData jdbcMetaData; + /** + * The main JDBC connection to use. + */ + private final java.sql.Connection mainJdbcConnection; + /** * The main connection to use. */ - protected final C mainConnection; + protected C mainConnection; /** * The connection to use for migrations. @@ -62,11 +67,6 @@ public abstract class Database implements Closeable { - /** - * The type to assign to a null value. - */ - private final int nullType; - /** * The major version of the database. */ @@ -82,25 +82,19 @@ public abstract class Database implements Closeable { * * @param configuration The Flyway configuration. * @param connection The main connection to use. - * @param nullType The type to assign to a null value. */ - public Database(FlywayConfiguration configuration, java.sql.Connection connection, int nullType + public Database(FlywayConfiguration configuration, java.sql.Connection connection ) { this.configuration = configuration; + this.mainJdbcConnection = connection; try { this.jdbcMetaData = connection.getMetaData(); } catch (SQLException e) { throw new FlywaySqlException("Unable to get metadata for connection", e); } - this.mainConnection = getConnection(connection, nullType - - - - ); - this.nullType = nullType; @@ -108,17 +102,15 @@ public Database(FlywayConfiguration configuration, java.sql.Connection connectio Pair majorMinor = determineMajorAndMinorVersion(); majorVersion = majorMinor.getLeft(); minorVersion = majorMinor.getRight(); - ensureSupported(); } /** * Retrieves a Flyway Connection for this JDBC connection. * * @param connection The JDBC connection to wrap. - * @param nullType The JDBC type to assign to a null value. * @return The Flyway Connection. */ - protected abstract C getConnection(java.sql.Connection connection, int nullType + protected abstract C getConnection(java.sql.Connection connection @@ -284,6 +276,13 @@ public DatabaseMetaData getJdbcMetaData() { * @return The main connection, used to manipulate the schema history. */ public final C getMainConnection() { + if (mainConnection == null) { + this.mainConnection = getConnection(mainJdbcConnection + + + + ); + } return mainConnection; } @@ -294,7 +293,7 @@ public final C getMigrationConnection() { if (migrationConnection == null) { this.migrationConnection = useSingleConnection() ? mainConnection - : getConnection(JdbcUtils.openConnection(configuration.getDataSource()), nullType + : getConnection(JdbcUtils.openConnection(configuration.getDataSource()) @@ -366,6 +365,8 @@ public void close() { if (!useSingleConnection() && migrationConnection != null) { migrationConnection.close(); } - mainConnection.close(); + if (mainConnection != null) { + mainConnection.close(); + } } } \ No newline at end of file diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/DatabaseFactory.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/DatabaseFactory.java index 49882b7595..ee615e3604 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/DatabaseFactory.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/DatabaseFactory.java @@ -72,6 +72,20 @@ public static Database createDatabase(FlywayConfiguration configuration, boolean LOG.info("Database: " + getJdbcUrl(connection) + " (" + databaseProductName + ")"); } + Database database = createDatabase(configuration, connection, databaseProductName + + + + ); + database.ensureSupported(); + return database; + } + + private static Database createDatabase(FlywayConfiguration configuration, Connection connection, String databaseProductName + + + + ) { if (databaseProductName.startsWith("Apache Derby")) { return new DerbyDatabase(configuration, connection @@ -175,7 +189,6 @@ public static Database createDatabase(FlywayConfiguration configuration, boolean ); } - throw new FlywayException("Unsupported Database: " + databaseProductName); } diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/cockroachdb/CockroachDBConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/cockroachdb/CockroachDBConnection.java index 8535ac48c8..913ebd5456 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/cockroachdb/CockroachDBConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/cockroachdb/CockroachDBConnection.java @@ -22,18 +22,19 @@ import org.flywaydb.core.internal.util.StringUtils; import java.sql.SQLException; +import java.sql.Types; /** * CockroachDB connection. */ public class CockroachDBConnection extends Connection { CockroachDBConnection(FlywayConfiguration configuration, CockroachDBDatabase database, - java.sql.Connection connection, int nullType + java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.NULL diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/cockroachdb/CockroachDBDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/cockroachdb/CockroachDBDatabase.java index 92f019dbea..78e17978e8 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/cockroachdb/CockroachDBDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/cockroachdb/CockroachDBDatabase.java @@ -28,12 +28,11 @@ import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * CockroachDB database. */ -public class CockroachDBDatabase extends Database { +public class CockroachDBDatabase extends Database { /** * Checks whether this connection is pointing at a CockroachDB instance. * @@ -59,7 +58,7 @@ public CockroachDBDatabase(FlywayConfiguration configuration, Connection connect ) { - super(configuration, connection, Types.NULL + super(configuration, connection @@ -67,12 +66,12 @@ public CockroachDBDatabase(FlywayConfiguration configuration, Connection connect } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected CockroachDBConnection getConnection(Connection connection ) { - return new CockroachDBConnection(configuration, this, connection, nullType + return new CockroachDBConnection(configuration, this, connection @@ -107,9 +106,9 @@ protected SqlScript doCreateSqlScript(Resource sqlScriptResource, String sqlScri protected Pair determineMajorAndMinorVersion() { String version; try { - version = mainConnection.getJdbcTemplate().queryForString("SELECT value FROM crdb_internal.node_build_info where field='Version'"); + version = getMainConnection().getJdbcTemplate().queryForString("SELECT value FROM crdb_internal.node_build_info where field='Version'"); if (version == null) { - version = mainConnection.getJdbcTemplate().queryForString("SELECT value FROM crdb_internal.node_build_info where field='Tag'"); + version = getMainConnection().getJdbcTemplate().queryForString("SELECT value FROM crdb_internal.node_build_info where field='Tag'"); } } catch (SQLException e) { throw new FlywaySqlException("Unable to determine CockroachDB version", e); @@ -127,7 +126,7 @@ public String getDbName() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("(SELECT * FROM [SHOW SESSION_USER])"); + return getMainConnection().getJdbcTemplate().queryForString("(SELECT * FROM [SHOW SESSION_USER])"); } public boolean supportsDdlTransactions() { diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/db2/DB2Connection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/db2/DB2Connection.java index 2e7add172a..76edae87bc 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/db2/DB2Connection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/db2/DB2Connection.java @@ -20,17 +20,18 @@ import org.flywaydb.core.internal.database.Schema; import java.sql.SQLException; +import java.sql.Types; /** * DB2 connection. */ public class DB2Connection extends Connection { - DB2Connection(FlywayConfiguration configuration, DB2Database database, java.sql.Connection connection, int nullType + DB2Connection(FlywayConfiguration configuration, DB2Database database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/db2/DB2Database.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/db2/DB2Database.java index ce734bbd17..e0323f2028 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/db2/DB2Database.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/db2/DB2Database.java @@ -24,12 +24,11 @@ import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * DB2 database. */ -public class DB2Database extends Database { +public class DB2Database extends Database { /** * Creates a new instance. * @@ -41,7 +40,7 @@ public DB2Database(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -49,12 +48,12 @@ public DB2Database(FlywayConfiguration configuration, Connection connection } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected DB2Connection getConnection(Connection connection ) { - return new DB2Connection(configuration, this, connection, nullType + return new DB2Connection(configuration, this, connection @@ -124,7 +123,7 @@ public String getDbName() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("select CURRENT_USER from sysibm.sysdummy1"); + return getMainConnection().getJdbcTemplate().queryForString("select CURRENT_USER from sysibm.sysdummy1"); } @Override diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/derby/DerbyConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/derby/DerbyConnection.java index a842beeeec..cbe109801b 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/derby/DerbyConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/derby/DerbyConnection.java @@ -20,17 +20,18 @@ import org.flywaydb.core.internal.database.Schema; import java.sql.SQLException; +import java.sql.Types; /** * Derby connection. */ public class DerbyConnection extends Connection { - DerbyConnection(FlywayConfiguration configuration, DerbyDatabase database, java.sql.Connection connection, int nullType + DerbyConnection(FlywayConfiguration configuration, DerbyDatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/derby/DerbyDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/derby/DerbyDatabase.java index 92631b440e..6af017e290 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/derby/DerbyDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/derby/DerbyDatabase.java @@ -24,12 +24,11 @@ import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * Derby database. */ -public class DerbyDatabase extends Database { +public class DerbyDatabase extends Database { /** * Creates a new instance. * @@ -41,7 +40,7 @@ public DerbyDatabase(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -49,12 +48,12 @@ public DerbyDatabase(FlywayConfiguration configuration, Connection connection } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected DerbyConnection getConnection(Connection connection ) { - return new DerbyConnection(configuration, this, connection, nullType + return new DerbyConnection(configuration, this, connection @@ -90,7 +89,7 @@ public String getDbName() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("SELECT CURRENT_USER FROM SYSIBM.SYSDUMMY1"); + return getMainConnection().getJdbcTemplate().queryForString("SELECT CURRENT_USER FROM SYSIBM.SYSDUMMY1"); } @Override diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/h2/H2Connection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/h2/H2Connection.java index 1a49b6a07a..1deeec63e2 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/h2/H2Connection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/h2/H2Connection.java @@ -20,17 +20,18 @@ import org.flywaydb.core.internal.database.Schema; import java.sql.SQLException; +import java.sql.Types; /** * H2 connection. */ public class H2Connection extends Connection { - H2Connection(FlywayConfiguration configuration, H2Database database, java.sql.Connection connection, int nullType + H2Connection(FlywayConfiguration configuration, H2Database database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/h2/H2Database.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/h2/H2Database.java index 8f02a1e170..60e32dd5db 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/h2/H2Database.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/h2/H2Database.java @@ -18,19 +18,17 @@ import org.flywaydb.core.api.configuration.FlywayConfiguration; import org.flywaydb.core.api.errorhandler.ErrorHandler; import org.flywaydb.core.internal.database.Database; -import org.flywaydb.core.internal.database.ExecutableSqlScript; import org.flywaydb.core.internal.database.SqlScript; import org.flywaydb.core.internal.exception.FlywayDbUpgradeRequiredException; import org.flywaydb.core.internal.util.scanner.Resource; import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * H2 database. */ -public class H2Database extends Database { +public class H2Database extends Database { /** * Creates a new instance. * @@ -42,7 +40,7 @@ public H2Database(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -50,12 +48,12 @@ public H2Database(FlywayConfiguration configuration, Connection connection } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected H2Connection getConnection(Connection connection ) { - return new H2Connection(configuration, this, connection, nullType + return new H2Connection(configuration, this, connection @@ -91,7 +89,7 @@ public String getDbName() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("SELECT USER()"); + return getMainConnection().getJdbcTemplate().queryForString("SELECT USER()"); } @Override diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/hsqldb/HSQLDBConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/hsqldb/HSQLDBConnection.java index e24c058a4a..1b201009d0 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/hsqldb/HSQLDBConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/hsqldb/HSQLDBConnection.java @@ -22,17 +22,18 @@ import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Types; /** * HSQLDB connection. */ public class HSQLDBConnection extends Connection { - HSQLDBConnection(FlywayConfiguration configuration, HSQLDBDatabase database, java.sql.Connection connection, int nullType + HSQLDBConnection(FlywayConfiguration configuration, HSQLDBDatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/hsqldb/HSQLDBDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/hsqldb/HSQLDBDatabase.java index 934b7f613d..559ce3891e 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/hsqldb/HSQLDBDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/hsqldb/HSQLDBDatabase.java @@ -23,12 +23,11 @@ import org.flywaydb.core.internal.util.scanner.Resource; import java.sql.Connection; -import java.sql.Types; /** * HSQLDB database. */ -public class HSQLDBDatabase extends Database { +public class HSQLDBDatabase extends Database { /** * Creates a new instance. * @@ -40,7 +39,7 @@ public HSQLDBDatabase(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -48,12 +47,12 @@ public HSQLDBDatabase(FlywayConfiguration configuration, Connection connection } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected HSQLDBConnection getConnection(Connection connection ) { - return new HSQLDBConnection(configuration, this, connection, nullType + return new HSQLDBConnection(configuration, this, connection diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/mysql/MySQLConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/mysql/MySQLConnection.java index ca2fe1d759..47b9afc7af 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/mysql/MySQLConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/mysql/MySQLConnection.java @@ -24,6 +24,7 @@ import org.flywaydb.core.internal.util.StringUtils; import java.sql.SQLException; +import java.sql.Types; import java.util.UUID; import java.util.concurrent.Callable; @@ -33,12 +34,12 @@ public class MySQLConnection extends Connection { private static final Log LOG = LogFactory.getLog(MySQLConnection.class); - MySQLConnection(FlywayConfiguration configuration, MySQLDatabase database, java.sql.Connection connection, int nullType + MySQLConnection(FlywayConfiguration configuration, MySQLDatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/mysql/MySQLDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/mysql/MySQLDatabase.java index 07ceeb769a..5969f902b9 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/mysql/MySQLDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/mysql/MySQLDatabase.java @@ -25,12 +25,11 @@ import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * MySQL database. */ -public class MySQLDatabase extends Database { +public class MySQLDatabase extends Database { /** * Creates a new instance. * @@ -42,7 +41,7 @@ public MySQLDatabase(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -50,12 +49,12 @@ public MySQLDatabase(FlywayConfiguration configuration, Connection connection } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected MySQLConnection getConnection(Connection connection ) { - return new MySQLConnection(configuration, this, connection, nullType + return new MySQLConnection(configuration, this, connection @@ -117,7 +116,7 @@ public String getDbName() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("SELECT SUBSTRING_INDEX(USER(),'@',1)"); + return getMainConnection().getJdbcTemplate().queryForString("SELECT SUBSTRING_INDEX(USER(),'@',1)"); } @Override diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleConnection.java index 1e5300b8f3..c054825fcc 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleConnection.java @@ -20,17 +20,18 @@ import org.flywaydb.core.internal.database.Schema; import java.sql.SQLException; +import java.sql.Types; /** * Oracle connection. */ public class OracleConnection extends Connection { - OracleConnection(FlywayConfiguration configuration, OracleDatabase database, java.sql.Connection connection, int nullType + OracleConnection(FlywayConfiguration configuration, OracleDatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleDatabase.java index 9ec7d50244..1d8cf2341a 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/oracle/OracleDatabase.java @@ -27,7 +27,6 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; @@ -37,7 +36,7 @@ /** * Oracle database. */ -public class OracleDatabase extends Database { +public class OracleDatabase extends Database { private static final String ORACLE_NET_TNS_ADMIN = "oracle.net.tns_admin"; /** @@ -51,7 +50,7 @@ public OracleDatabase(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -67,12 +66,12 @@ public OracleDatabase(FlywayConfiguration configuration, Connection connection } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected OracleConnection getConnection(Connection connection ) { - return new OracleConnection(configuration, this, connection, nullType + return new OracleConnection(configuration, this, connection @@ -81,7 +80,6 @@ protected org.flywaydb.core.internal.database.Connection getConnection(Connectio @Override protected final void ensureSupported() { - int majorVersion = getMajorVersion(); if (majorVersion < 10) { throw new FlywayDbUpgradeRequiredException("Oracle", "" + majorVersion, "10"); } @@ -115,7 +113,7 @@ public String getDbName() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("SELECT USER FROM DUAL"); + return getMainConnection().getJdbcTemplate().queryForString("SELECT USER FROM DUAL"); } @Override @@ -155,7 +153,7 @@ public boolean catalogIsSchema() { * @throws SQLException when the query execution failed. */ boolean queryReturnsRows(String query, String... params) throws SQLException { - return mainConnection.getJdbcTemplate().queryForBoolean("SELECT CASE WHEN EXISTS(" + query + ") THEN 1 ELSE 0 END FROM DUAL", params); + return getMainConnection().getJdbcTemplate().queryForBoolean("SELECT CASE WHEN EXISTS(" + query + ") THEN 1 ELSE 0 END FROM DUAL", params); } /** @@ -214,7 +212,7 @@ String dbaOrAll(String baseName) throws SQLException { * @throws SQLException if retrieving of options failed. */ private Set getAvailableOptions() throws SQLException { - return new HashSet<>(mainConnection.getJdbcTemplate() + return new HashSet<>(getMainConnection().getJdbcTemplate() .queryForStringList("SELECT PARAMETER FROM V$OPTION WHERE VALUE = 'TRUE'")); } @@ -304,7 +302,7 @@ Set getSystemSchemas() throws SQLException { - result.addAll(mainConnection.getJdbcTemplate().queryForStringList("SELECT USERNAME FROM ALL_USERS " + + result.addAll(getMainConnection().getJdbcTemplate().queryForStringList("SELECT USERNAME FROM ALL_USERS " + "WHERE REGEXP_LIKE(USERNAME, '^(APEX|FLOWS)_\\d+$')" + diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/postgresql/PostgreSQLConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/postgresql/PostgreSQLConnection.java index 62b582bcc6..da0010ee66 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/postgresql/PostgreSQLConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/postgresql/PostgreSQLConnection.java @@ -23,22 +23,48 @@ import org.flywaydb.core.internal.util.StringUtils; import java.sql.SQLException; +import java.sql.Types; import java.util.concurrent.Callable; /** * PostgreSQL connection. */ public class PostgreSQLConnection extends Connection { - PostgreSQLConnection(FlywayConfiguration configuration, PostgreSQLDatabase database, java.sql.Connection connection, int nullType + private final String originalSearchPath; + + PostgreSQLConnection(FlywayConfiguration configuration, PostgreSQLDatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.NULL ); + + this.originalSearchPath = getSearchPath(); + } + + String getSearchPath() { + try { + return jdbcTemplate.queryForString("SHOW search_path"); + } catch (SQLException e) { + throw new FlywaySqlException("Unable to read search_path", e); + } + } + + private void setSearchPath(String searchPath) { + try { + jdbcTemplate.execute("SELECT set_config('search_path', ?, false)", searchPath); + } catch (SQLException e) { + throw new FlywaySqlException("Unable to set search_path to " + searchPath, e); + } + } + + @Override + protected void restoreOriginalState() { + setSearchPath(originalSearchPath); } @Override @@ -68,7 +94,7 @@ static String getFirstSchemaFromSearchPath(String searchPath) { @Override protected String doGetCurrentSchemaName() throws SQLException { - return jdbcTemplate.queryForString("SHOW search_path"); + return getSearchPath(); } @Override @@ -93,11 +119,7 @@ public void changeCurrentSchemaTo(Schema schema) { @Override public void doChangeCurrentSchemaTo(String schema) throws SQLException { - if (!StringUtils.hasLength(schema)) { - jdbcTemplate.execute("SELECT set_config('search_path', '', false)"); - return; - } - jdbcTemplate.execute("SET search_path = " + schema); + setSearchPath(schema); } @Override diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/postgresql/PostgreSQLDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/postgresql/PostgreSQLDatabase.java index ab652011dd..50d9a0df64 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/postgresql/PostgreSQLDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/postgresql/PostgreSQLDatabase.java @@ -25,12 +25,11 @@ import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * PostgreSQL database. */ -public class PostgreSQLDatabase extends Database { +public class PostgreSQLDatabase extends Database { /** * Creates a new instance. * @@ -42,7 +41,7 @@ public PostgreSQLDatabase(FlywayConfiguration configuration, Connection connecti ) { - super(configuration, connection, Types.NULL + super(configuration, connection @@ -50,12 +49,12 @@ public PostgreSQLDatabase(FlywayConfiguration configuration, Connection connecti } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected PostgreSQLConnection getConnection(Connection connection ) { - return new PostgreSQLConnection(configuration, this, connection, nullType + return new PostgreSQLConnection(configuration, this, connection @@ -99,7 +98,7 @@ public String getDbName() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("SELECT current_user"); + return getMainConnection().getJdbcTemplate().queryForString("SELECT current_user"); } @Override diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/redshift/RedshiftConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/redshift/RedshiftConnection.java index a35a64a27c..5aff3d12c9 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/redshift/RedshiftConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/redshift/RedshiftConnection.java @@ -17,22 +17,23 @@ import org.flywaydb.core.api.configuration.FlywayConfiguration; import org.flywaydb.core.internal.database.Connection; -import org.flywaydb.core.internal.exception.FlywaySqlException; import org.flywaydb.core.internal.database.Schema; +import org.flywaydb.core.internal.exception.FlywaySqlException; import org.flywaydb.core.internal.util.StringUtils; import java.sql.SQLException; +import java.sql.Types; /** * Redshift connection. */ public class RedshiftConnection extends Connection { - RedshiftConnection(FlywayConfiguration configuration, RedshiftDatabase database, java.sql.Connection connection, int nullType + RedshiftConnection(FlywayConfiguration configuration, RedshiftDatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/redshift/RedshiftDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/redshift/RedshiftDatabase.java index 1d1bc1f45b..8e4796a534 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/redshift/RedshiftDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/redshift/RedshiftDatabase.java @@ -25,7 +25,6 @@ import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * Redshift database. @@ -56,7 +55,7 @@ public RedshiftDatabase(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -64,12 +63,12 @@ public RedshiftDatabase(FlywayConfiguration configuration, Connection connection } @Override - protected RedshiftConnection getConnection(Connection connection, int nullType + protected RedshiftConnection getConnection(Connection connection ) { - return new RedshiftConnection(configuration, this, connection, nullType + return new RedshiftConnection(configuration, this, connection diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/saphana/SAPHANAConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/saphana/SAPHANAConnection.java index ed9e469bc7..94bffaa98e 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/saphana/SAPHANAConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/saphana/SAPHANAConnection.java @@ -20,15 +20,15 @@ import org.flywaydb.core.internal.database.Schema; import java.sql.SQLException; +import java.sql.Types; public class SAPHANAConnection extends Connection { - SAPHANAConnection(FlywayConfiguration configuration, SAPHANADatabase database, java.sql.Connection connection, - int nullType + SAPHANAConnection(FlywayConfiguration configuration, SAPHANADatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/saphana/SAPHANADatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/saphana/SAPHANADatabase.java index ba59b04f9f..57ee476054 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/saphana/SAPHANADatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/saphana/SAPHANADatabase.java @@ -22,7 +22,6 @@ import org.flywaydb.core.internal.util.scanner.Resource; import java.sql.Connection; -import java.sql.Types; /** * SAP HANA database. @@ -38,7 +37,7 @@ public SAPHANADatabase(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -46,12 +45,12 @@ public SAPHANADatabase(FlywayConfiguration configuration, Connection connection } @Override - protected SAPHANAConnection getConnection(Connection connection, int nullType + protected SAPHANAConnection getConnection(Connection connection ) { - return new SAPHANAConnection(configuration, this, connection, nullType + return new SAPHANAConnection(configuration, this, connection diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlite/SQLiteConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlite/SQLiteConnection.java index e0f8b076df..72935f94b1 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlite/SQLiteConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlite/SQLiteConnection.java @@ -21,7 +21,7 @@ import org.flywaydb.core.internal.database.Connection; import org.flywaydb.core.internal.database.Schema; -import java.sql.SQLException; +import java.sql.Types; /** * SQLite connection. @@ -34,12 +34,12 @@ public class SQLiteConnection extends Connection { */ private static boolean schemaMessagePrinted; - SQLiteConnection(FlywayConfiguration configuration, SQLiteDatabase database, java.sql.Connection connection, int nullType + SQLiteConnection(FlywayConfiguration configuration, SQLiteDatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR @@ -48,7 +48,7 @@ public class SQLiteConnection extends Connection { @Override - public void doChangeCurrentSchemaTo(String schema) throws SQLException { + public void doChangeCurrentSchemaTo(String schema) { if (!schemaMessagePrinted) { LOG.info("SQLite does not support setting the schema. Default schema NOT changed to " + schema); schemaMessagePrinted = true; @@ -61,7 +61,7 @@ public Schema getSchema(String name) { } @Override - protected String doGetCurrentSchemaName() throws SQLException { + protected String doGetCurrentSchemaName() { return "main"; } } \ No newline at end of file diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlite/SQLiteDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlite/SQLiteDatabase.java index acaa5bb169..283603bdc5 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlite/SQLiteDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlite/SQLiteDatabase.java @@ -18,18 +18,16 @@ import org.flywaydb.core.api.configuration.FlywayConfiguration; import org.flywaydb.core.api.errorhandler.ErrorHandler; import org.flywaydb.core.internal.database.Database; -import org.flywaydb.core.internal.database.ExecutableSqlScript; import org.flywaydb.core.internal.database.SqlScript; import org.flywaydb.core.internal.exception.FlywayDbUpgradeRequiredException; import org.flywaydb.core.internal.util.scanner.Resource; import java.sql.Connection; -import java.sql.Types; /** * SQLite database. */ -public class SQLiteDatabase extends Database { +public class SQLiteDatabase extends Database { /** * Creates a new instance. * @@ -41,7 +39,7 @@ public SQLiteDatabase(FlywayConfiguration configuration, Connection connection ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection @@ -49,12 +47,12 @@ public SQLiteDatabase(FlywayConfiguration configuration, Connection connection } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected SQLiteConnection getConnection(Connection connection ) { - return new SQLiteConnection(configuration, this, connection, nullType + return new SQLiteConnection(configuration, this, connection diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlserver/SQLServerConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlserver/SQLServerConnection.java index 67266ed714..a6ee7ed9be 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlserver/SQLServerConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlserver/SQLServerConnection.java @@ -24,6 +24,7 @@ import org.flywaydb.core.internal.exception.FlywaySqlException; import java.sql.SQLException; +import java.sql.Types; import java.util.concurrent.Callable; /** @@ -40,12 +41,12 @@ public class SQLServerConnection extends Connection { */ private static boolean schemaMessagePrinted; - SQLServerConnection(FlywayConfiguration configuration, SQLServerDatabase database, java.sql.Connection connection, int nullType + SQLServerConnection(FlywayConfiguration configuration, SQLServerDatabase database, java.sql.Connection connection ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, Types.VARCHAR diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlserver/SQLServerDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlserver/SQLServerDatabase.java index f02891c002..14504b8319 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlserver/SQLServerDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sqlserver/SQLServerDatabase.java @@ -27,12 +27,11 @@ import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * SQL Server database. */ -public class SQLServerDatabase extends Database { +public class SQLServerDatabase extends Database { private final boolean azure; /** @@ -46,13 +45,13 @@ public SQLServerDatabase(FlywayConfiguration configuration, Connection connectio ) { - super(configuration, connection, Types.VARCHAR + super(configuration, connection ); try { - azure = "SQL Azure".equals(mainConnection.getJdbcTemplate().queryForString( + azure = "SQL Azure".equals(getMainConnection().getJdbcTemplate().queryForString( "SELECT CAST(SERVERPROPERTY('edition') AS VARCHAR)")); } catch (SQLException e) { throw new FlywaySqlException("Unable to determine database edition", e); @@ -60,12 +59,12 @@ public SQLServerDatabase(FlywayConfiguration configuration, Connection connectio } @Override - protected org.flywaydb.core.internal.database.Connection getConnection(Connection connection, int nullType + protected SQLServerConnection getConnection(Connection connection ) { - return new SQLServerConnection(configuration, this, connection, nullType + return new SQLServerConnection(configuration, this, connection @@ -145,7 +144,7 @@ public Delimiter getDefaultDelimiter() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("SELECT SUSER_SNAME()"); + return getMainConnection().getJdbcTemplate().queryForString("SELECT SUSER_SNAME()"); } @Override diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEConnection.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEConnection.java index 22d316c405..dc36a5e4aa 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEConnection.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEConnection.java @@ -21,7 +21,7 @@ import org.flywaydb.core.internal.database.Connection; import org.flywaydb.core.internal.database.Schema; -import java.sql.SQLException; +import java.sql.Types; /** * Sybase ASE Connection. @@ -34,12 +34,12 @@ public class SybaseASEConnection extends Connection { */ private static boolean schemaMessagePrinted; - SybaseASEConnection(FlywayConfiguration configuration, SybaseASEDatabase database, java.sql.Connection connection, int nullType + SybaseASEConnection(FlywayConfiguration configuration, SybaseASEDatabase database, java.sql.Connection connection, boolean jconnect ) { - super(configuration, database, connection, nullType + super(configuration, database, connection, jconnect ? Types.VARCHAR : Types.NULL @@ -54,12 +54,12 @@ public Schema getSchema(String name) { } @Override - protected String doGetCurrentSchemaName() throws SQLException { + protected String doGetCurrentSchemaName() { return "dbo"; } @Override - public void doChangeCurrentSchemaTo(String schema) throws SQLException { + public void doChangeCurrentSchemaTo(String schema) { if (!schemaMessagePrinted) { LOG.info("Sybase ASE does not support setting the schema for the current session. Default schema NOT changed to " + schema); schemaMessagePrinted = true; diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEDatabase.java b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEDatabase.java index 5e7cd749ee..38fdd48d09 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEDatabase.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/database/sybasease/SybaseASEDatabase.java @@ -25,12 +25,13 @@ import java.sql.Connection; import java.sql.SQLException; -import java.sql.Types; /** * Sybase ASE database. */ public class SybaseASEDatabase extends Database { + private final boolean jconnect; + /** * Creates a new Sybase ASE database. * @@ -43,20 +44,21 @@ public SybaseASEDatabase(FlywayConfiguration configuration, Connection connectio ) { - super(configuration, connection, jconnect ? Types.VARCHAR : Types.NULL + super(configuration, connection ); + this.jconnect = jconnect; } @Override - protected SybaseASEConnection getConnection(Connection connection, int nullType + protected SybaseASEConnection getConnection(Connection connection ) { - return new SybaseASEConnection(configuration, this, connection, nullType + return new SybaseASEConnection(configuration, this, connection, jconnect @@ -100,7 +102,7 @@ public String getDbName() { @Override protected String doGetCurrentUser() throws SQLException { - return mainConnection.getJdbcTemplate().queryForString("SELECT user_name()"); + return getMainConnection().getJdbcTemplate().queryForString("SELECT user_name()"); } @Override diff --git a/flyway-core/src/main/java/org/flywaydb/core/internal/util/jdbc/JdbcTemplate.java b/flyway-core/src/main/java/org/flywaydb/core/internal/util/jdbc/JdbcTemplate.java index 2e0aca55fa..931c914d46 100644 --- a/flyway-core/src/main/java/org/flywaydb/core/internal/util/jdbc/JdbcTemplate.java +++ b/flyway-core/src/main/java/org/flywaydb/core/internal/util/jdbc/JdbcTemplate.java @@ -15,9 +15,6 @@ */ package org.flywaydb.core.internal.util.jdbc; -import org.flywaydb.core.api.logging.Log; -import org.flywaydb.core.api.logging.LogFactory; - import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -35,8 +32,6 @@ * Collection of utility methods for querying the DB. Inspired by Spring's JdbcTemplate. */ public class JdbcTemplate { - private static final Log LOG = LogFactory.getLog(JdbcTemplate.class); - /** * The DB connection to use. */ @@ -51,9 +46,8 @@ public class JdbcTemplate { * Creates a new JdbcTemplate. * * @param connection The DB connection to use. - * @throws SQLException when the database metadata could not be retrieved. */ - public JdbcTemplate(Connection connection) throws SQLException { + public JdbcTemplate(Connection connection) { this(connection, Types.NULL); }