From 477c874ecad003704d0c18ee217e330c4a0f8cfd Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 15 Dec 2016 10:39:03 +0100 Subject: [PATCH] Improve DatabaseDriver detection based on jdbc url This commit fixes the detection of JDBC urls for DB2 AS400, Firebird and Informix. Closes gh-7651 --- .../boot/jdbc/DatabaseDriver.java | 34 +++++++++-- .../boot/jdbc/DatabaseDriverTests.java | 59 +++++++++++++++++-- 2 files changed, 84 insertions(+), 9 deletions(-) diff --git a/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java b/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java index dfcb196350..af928e48b1 100644 --- a/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java +++ b/spring-boot/src/main/java/org/springframework/boot/jdbc/DatabaseDriver.java @@ -16,6 +16,10 @@ package org.springframework.boot.jdbc; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -106,6 +110,11 @@ public enum DatabaseDriver { "org.firebirdsql.pool.FBConnectionPoolDataSource", "SELECT 1 FROM RDB$DATABASE") { + @Override + protected Collection getUrlPrefixes() { + return Collections.singleton("firebirdsql"); + } + @Override protected boolean matchProductName(String productName) { return super.matchProductName(productName) @@ -133,6 +142,11 @@ public enum DatabaseDriver { "com.ibm.as400.access.AS400JDBCXADataSource", "SELECT 1 FROM SYSIBM.SYSDUMMY1") { + @Override + protected Collection getUrlPrefixes() { + return Collections.singleton("as400"); + } + @Override protected boolean matchProductName(String productName) { return super.matchProductName(productName) @@ -149,7 +163,13 @@ public enum DatabaseDriver { * Informix. */ INFORMIX("Informix Dynamic Server", "com.informix.jdbc.IfxDriver", null, - "select count(*) from systables"); + "select count(*) from systables") { + + @Override + protected Collection getUrlPrefixes() { + return Arrays.asList("informix-sqli", "informix-direct"); + } + }; private final String productName; @@ -179,6 +199,10 @@ public enum DatabaseDriver { return this.productName != null && this.productName.equalsIgnoreCase(productName); } + protected Collection getUrlPrefixes() { + return Collections.singleton(this.name().toLowerCase()); + } + /** * Return the driver class name. * @return the class name or {@code null} @@ -213,9 +237,11 @@ public enum DatabaseDriver { Assert.isTrue(url.startsWith("jdbc"), "URL must start with 'jdbc'"); String urlWithoutPrefix = url.substring("jdbc".length()).toLowerCase(); for (DatabaseDriver driver : values()) { - String prefix = ":" + driver.name().toLowerCase() + ":"; - if (driver != UNKNOWN && urlWithoutPrefix.startsWith(prefix)) { - return driver; + for (String urlPrefix : driver.getUrlPrefixes()) { + String prefix = ":" + urlPrefix + ":"; + if (driver != UNKNOWN && urlWithoutPrefix.startsWith(prefix)) { + return driver; + } } } } diff --git a/spring-boot/src/test/java/org/springframework/boot/jdbc/DatabaseDriverTests.java b/spring-boot/src/test/java/org/springframework/boot/jdbc/DatabaseDriverTests.java index d5b109d4a5..d93113aeb1 100644 --- a/spring-boot/src/test/java/org/springframework/boot/jdbc/DatabaseDriverTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/jdbc/DatabaseDriverTests.java @@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Phillip Webb * @author Maciej Walkowiak + * @author Stephane Nicoll */ public class DatabaseDriverTests { @@ -70,25 +71,73 @@ public class DatabaseDriverTests { public void databaseProductNameLookups() throws Exception { assertThat(DatabaseDriver.fromProductName("newone")) .isEqualTo(DatabaseDriver.UNKNOWN); + assertThat(DatabaseDriver.fromProductName("Apache Derby")) + .isEqualTo(DatabaseDriver.DERBY); + assertThat(DatabaseDriver.fromProductName("H2")) + .isEqualTo(DatabaseDriver.H2); assertThat(DatabaseDriver.fromProductName("HSQL Database Engine")) .isEqualTo(DatabaseDriver.HSQLDB); + assertThat(DatabaseDriver.fromProductName("SQLite")) + .isEqualTo(DatabaseDriver.SQLITE); + assertThat(DatabaseDriver.fromProductName("MySQL")) + .isEqualTo(DatabaseDriver.MYSQL); assertThat(DatabaseDriver.fromProductName("Oracle")) .isEqualTo(DatabaseDriver.ORACLE); - assertThat(DatabaseDriver.fromProductName("Apache Derby")) - .isEqualTo(DatabaseDriver.DERBY); + assertThat(DatabaseDriver.fromProductName("PostgreSQL")) + .isEqualTo(DatabaseDriver.POSTGRESQL); + assertThat(DatabaseDriver.fromProductName("SQL SERVER")) + .isEqualTo(DatabaseDriver.SQLSERVER); assertThat(DatabaseDriver.fromProductName("DB2")).isEqualTo(DatabaseDriver.DB2); + assertThat(DatabaseDriver.fromProductName("Firebird 2.5.WI")) + .isEqualTo(DatabaseDriver.FIREBIRD); + assertThat(DatabaseDriver.fromProductName("Firebird 2.1.LI")) + .isEqualTo(DatabaseDriver.FIREBIRD); assertThat(DatabaseDriver.fromProductName("DB2/LINUXX8664")) .isEqualTo(DatabaseDriver.DB2); assertThat(DatabaseDriver.fromProductName("DB2 UDB for AS/400")) .isEqualTo(DatabaseDriver.DB2_AS400); assertThat(DatabaseDriver.fromProductName("DB3 XDB for AS/400")) .isEqualTo(DatabaseDriver.DB2_AS400); + assertThat(DatabaseDriver.fromProductName("Teradata")) + .isEqualTo(DatabaseDriver.TERADATA); assertThat(DatabaseDriver.fromProductName("Informix Dynamic Server")) .isEqualTo(DatabaseDriver.INFORMIX); - assertThat(DatabaseDriver.fromProductName("Firebird 2.5.WI")) - .isEqualTo(DatabaseDriver.FIREBIRD); - assertThat(DatabaseDriver.fromProductName("Firebird 2.1.LI")) + } + + @Test + public void databaseJdbcUrlLookups() { + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:newone://localhost")) + .isEqualTo(DatabaseDriver.UNKNOWN); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:derby:sample")) + .isEqualTo(DatabaseDriver.DERBY); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:h2:~/sample")) + .isEqualTo(DatabaseDriver.H2); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:hsqldb:hsql://localhost")) + .isEqualTo(DatabaseDriver.HSQLDB); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:sqlite:sample.db")) + .isEqualTo(DatabaseDriver.SQLITE); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:mysql://localhost:3306/sample")) + .isEqualTo(DatabaseDriver.MYSQL); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:oracle:thin:@localhost:1521:orcl")) + .isEqualTo(DatabaseDriver.ORACLE); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:postgresql://127.0.0.1:5432/sample")) + .isEqualTo(DatabaseDriver.POSTGRESQL); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:jtds:sqlserver://127.0.0.1:1433/sample")) + .isEqualTo(DatabaseDriver.JTDS); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:sqlserver://127.0.0.1:1433")) + .isEqualTo(DatabaseDriver.SQLSERVER); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:firebirdsql://localhost/sample")) .isEqualTo(DatabaseDriver.FIREBIRD); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:db2://localhost:50000/sample ")) + .isEqualTo(DatabaseDriver.DB2); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:as400://localhost")) + .isEqualTo(DatabaseDriver.DB2_AS400); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:teradata://localhost/SAMPLE")) + .isEqualTo(DatabaseDriver.TERADATA); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:informix-sqli://localhost:1533/sample")) + .isEqualTo(DatabaseDriver.INFORMIX); + assertThat(DatabaseDriver.fromJdbcUrl("jdbc:informix-direct://sample")) + .isEqualTo(DatabaseDriver.INFORMIX); } }