From 2ecd4d86f17080f26f284d0db2b52abd9b3cfdf4 Mon Sep 17 00:00:00 2001 From: bercianor Date: Tue, 25 Nov 2025 20:53:33 +0000 Subject: [PATCH 1/4] fix: extract SQL dialect from endpoint url --- .../flamingock/cli/config/DatabaseConfig.java | 27 ++++++++++++++++--- .../cli/factory/SqlDataSourceFactory.java | 14 ++-------- .../java/io/flamingock/cli/SimpleCLITest.java | 2 +- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java b/cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java index ebe859623..0604e5cc7 100644 --- a/cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java +++ b/cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java @@ -18,6 +18,7 @@ import io.flamingock.internal.common.sql.SqlDialect; import java.util.Map; +import java.util.Optional; public class DatabaseConfig { private MongoDBConfig mongodb; @@ -269,16 +270,34 @@ public void setPassword(String password) { this.password = password; } - public SqlDialect getSqlDialect() { - return sqlDialect; + public Optional getSqlDialect() { + return sqlDialect == null ? Optional.empty() : Optional.of(sqlDialect); } public void setSqlDialect(String sqlDialect) { this.sqlDialect = SqlDialect.valueOf(sqlDialect.toUpperCase()); } + public SqlDialect getEffectiveSqlDialect() { + if (this.sqlDialect != null) { + return this.sqlDialect; + } + String[] parts = this.endpoint.split(":", 3); + if (parts.length < 2 || parts[1].isEmpty()) { + throw new IllegalStateException("Cannot determine SQL dialect from endpoint: " + this.endpoint); + } + String dialect = parts[1].toLowerCase(); + if ("firebirdsql".equals(dialect)) dialect = "firebird"; + if ("informix-sqli".equals(dialect)) dialect = "informix"; + try { + return SqlDialect.valueOf(dialect.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Unsupported SQL Dialect: " + dialect, e); + } + } + public String getDriverClassName() { - switch (sqlDialect) { + switch (this.getEffectiveSqlDialect()) { case MYSQL: return "com.mysql.cj.jdbc.Driver"; case MARIADB: @@ -302,7 +321,7 @@ public String getDriverClassName() { case DB2: return "com.ibm.db2.jcc.DB2Driver"; default: - throw new IllegalArgumentException("Unsupported SQL Dialect: " + sqlDialect); + throw new IllegalArgumentException("Unsupported SQL Dialect: " + this.getEffectiveSqlDialect()); } } diff --git a/cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java b/cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java index 3b06f1938..eab138a69 100644 --- a/cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java +++ b/cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java @@ -38,11 +38,7 @@ public static DataSource createSqlDataSource(DatabaseConfig.SqlConfig config) { throw new IllegalArgumentException("Database endpoint is required"); } - if (config.getSqlDialect() == null) { - throw new IllegalArgumentException("Sql dialect is required"); - } - - if (!SqlDialect.SQLITE.equals(config.getSqlDialect())) { + if (!SqlDialect.SQLITE.equals(config.getEffectiveSqlDialect())) { if (config.getUsername() == null) { throw new IllegalArgumentException("Database username is required"); } @@ -54,16 +50,10 @@ public static DataSource createSqlDataSource(DatabaseConfig.SqlConfig config) { try { DataSource sqlDatasource; - if (config.getSqlDialect().equals(SqlDialect.SQLITE)) { + if (config.getEffectiveSqlDialect().equals(SqlDialect.SQLITE)) { SQLiteDataSource sqliteDatasource = new SQLiteDataSource(); sqliteDatasource.setUrl(config.getEndpoint()); - try (Connection conn = sqliteDatasource.getConnection(); - Statement stmt = conn.createStatement()) { - stmt.execute("PRAGMA journal_mode=WAL;"); - stmt.execute("PRAGMA busy_timeout=5000;"); - } - sqlDatasource = sqliteDatasource; } else { HikariConfig datasourceConfig = new HikariConfig(); diff --git a/cli/flamingock-cli/src/test/java/io/flamingock/cli/SimpleCLITest.java b/cli/flamingock-cli/src/test/java/io/flamingock/cli/SimpleCLITest.java index f2600793a..fab06cfe8 100644 --- a/cli/flamingock-cli/src/test/java/io/flamingock/cli/SimpleCLITest.java +++ b/cli/flamingock-cli/src/test/java/io/flamingock/cli/SimpleCLITest.java @@ -93,6 +93,6 @@ void shouldCreateTestConfigs() { assertThat(sqlConfig).isNotNull(); assertThat(sqlConfig.getAudit().getSql()).isNotNull(); - assertThat(sqlConfig.getAudit().getSql().getSqlDialect()).isEqualTo(SQLSERVER); + assertThat(sqlConfig.getAudit().getSql().getEffectiveSqlDialect()).isEqualTo(SQLSERVER); } } From 0108ab85e311680379eb7ab3a2d19290a3a42bf3 Mon Sep 17 00:00:00 2001 From: bercianor Date: Tue, 25 Nov 2025 20:56:32 +0000 Subject: [PATCH 2/4] fix: getSqlDialect now returns Optional, fix test --- .../java/io/flamingock/cli/config/SimpleConfigLoaderTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/flamingock-cli/src/test/java/io/flamingock/cli/config/SimpleConfigLoaderTest.java b/cli/flamingock-cli/src/test/java/io/flamingock/cli/config/SimpleConfigLoaderTest.java index 732d71b54..89794946e 100644 --- a/cli/flamingock-cli/src/test/java/io/flamingock/cli/config/SimpleConfigLoaderTest.java +++ b/cli/flamingock-cli/src/test/java/io/flamingock/cli/config/SimpleConfigLoaderTest.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.Optional; import static io.flamingock.internal.common.sql.SqlDialect.SQLSERVER; import static org.assertj.core.api.Assertions.*; @@ -100,7 +101,7 @@ void shouldLoadValidSqlConfiguration() throws IOException { assertThat(config.getAudit().getSql().getEndpoint()).isEqualTo("jdbc:sqlserver://localhost:1433"); assertThat(config.getAudit().getSql().getUsername()).isEqualTo("test-user"); assertThat(config.getAudit().getSql().getPassword()).isEqualTo("test-password"); - assertThat(config.getAudit().getSql().getSqlDialect()).isEqualTo(SQLSERVER); + assertThat(config.getAudit().getSql().getSqlDialect()).isEqualTo(Optional.of(SQLSERVER)); } @Test From d3479803b3ed7e580e68d2ba7a5a2f4959606011 Mon Sep 17 00:00:00 2001 From: bercianor Date: Tue, 25 Nov 2025 21:38:39 +0000 Subject: [PATCH 3/4] fix: modify tests to check this new feat --- .../flamingock/cli/integration/CLISqlIntegrationTest.java | 6 ++---- .../src/test/java/io/flamingock/cli/test/TestUtils.java | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/cli/flamingock-cli/src/test/java/io/flamingock/cli/integration/CLISqlIntegrationTest.java b/cli/flamingock-cli/src/test/java/io/flamingock/cli/integration/CLISqlIntegrationTest.java index dde828441..e36e4d7cc 100644 --- a/cli/flamingock-cli/src/test/java/io/flamingock/cli/integration/CLISqlIntegrationTest.java +++ b/cli/flamingock-cli/src/test/java/io/flamingock/cli/integration/CLISqlIntegrationTest.java @@ -100,8 +100,7 @@ void shouldRunAuditListCommandWithSql(SqlDialect sqlDialect, String dialectName) " sql:\n" + " endpoint: \"" + sqlContainer.getJdbcUrl() + "\"\n" + " username: \"" + sqlContainer.getUsername() + "\"\n" + - " password: \"" + sqlContainer.getPassword() + "\"\n" + - " sql-dialect: \"" + dialectName + "\"\n"; + " password: \"" + sqlContainer.getPassword() + "\"\n"; Files.write(configFile, sqlConfig.getBytes()); @@ -182,8 +181,7 @@ void shouldHandleInvalidSqlConnectionGracefully(SqlDialect sqlDialect, String di " sql:\n" + " endpoint: \"jdbc:sqlserver://invalid-host:1433\"\n" + " username: \"" + sqlContainer.getUsername() + "\"\n" + - " password: \"" + sqlContainer.getPassword() + "\"\n" + - " sql-dialect: \"" + dialectName + "\"\n"; + " password: \"" + sqlContainer.getPassword() + "\"\n"; Files.write(configFile, invalidConfig.getBytes()); diff --git a/cli/flamingock-cli/src/test/java/io/flamingock/cli/test/TestUtils.java b/cli/flamingock-cli/src/test/java/io/flamingock/cli/test/TestUtils.java index 151ff05d2..1576873ec 100644 --- a/cli/flamingock-cli/src/test/java/io/flamingock/cli/test/TestUtils.java +++ b/cli/flamingock-cli/src/test/java/io/flamingock/cli/test/TestUtils.java @@ -80,7 +80,6 @@ public static FlamingockConfig createSqlConfig() { sqlConfig.setEndpoint("jdbc:sqlserver://localhost:1433"); sqlConfig.setUsername("test-user"); sqlConfig.setPassword("test-password"); - sqlConfig.setSqlDialect("SqlServer"); databaseConfig.setSql(sqlConfig); config.setAudit(databaseConfig); From d77850c527048b75577f14f7c8f8e4aad80d00bd Mon Sep 17 00:00:00 2001 From: bercianor Date: Wed, 26 Nov 2025 18:25:33 +0000 Subject: [PATCH 4/4] fix: pr comments --- .../io/flamingock/cli/config/DatabaseConfig.java | 11 ++--------- .../cli/factory/SqlDataSourceFactory.java | 4 ++-- .../internal/common/sql/SqlDialect.java | 15 ++++++++++++++- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java b/cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java index 0604e5cc7..247008070 100644 --- a/cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java +++ b/cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java @@ -271,7 +271,7 @@ public void setPassword(String password) { } public Optional getSqlDialect() { - return sqlDialect == null ? Optional.empty() : Optional.of(sqlDialect); + return Optional.ofNullable(sqlDialect); } public void setSqlDialect(String sqlDialect) { @@ -286,14 +286,7 @@ public SqlDialect getEffectiveSqlDialect() { if (parts.length < 2 || parts[1].isEmpty()) { throw new IllegalStateException("Cannot determine SQL dialect from endpoint: " + this.endpoint); } - String dialect = parts[1].toLowerCase(); - if ("firebirdsql".equals(dialect)) dialect = "firebird"; - if ("informix-sqli".equals(dialect)) dialect = "informix"; - try { - return SqlDialect.valueOf(dialect.toUpperCase()); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("Unsupported SQL Dialect: " + dialect, e); - } + return SqlDialect.fromString(parts[1].toLowerCase()); } public String getDriverClassName() { diff --git a/cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java b/cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java index eab138a69..7febe33ee 100644 --- a/cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java +++ b/cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java @@ -38,7 +38,7 @@ public static DataSource createSqlDataSource(DatabaseConfig.SqlConfig config) { throw new IllegalArgumentException("Database endpoint is required"); } - if (!SqlDialect.SQLITE.equals(config.getEffectiveSqlDialect())) { + if (config.getEffectiveSqlDialect() != SqlDialect.SQLITE) { if (config.getUsername() == null) { throw new IllegalArgumentException("Database username is required"); } @@ -50,7 +50,7 @@ public static DataSource createSqlDataSource(DatabaseConfig.SqlConfig config) { try { DataSource sqlDatasource; - if (config.getEffectiveSqlDialect().equals(SqlDialect.SQLITE)) { + if (config.getEffectiveSqlDialect() == (SqlDialect.SQLITE)) { SQLiteDataSource sqliteDatasource = new SQLiteDataSource(); sqliteDatasource.setUrl(config.getEndpoint()); diff --git a/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/SqlDialect.java b/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/SqlDialect.java index 67bd3e8e1..d57ebebfc 100644 --- a/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/SqlDialect.java +++ b/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/SqlDialect.java @@ -15,6 +15,9 @@ */ package io.flamingock.internal.common.sql; +import java.util.Locale; +import java.util.Optional; + public enum SqlDialect { MYSQL, MARIADB, @@ -28,5 +31,15 @@ public enum SqlDialect { FIREBIRD, INFORMIX, ORACLE, - DB2, + DB2; + + public static SqlDialect fromString(String dialect) { + if ("firebirdsql".equals(dialect.toLowerCase())) return FIREBIRD; + if ("informix-sqli".equals(dialect.toLowerCase())) return INFORMIX; + try { + return SqlDialect.valueOf(dialect.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Unsupported SQL Dialect: " + dialect, e); + } + } }