Merge branch '2.7.x' into 3.0.x

Closes gh-36758
pull/37018/head
Stephane Nicoll 1 year ago
commit f8a5aff160

@ -320,7 +320,9 @@ public enum DatabaseDriver {
* @param dataSource data source to inspect * @param dataSource data source to inspect
* @return the database driver of {@link #UNKNOWN} if not found * @return the database driver of {@link #UNKNOWN} if not found
* @since 2.6.0 * @since 2.6.0
* @deprecated since 2.7.15 for removal in 3.3.0 with no replacement
*/ */
@Deprecated(since = "2.7.15", forRemoval = true)
public static DatabaseDriver fromDataSource(DataSource dataSource) { public static DatabaseDriver fromDataSource(DataSource dataSource) {
try { try {
String productName = JdbcUtils.commonDatabaseName( String productName = JdbcUtils.commonDatabaseName(

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2021 the original author or authors. * Copyright 2012-2023 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +16,7 @@
package org.springframework.boot.jdbc.init; package org.springframework.boot.jdbc.init;
import java.sql.DatabaseMetaData;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@ -26,6 +27,7 @@ import java.util.function.Supplier;
import javax.sql.DataSource; import javax.sql.DataSource;
import org.springframework.boot.jdbc.DatabaseDriver; import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.jdbc.support.JdbcUtils;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -89,7 +91,6 @@ public class PlatformPlaceholderDatabaseDriverResolver {
* @param dataSource the DataSource from which the {@link DatabaseDriver} is derived * @param dataSource the DataSource from which the {@link DatabaseDriver} is derived
* @param values the values in which placeholders are resolved * @param values the values in which placeholders are resolved
* @return the values with their placeholders resolved * @return the values with their placeholders resolved
* @see DatabaseDriver#fromDataSource(DataSource)
*/ */
public List<String> resolveAll(DataSource dataSource, String... values) { public List<String> resolveAll(DataSource dataSource, String... values) {
Assert.notNull(dataSource, "DataSource must not be null"); Assert.notNull(dataSource, "DataSource must not be null");
@ -134,7 +135,14 @@ public class PlatformPlaceholderDatabaseDriverResolver {
} }
DatabaseDriver getDatabaseDriver(DataSource dataSource) { DatabaseDriver getDatabaseDriver(DataSource dataSource) {
return DatabaseDriver.fromDataSource(dataSource); try {
String productName = JdbcUtils.commonDatabaseName(
JdbcUtils.extractDatabaseMetaData(dataSource, DatabaseMetaData::getDatabaseProductName));
return DatabaseDriver.fromProductName(productName);
}
catch (Exception ex) {
throw new IllegalStateException("Failed to determine DatabaseDriver", ex);
}
} }
} }

@ -29,6 +29,7 @@ import org.springframework.boot.jdbc.DatabaseDriver;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.given;
import static org.mockito.BDDMockito.then;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
/** /**
@ -68,6 +69,24 @@ class PlatformPlaceholderDatabaseDriverResolverTests {
.containsExactly("schema.sql"); .containsExactly("schema.sql");
} }
@Test
void resolveAllWithDataSourceWhenValueDoesNotContainPlaceholderShouldNotInteractWithDataSource() {
DataSource dataSource = mock(DataSource.class);
new PlatformPlaceholderDatabaseDriverResolver().resolveAll(mock(DataSource.class), "schema.sql");
then(dataSource).shouldHaveNoInteractions();
}
@Test
void resolveAllWithFailingDataSourceWhenValuesContainPlaceholdersShouldThrowNestedCause() throws SQLException {
DataSource dataSource = mock(DataSource.class);
given(dataSource.getConnection()).willThrow(new IllegalStateException("Test: invalid password"));
assertThatIllegalStateException()
.isThrownBy(() -> new PlatformPlaceholderDatabaseDriverResolver().resolveAll(dataSource, "schema.sql",
"schema-@@platform@@.sql", "data-@@platform@@.sql"))
.withMessage("Failed to determine DatabaseDriver")
.withStackTraceContaining("Test: invalid password");
}
@Test @Test
void resolveAllWithDataSourceWhenValuesContainPlaceholdersShouldReturnValuesWithPlaceholdersReplaced() void resolveAllWithDataSourceWhenValuesContainPlaceholdersShouldReturnValuesWithPlaceholdersReplaced()
throws SQLException { throws SQLException {

Loading…
Cancel
Save