6 changed files with 177 additions and 59 deletions
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
/* |
||||
* Copyright 2002-2021 the original author or authors. |
||||
* |
||||
* Licensed 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 |
||||
* |
||||
* https://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.springframework.jdbc.datasource.embedded; |
||||
|
||||
import java.sql.Driver; |
||||
|
||||
import org.springframework.util.ClassUtils; |
||||
|
||||
/** |
||||
* {@link EmbeddedDatabaseConfigurer} for an H2 embedded database instance |
||||
* with auto-commit disabled. |
||||
* |
||||
* @author Sam Brannen |
||||
* @since 5.3.11 |
||||
*/ |
||||
public class AutoCommitDisabledH2EmbeddedDatabaseConfigurer extends AbstractEmbeddedDatabaseConfigurer { |
||||
|
||||
private final Class<? extends Driver> driverClass; |
||||
|
||||
|
||||
@SuppressWarnings("unchecked") |
||||
public AutoCommitDisabledH2EmbeddedDatabaseConfigurer() throws Exception { |
||||
this.driverClass = (Class<? extends Driver>) ClassUtils.forName("org.h2.Driver", |
||||
AutoCommitDisabledH2EmbeddedDatabaseConfigurer.class.getClassLoader()); |
||||
} |
||||
|
||||
@Override |
||||
public void configureConnectionProperties(ConnectionProperties properties, String databaseName) { |
||||
String url = String.format("jdbc:h2:mem:%s;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=false;AUTOCOMMIT=false", databaseName); |
||||
|
||||
properties.setDriverClass(this.driverClass); |
||||
properties.setUrl(url); |
||||
properties.setUsername("sa"); |
||||
properties.setPassword(""); |
||||
} |
||||
|
||||
} |
||||
@ -1,54 +0,0 @@
@@ -1,54 +0,0 @@
|
||||
/* |
||||
* Copyright 2002-2019 the original author or authors. |
||||
* |
||||
* Licensed 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 |
||||
* |
||||
* https://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.springframework.jdbc.datasource.init; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* @author Sam Brannen |
||||
* @since 4.0.3 |
||||
*/ |
||||
class H2DatabasePopulatorIntegrationTests extends AbstractDatabasePopulatorTests { |
||||
|
||||
@Override |
||||
protected EmbeddedDatabaseType getEmbeddedDatabaseType() { |
||||
return EmbeddedDatabaseType.H2; |
||||
} |
||||
|
||||
/** |
||||
* https://jira.spring.io/browse/SPR-15896
|
||||
* |
||||
* @since 5.0 |
||||
*/ |
||||
@Test |
||||
void scriptWithH2Alias() throws Exception { |
||||
databasePopulator.addScript(usersSchema()); |
||||
databasePopulator.addScript(resource("db-test-data-h2-alias.sql")); |
||||
// Set statement separator to double newline so that ";" is not
|
||||
// considered a statement separator within the source code of the
|
||||
// aliased function 'REVERSE'.
|
||||
databasePopulator.setSeparator("\n\n"); |
||||
DatabasePopulatorUtils.execute(databasePopulator, db); |
||||
String sql = "select REVERSE(first_name) from users where last_name='Brannen'"; |
||||
assertThat(jdbcTemplate.queryForObject(sql, String.class)).isEqualTo("maS"); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
|
||||
/* |
||||
* Copyright 2002-2021 the original author or authors. |
||||
* |
||||
* Licensed 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 |
||||
* |
||||
* https://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.springframework.jdbc.datasource.init; |
||||
|
||||
import java.sql.Connection; |
||||
import java.util.List; |
||||
|
||||
import javax.sql.DataSource; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import org.springframework.jdbc.core.JdbcTemplate; |
||||
import org.springframework.jdbc.datasource.DataSourceUtils; |
||||
import org.springframework.jdbc.datasource.embedded.AutoCommitDisabledH2EmbeddedDatabaseConfigurer; |
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabase; |
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseFactory; |
||||
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
|
||||
/** |
||||
* @author Sam Brannen |
||||
* @since 4.0.3 |
||||
*/ |
||||
class H2DatabasePopulatorTests extends AbstractDatabasePopulatorTests { |
||||
|
||||
@Override |
||||
protected EmbeddedDatabaseType getEmbeddedDatabaseType() { |
||||
return EmbeddedDatabaseType.H2; |
||||
} |
||||
|
||||
/** |
||||
* https://jira.spring.io/browse/SPR-15896
|
||||
* |
||||
* @since 5.0 |
||||
*/ |
||||
@Test |
||||
void scriptWithH2Alias() throws Exception { |
||||
databasePopulator.addScript(usersSchema()); |
||||
databasePopulator.addScript(resource("db-test-data-h2-alias.sql")); |
||||
// Set statement separator to double newline so that ";" is not
|
||||
// considered a statement separator within the source code of the
|
||||
// aliased function 'REVERSE'.
|
||||
databasePopulator.setSeparator("\n\n"); |
||||
DatabasePopulatorUtils.execute(databasePopulator, db); |
||||
String sql = "select REVERSE(first_name) from users where last_name='Brannen'"; |
||||
assertThat(jdbcTemplate.queryForObject(sql, String.class)).isEqualTo("maS"); |
||||
} |
||||
|
||||
/** |
||||
* https://github.com/spring-projects/spring-framework/issues/27008
|
||||
* |
||||
* @since 5.3.11 |
||||
*/ |
||||
@Test |
||||
void automaticallyCommitsIfAutoCommitIsDisabled() throws Exception { |
||||
EmbeddedDatabase database = null; |
||||
try { |
||||
EmbeddedDatabaseFactory databaseFactory = new EmbeddedDatabaseFactory(); |
||||
databaseFactory.setDatabaseConfigurer(new AutoCommitDisabledH2EmbeddedDatabaseConfigurer()); |
||||
database = databaseFactory.getDatabase(); |
||||
|
||||
assertAutoCommitDisabledPreconditions(database); |
||||
|
||||
// Set up schema
|
||||
databasePopulator.setScripts(usersSchema()); |
||||
DatabasePopulatorUtils.execute(databasePopulator, database); |
||||
assertThat(selectFirstNames(database)).isEmpty(); |
||||
|
||||
// Insert data
|
||||
databasePopulator.setScripts(resource("users-data.sql")); |
||||
DatabasePopulatorUtils.execute(databasePopulator, database); |
||||
assertThat(selectFirstNames(database)).containsExactly("Sam"); |
||||
} |
||||
finally { |
||||
if (database != null) { |
||||
database.shutdown(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* DatabasePopulatorUtils.execute() will obtain a new Connection, so we're |
||||
* really just testing the configuration of the database here. |
||||
*/ |
||||
private void assertAutoCommitDisabledPreconditions(DataSource dataSource) throws Exception { |
||||
Connection connection = DataSourceUtils.getConnection(dataSource); |
||||
assertThat(connection.getAutoCommit()).as("auto-commit").isFalse(); |
||||
assertThat(DataSourceUtils.isConnectionTransactional(connection, dataSource)).as("transactional").isFalse(); |
||||
connection.close(); |
||||
} |
||||
|
||||
private List<String> selectFirstNames(DataSource dataSource) { |
||||
return new JdbcTemplate(dataSource).queryForList("select first_name from users", String.class); |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue