diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/MySQLQueryService.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/MySQLQueryService.java index 10dc42a00..ba1e50493 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/MySQLQueryService.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/MySQLQueryService.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.infrastructure.core.service.database; -import static java.lang.String.format; - import java.util.List; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; @@ -45,8 +43,7 @@ public class MySQLQueryService implements DatabaseQueryService { @Override public boolean isTablePresent(DataSource dataSource, String tableName) { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); - SqlRowSet rs = jdbcTemplate.queryForRowSet(format("SHOW TABLES LIKE '%s'", tableName)); - return rs.next(); + return jdbcTemplate.queryForRowSet("SHOW TABLES LIKE ?", tableName).next(); } @Override diff --git a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/PostgreSQLQueryService.java b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/PostgreSQLQueryService.java index db611f421..9c1629383 100644 --- a/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/PostgreSQLQueryService.java +++ b/fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/database/PostgreSQLQueryService.java @@ -18,8 +18,6 @@ */ package org.apache.fineract.infrastructure.core.service.database; -import static java.lang.String.format; - import java.util.List; import java.util.Objects; import javax.sql.DataSource; @@ -46,8 +44,9 @@ public class PostgreSQLQueryService implements DatabaseQueryService { @Override public boolean isTablePresent(DataSource dataSource, String tableName) { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); - Integer result = jdbcTemplate.queryForObject(format("SELECT COUNT(table_name) " + "FROM information_schema.tables " - + "WHERE table_schema = 'public' " + "AND table_name = '%s';", tableName), Integer.class); + Integer result = jdbcTemplate.queryForObject( + "SELECT COUNT(table_name) FROM information_schema.tables " + "WHERE table_schema = 'public' AND table_name = ?", + Integer.class, tableName); return Objects.equals(result, 1); } @@ -56,9 +55,8 @@ public class PostgreSQLQueryService implements DatabaseQueryService { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "SELECT column_name, is_nullable, data_type," + " coalesce(character_maximum_length, numeric_precision, datetime_precision) AS max_length, ordinal_position = 1 AS column_key" - + " FROM information_schema.columns WHERE table_catalog = current_catalog AND table_schema = current_schema AND table_name = '" - + tableName + "' ORDER BY ordinal_position"; - final SqlRowSet columnDefinitions = jdbcTemplate.queryForRowSet(sql); // NOSONAR + + " FROM information_schema.columns WHERE table_catalog = current_catalog AND table_schema = current_schema AND table_name = ? ORDER BY ordinal_position"; + final SqlRowSet columnDefinitions = jdbcTemplate.queryForRowSet(sql, tableName); // NOSONAR if (columnDefinitions.next()) { return columnDefinitions; } else { @@ -69,8 +67,8 @@ public class PostgreSQLQueryService implements DatabaseQueryService { @Override public List getTableIndexes(DataSource dataSource, String tableName) { JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); - String sql = "SELECT indexname FROM pg_indexes WHERE schemaname = 'public' AND tablename = '" + tableName + "'"; - final SqlRowSet indexDefinitions = jdbcTemplate.queryForRowSet(sql); // NOSONAR + String sql = "SELECT indexname FROM pg_indexes WHERE schemaname = 'public' AND tablename = ?"; + final SqlRowSet indexDefinitions = jdbcTemplate.queryForRowSet(sql, tableName); // NOSONAR if (indexDefinitions.next()) { return DatabaseIndexMapper.getIndexDetails(indexDefinitions); } else { diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseStateVerifier.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseStateVerifier.java index 248c57016..6ef80b9d0 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseStateVerifier.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseStateVerifier.java @@ -23,6 +23,7 @@ import java.util.Objects; import javax.sql.DataSource; import lombok.RequiredArgsConstructor; import org.apache.fineract.infrastructure.core.service.database.DatabaseIndependentQueryService; +import org.apache.fineract.infrastructure.core.service.database.DatabaseTypeResolver; import org.springframework.boot.autoconfigure.liquibase.LiquibaseProperties; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Component; @@ -40,10 +41,11 @@ public class TenantDatabaseStateVerifier { private final LiquibaseProperties liquibaseProperties; private final DatabaseIndependentQueryService dbQueryService; + private final DatabaseTypeResolver databaseTypeResolver; public boolean isFirstLiquibaseMigration(DataSource dataSource) { - boolean databaseChangelogTableExists = dbQueryService.isTablePresent(dataSource, "DATABASECHANGELOG"); - return !databaseChangelogTableExists; + String tableName = "DATABASECHANGELOG"; + return !dbQueryService.isTablePresent(dataSource, databaseTypeResolver.isPostgreSQL() ? tableName.toLowerCase() : tableName); } public boolean isFlywayPresent(DataSource dataSource) { @@ -70,8 +72,8 @@ public class TenantDatabaseStateVerifier { NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); Integer result = jdbcTemplate.queryForObject( - "SELECT COUNT(script) FROM schema_version " + "WHERE version = :latestFlywayVersion " - + "AND script = :latestFlywayScriptName " + "AND checksum = :latestFlywayScriptChecksum " + "AND success = 1", + "SELECT COUNT(script) FROM schema_version WHERE version = :latestFlywayVersion " + + "AND script = :latestFlywayScriptName AND checksum = :latestFlywayScriptChecksum AND success = 1", paramMap, Integer.class); return Objects.equals(result, 1); } diff --git a/fineract-provider/src/test/java/org/apache/fineract/TestConfiguration.java b/fineract-provider/src/test/java/org/apache/fineract/TestConfiguration.java index 8d4803531..8dc6f8efa 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/TestConfiguration.java +++ b/fineract-provider/src/test/java/org/apache/fineract/TestConfiguration.java @@ -143,8 +143,8 @@ public class TestConfiguration { @Bean public TenantDatabaseStateVerifier tenantDatabaseStateVerifier(DatabaseIndependentQueryService databaseIndependentQueryService, - LiquibaseProperties liquibaseProperties) { - return new TenantDatabaseStateVerifier(liquibaseProperties, databaseIndependentQueryService); + LiquibaseProperties liquibaseProperties, DatabaseTypeResolver databaseTypeResolver) { + return new TenantDatabaseStateVerifier(liquibaseProperties, databaseIndependentQueryService, databaseTypeResolver); } /**