Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in / Register
Toggle navigation
S
spring-boot
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
DEMO
spring-boot
Commits
7cd2d647
Commit
7cd2d647
authored
Jun 17, 2021
by
Andy Wilkinson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Only check database's type when there are scripts to apply
Fixes gh-26925
parent
5c65b1bc
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
64 additions
and
40 deletions
+64
-40
AbstractScriptDatabaseInitializer.java
...work/boot/sql/init/AbstractScriptDatabaseInitializer.java
+6
-12
DataSourceScriptDatabaseInitializerTests.java
...t/jdbc/init/DataSourceScriptDatabaseInitializerTests.java
+11
-4
R2dbcScriptDatabaseInitializerTests.java
.../boot/r2dbc/init/R2dbcScriptDatabaseInitializerTests.java
+9
-4
AbstractScriptDatabaseInitializerTests.java
...boot/sql/init/AbstractScriptDatabaseInitializerTests.java
+38
-20
No files found.
spring-boot-project/spring-boot/src/main/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializer.java
View file @
7cd2d647
...
...
@@ -71,13 +71,9 @@ public abstract class AbstractScriptDatabaseInitializer implements ResourceLoade
* {@code false}
*/
public
boolean
initializeDatabase
()
{
if
(
isEnabled
())
{
ScriptLocationResolver
locationResolver
=
new
ScriptLocationResolver
(
this
.
resourceLoader
);
boolean
initialized
=
applySchemaScripts
(
locationResolver
);
initialized
=
applyDataScripts
(
locationResolver
)
||
initialized
;
return
initialized
;
}
return
false
;
ScriptLocationResolver
locationResolver
=
new
ScriptLocationResolver
(
this
.
resourceLoader
);
boolean
initialized
=
applySchemaScripts
(
locationResolver
);
return
applyDataScripts
(
locationResolver
)
||
initialized
;
}
private
boolean
isEnabled
()
{
...
...
@@ -107,10 +103,11 @@ public abstract class AbstractScriptDatabaseInitializer implements ResourceLoade
private
boolean
applyScripts
(
List
<
String
>
locations
,
String
type
,
ScriptLocationResolver
locationResolver
)
{
List
<
Resource
>
scripts
=
getScripts
(
locations
,
type
,
locationResolver
);
if
(!
scripts
.
isEmpty
())
{
if
(!
scripts
.
isEmpty
()
&&
isEnabled
()
)
{
runScripts
(
scripts
);
return
true
;
}
return
!
scripts
.
isEmpty
()
;
return
false
;
}
private
List
<
Resource
>
getScripts
(
List
<
String
>
locations
,
String
type
,
ScriptLocationResolver
locationResolver
)
{
...
...
@@ -145,9 +142,6 @@ public abstract class AbstractScriptDatabaseInitializer implements ResourceLoade
}
private
void
runScripts
(
List
<
Resource
>
resources
)
{
if
(
resources
.
isEmpty
())
{
return
;
}
runScripts
(
resources
,
this
.
settings
.
isContinueOnError
(),
this
.
settings
.
getSeparator
(),
this
.
settings
.
getEncoding
());
}
...
...
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/jdbc/init/DataSourceScriptDatabaseInitializerTests.java
View file @
7cd2d647
...
...
@@ -24,18 +24,20 @@ import com.zaxxer.hikari.HikariDataSource;
import
org.junit.jupiter.api.AfterEach
;
import
org.springframework.boot.jdbc.DataSourceBuilder
;
import
org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer
;
import
org.springframework.boot.sql.init.AbstractScriptDatabaseInitializerTests
;
import
org.springframework.boot.sql.init.DatabaseInitializationSettings
;
import
org.springframework.boot.testsupport.BuildOutput
;
import
org.springframework.jdbc.core.JdbcTemplate
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
/**
* Tests for {@link DataSourceScriptDatabaseInitializer}.
*
* @author Andy Wilkinson
*/
class
DataSourceScriptDatabaseInitializerTests
extends
AbstractScriptDatabaseInitializerTests
{
class
DataSourceScriptDatabaseInitializerTests
extends
AbstractScriptDatabaseInitializerTests
<
DataSourceScriptDatabaseInitializer
>
{
private
final
HikariDataSource
embeddedDataSource
=
DataSourceBuilder
.
create
().
type
(
HikariDataSource
.
class
)
.
url
(
"jdbc:h2:mem:"
+
UUID
.
randomUUID
()).
build
();
...
...
@@ -52,13 +54,13 @@ class DataSourceScriptDatabaseInitializerTests extends AbstractScriptDatabaseIni
}
@Override
protected
Abstract
ScriptDatabaseInitializer
createEmbeddedDatabaseInitializer
(
protected
DataSource
ScriptDatabaseInitializer
createEmbeddedDatabaseInitializer
(
DatabaseInitializationSettings
settings
)
{
return
new
DataSourceScriptDatabaseInitializer
(
this
.
embeddedDataSource
,
settings
);
}
@Override
protected
Abstract
ScriptDatabaseInitializer
createStandaloneDatabaseInitializer
(
protected
DataSource
ScriptDatabaseInitializer
createStandaloneDatabaseInitializer
(
DatabaseInitializationSettings
settings
)
{
return
new
DataSourceScriptDatabaseInitializer
(
this
.
standloneDataSource
,
settings
);
}
...
...
@@ -77,4 +79,9 @@ class DataSourceScriptDatabaseInitializerTests extends AbstractScriptDatabaseIni
return
new
JdbcTemplate
(
dataSource
).
queryForObject
(
sql
,
Integer
.
class
);
}
@Override
protected
void
assertDatabaseAccessed
(
boolean
accessed
,
DataSourceScriptDatabaseInitializer
initializer
)
{
assertThat
(((
HikariDataSource
)
initializer
.
getDataSource
()).
isRunning
()).
isEqualTo
(
accessed
);
}
}
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/r2dbc/init/R2dbcScriptDatabaseInitializerTests.java
View file @
7cd2d647
...
...
@@ -21,7 +21,6 @@ import java.util.UUID;
import
io.r2dbc.spi.ConnectionFactory
;
import
org.springframework.boot.r2dbc.ConnectionFactoryBuilder
;
import
org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer
;
import
org.springframework.boot.sql.init.AbstractScriptDatabaseInitializerTests
;
import
org.springframework.boot.sql.init.DatabaseInitializationSettings
;
import
org.springframework.boot.testsupport.BuildOutput
;
...
...
@@ -32,7 +31,8 @@ import org.springframework.r2dbc.core.DatabaseClient;
*
* @author Andy Wilkinson
*/
class
R2dbcScriptDatabaseInitializerTests
extends
AbstractScriptDatabaseInitializerTests
{
class
R2dbcScriptDatabaseInitializerTests
extends
AbstractScriptDatabaseInitializerTests
<
R2dbcScriptDatabaseInitializer
>
{
private
final
ConnectionFactory
embeddedConnectionFactory
=
ConnectionFactoryBuilder
.
withUrl
(
"r2dbc:h2:mem:///"
+
UUID
.
randomUUID
()
+
"?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"
)
...
...
@@ -43,13 +43,13 @@ class R2dbcScriptDatabaseInitializerTests extends AbstractScriptDatabaseInitiali
+
UUID
.
randomUUID
()
+
"?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE"
).
build
();
@Override
protected
Abstract
ScriptDatabaseInitializer
createEmbeddedDatabaseInitializer
(
protected
R2dbc
ScriptDatabaseInitializer
createEmbeddedDatabaseInitializer
(
DatabaseInitializationSettings
settings
)
{
return
new
R2dbcScriptDatabaseInitializer
(
this
.
embeddedConnectionFactory
,
settings
);
}
@Override
protected
Abstract
ScriptDatabaseInitializer
createStandaloneDatabaseInitializer
(
protected
R2dbc
ScriptDatabaseInitializer
createStandaloneDatabaseInitializer
(
DatabaseInitializationSettings
settings
)
{
return
new
R2dbcScriptDatabaseInitializer
(
this
.
standaloneConnectionFactory
,
settings
);
}
...
...
@@ -69,4 +69,9 @@ class R2dbcScriptDatabaseInitializerTests extends AbstractScriptDatabaseInitiali
.
map
((
number
)
->
((
Number
)
number
).
intValue
()).
block
();
}
@Override
protected
void
assertDatabaseAccessed
(
boolean
accessed
,
R2dbcScriptDatabaseInitializer
initializer
)
{
// No-op as R2DBC does not need to access the database to determine its type
}
}
spring-boot-project/spring-boot/src/test/java/org/springframework/boot/sql/init/AbstractScriptDatabaseInitializerTests.java
View file @
7cd2d647
...
...
@@ -29,16 +29,17 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
/**
* Base class for testing {@link AbstractScriptDatabaseInitializer} implementations.
*
* @param <T> type of the initializer being tested
* @author Andy Wilkinson
*/
public
abstract
class
AbstractScriptDatabaseInitializerTests
{
public
abstract
class
AbstractScriptDatabaseInitializerTests
<
T
extends
AbstractScriptDatabaseInitializer
>
{
@Test
void
whenDatabaseIsInitializedThenSchemaAndDataScriptsAreApplied
()
{
DatabaseInitializationSettings
settings
=
new
DatabaseInitializationSettings
();
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"schema.sql"
));
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isTrue
();
assertThat
(
numberOfEmbeddedRows
(
"SELECT COUNT(*) FROM EXAMPLE"
)).
isEqualTo
(
1
);
}
...
...
@@ -47,8 +48,9 @@ public abstract class AbstractScriptDatabaseInitializerTests {
void
whenContinueOnErrorIsFalseThenInitializationFailsOnError
()
{
DatabaseInitializationSettings
settings
=
new
DatabaseInitializationSettings
();
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThatExceptionOfType
(
DataAccessException
.
class
).
isThrownBy
(()
->
initializer
.
initializeDatabase
());
assertThatDatabaseWasAccessed
(
initializer
);
}
@Test
...
...
@@ -56,42 +58,47 @@ public abstract class AbstractScriptDatabaseInitializerTests {
DatabaseInitializationSettings
settings
=
new
DatabaseInitializationSettings
();
settings
.
setContinueOnError
(
true
);
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isTrue
();
assertThatDatabaseWasAccessed
(
initializer
);
}
@Test
void
whenNoScriptsExistAtASchemaLocationThenInitializationFails
()
{
DatabaseInitializationSettings
settings
=
new
DatabaseInitializationSettings
();
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"does-not-exist.sql"
));
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThatIllegalStateException
().
isThrownBy
(
initializer:
:
initializeDatabase
)
.
withMessage
(
"No schema scripts found at location 'does-not-exist.sql'"
);
assertThatDatabaseWasNotAccessed
(
initializer
);
}
@Test
void
whenNoScriptsExistAtADataLocationThenInitializationFails
()
{
DatabaseInitializationSettings
settings
=
new
DatabaseInitializationSettings
();
settings
.
setDataLocations
(
Arrays
.
asList
(
"does-not-exist.sql"
));
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThatIllegalStateException
().
isThrownBy
(
initializer:
:
initializeDatabase
)
.
withMessage
(
"No data scripts found at location 'does-not-exist.sql'"
);
assertThatDatabaseWasNotAccessed
(
initializer
);
}
@Test
void
whenNoScriptsExistAtAnOptionalSchemaLocationThen
InitializationSucceeds
()
{
void
whenNoScriptsExistAtAnOptionalSchemaLocationThen
DatabaseIsNotAccessed
()
{
DatabaseInitializationSettings
settings
=
new
DatabaseInitializationSettings
();
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"optional:does-not-exist.sql"
));
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isFalse
();
assertThatDatabaseWasNotAccessed
(
initializer
);
}
@Test
void
whenNoScriptsExistAtAnOptionalDataLocationThen
InitializationSucceeds
()
{
void
whenNoScriptsExistAtAnOptionalDataLocationThen
DatabaseIsNotAccessed
()
{
DatabaseInitializationSettings
settings
=
new
DatabaseInitializationSettings
();
settings
.
setDataLocations
(
Arrays
.
asList
(
"optional:does-not-exist.sql"
));
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isFalse
();
assertThatDatabaseWasNotAccessed
(
initializer
);
}
@Test
...
...
@@ -100,8 +107,9 @@ public abstract class AbstractScriptDatabaseInitializerTests {
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"schema.sql"
));
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
settings
.
setMode
(
DatabaseInitializationMode
.
NEVER
);
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isFalse
();
assertThatDatabaseWasNotAccessed
(
initializer
);
}
@Test
...
...
@@ -110,8 +118,9 @@ public abstract class AbstractScriptDatabaseInitializerTests {
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"schema.sql"
));
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
settings
.
setMode
(
DatabaseInitializationMode
.
NEVER
);
AbstractScriptDatabaseInitializer
initializer
=
createStandaloneDatabaseInitializer
(
settings
);
T
initializer
=
createStandaloneDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isFalse
();
assertThatDatabaseWasNotAccessed
(
initializer
);
}
@Test
...
...
@@ -120,7 +129,7 @@ public abstract class AbstractScriptDatabaseInitializerTests {
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"schema.sql"
));
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
settings
.
setMode
(
DatabaseInitializationMode
.
EMBEDDED
);
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isTrue
();
assertThat
(
numberOfEmbeddedRows
(
"SELECT COUNT(*) FROM EXAMPLE"
)).
isEqualTo
(
1
);
}
...
...
@@ -131,8 +140,9 @@ public abstract class AbstractScriptDatabaseInitializerTests {
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"schema.sql"
));
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
settings
.
setMode
(
DatabaseInitializationMode
.
EMBEDDED
);
AbstractScriptDatabaseInitializer
initializer
=
createStandaloneDatabaseInitializer
(
settings
);
T
initializer
=
createStandaloneDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isFalse
();
assertThatDatabaseWasAccessed
(
initializer
);
}
@Test
...
...
@@ -141,7 +151,7 @@ public abstract class AbstractScriptDatabaseInitializerTests {
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"schema.sql"
));
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
settings
.
setMode
(
DatabaseInitializationMode
.
ALWAYS
);
AbstractScriptDatabaseInitializer
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
T
initializer
=
createEmbeddedDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isTrue
();
assertThat
(
numberOfEmbeddedRows
(
"SELECT COUNT(*) FROM EXAMPLE"
)).
isEqualTo
(
1
);
}
...
...
@@ -152,19 +162,27 @@ public abstract class AbstractScriptDatabaseInitializerTests {
settings
.
setSchemaLocations
(
Arrays
.
asList
(
"schema.sql"
));
settings
.
setDataLocations
(
Arrays
.
asList
(
"data.sql"
));
settings
.
setMode
(
DatabaseInitializationMode
.
ALWAYS
);
AbstractScriptDatabaseInitializer
initializer
=
createStandaloneDatabaseInitializer
(
settings
);
T
initializer
=
createStandaloneDatabaseInitializer
(
settings
);
assertThat
(
initializer
.
initializeDatabase
()).
isTrue
();
assertThat
(
numberOfStandaloneRows
(
"SELECT COUNT(*) FROM EXAMPLE"
)).
isEqualTo
(
1
);
}
protected
abstract
AbstractScriptDatabaseInitializer
createStandaloneDatabaseInitializer
(
DatabaseInitializationSettings
settings
);
protected
abstract
T
createStandaloneDatabaseInitializer
(
DatabaseInitializationSettings
settings
);
protected
abstract
AbstractScriptDatabaseInitializer
createEmbeddedDatabaseInitializer
(
DatabaseInitializationSettings
settings
);
protected
abstract
T
createEmbeddedDatabaseInitializer
(
DatabaseInitializationSettings
settings
);
protected
abstract
int
numberOfEmbeddedRows
(
String
sql
);
protected
abstract
int
numberOfStandaloneRows
(
String
sql
);
private
void
assertThatDatabaseWasAccessed
(
T
initializer
)
{
assertDatabaseAccessed
(
true
,
initializer
);
}
private
void
assertThatDatabaseWasNotAccessed
(
T
initializer
)
{
assertDatabaseAccessed
(
false
,
initializer
);
}
protected
abstract
void
assertDatabaseAccessed
(
boolean
accessed
,
T
initializer
);
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment