Skip to content

Commit 23aa255

Browse files
authored
fix: extract SQL dialect from endpoint url (#743)
1 parent 3e8491e commit 23aa255

File tree

7 files changed

+37
-24
lines changed

7 files changed

+37
-24
lines changed

cli/flamingock-cli/src/main/java/io/flamingock/cli/config/DatabaseConfig.java

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.flamingock.internal.common.sql.SqlDialect;
1919

2020
import java.util.Map;
21+
import java.util.Optional;
2122

2223
public class DatabaseConfig {
2324
private MongoDBConfig mongodb;
@@ -269,16 +270,27 @@ public void setPassword(String password) {
269270
this.password = password;
270271
}
271272

272-
public SqlDialect getSqlDialect() {
273-
return sqlDialect;
273+
public Optional<SqlDialect> getSqlDialect() {
274+
return Optional.ofNullable(sqlDialect);
274275
}
275276

276277
public void setSqlDialect(String sqlDialect) {
277278
this.sqlDialect = SqlDialect.valueOf(sqlDialect.toUpperCase());
278279
}
279280

281+
public SqlDialect getEffectiveSqlDialect() {
282+
if (this.sqlDialect != null) {
283+
return this.sqlDialect;
284+
}
285+
String[] parts = this.endpoint.split(":", 3);
286+
if (parts.length < 2 || parts[1].isEmpty()) {
287+
throw new IllegalStateException("Cannot determine SQL dialect from endpoint: " + this.endpoint);
288+
}
289+
return SqlDialect.fromString(parts[1].toLowerCase());
290+
}
291+
280292
public String getDriverClassName() {
281-
switch (sqlDialect) {
293+
switch (this.getEffectiveSqlDialect()) {
282294
case MYSQL:
283295
return "com.mysql.cj.jdbc.Driver";
284296
case MARIADB:
@@ -302,7 +314,7 @@ public String getDriverClassName() {
302314
case DB2:
303315
return "com.ibm.db2.jcc.DB2Driver";
304316
default:
305-
throw new IllegalArgumentException("Unsupported SQL Dialect: " + sqlDialect);
317+
throw new IllegalArgumentException("Unsupported SQL Dialect: " + this.getEffectiveSqlDialect());
306318
}
307319
}
308320

cli/flamingock-cli/src/main/java/io/flamingock/cli/factory/SqlDataSourceFactory.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,7 @@ public static DataSource createSqlDataSource(DatabaseConfig.SqlConfig config) {
3838
throw new IllegalArgumentException("Database endpoint is required");
3939
}
4040

41-
if (config.getSqlDialect() == null) {
42-
throw new IllegalArgumentException("Sql dialect is required");
43-
}
44-
45-
if (!SqlDialect.SQLITE.equals(config.getSqlDialect())) {
41+
if (config.getEffectiveSqlDialect() != SqlDialect.SQLITE) {
4642
if (config.getUsername() == null) {
4743
throw new IllegalArgumentException("Database username is required");
4844
}
@@ -54,16 +50,10 @@ public static DataSource createSqlDataSource(DatabaseConfig.SqlConfig config) {
5450
try {
5551
DataSource sqlDatasource;
5652

57-
if (config.getSqlDialect().equals(SqlDialect.SQLITE)) {
53+
if (config.getEffectiveSqlDialect() == (SqlDialect.SQLITE)) {
5854
SQLiteDataSource sqliteDatasource = new SQLiteDataSource();
5955
sqliteDatasource.setUrl(config.getEndpoint());
6056

61-
try (Connection conn = sqliteDatasource.getConnection();
62-
Statement stmt = conn.createStatement()) {
63-
stmt.execute("PRAGMA journal_mode=WAL;");
64-
stmt.execute("PRAGMA busy_timeout=5000;");
65-
}
66-
6757
sqlDatasource = sqliteDatasource;
6858
} else {
6959
HikariConfig datasourceConfig = new HikariConfig();

cli/flamingock-cli/src/test/java/io/flamingock/cli/SimpleCLITest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,6 @@ void shouldCreateTestConfigs() {
9393

9494
assertThat(sqlConfig).isNotNull();
9595
assertThat(sqlConfig.getAudit().getSql()).isNotNull();
96-
assertThat(sqlConfig.getAudit().getSql().getSqlDialect()).isEqualTo(SQLSERVER);
96+
assertThat(sqlConfig.getAudit().getSql().getEffectiveSqlDialect()).isEqualTo(SQLSERVER);
9797
}
9898
}

cli/flamingock-cli/src/test/java/io/flamingock/cli/config/SimpleConfigLoaderTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.io.IOException;
2323
import java.nio.file.Files;
2424
import java.nio.file.Path;
25+
import java.util.Optional;
2526

2627
import static io.flamingock.internal.common.sql.SqlDialect.SQLSERVER;
2728
import static org.assertj.core.api.Assertions.*;
@@ -100,7 +101,7 @@ void shouldLoadValidSqlConfiguration() throws IOException {
100101
assertThat(config.getAudit().getSql().getEndpoint()).isEqualTo("jdbc:sqlserver://localhost:1433");
101102
assertThat(config.getAudit().getSql().getUsername()).isEqualTo("test-user");
102103
assertThat(config.getAudit().getSql().getPassword()).isEqualTo("test-password");
103-
assertThat(config.getAudit().getSql().getSqlDialect()).isEqualTo(SQLSERVER);
104+
assertThat(config.getAudit().getSql().getSqlDialect()).isEqualTo(Optional.of(SQLSERVER));
104105
}
105106

106107
@Test

cli/flamingock-cli/src/test/java/io/flamingock/cli/integration/CLISqlIntegrationTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,7 @@ void shouldRunAuditListCommandWithSql(SqlDialect sqlDialect, String dialectName)
100100
" sql:\n" +
101101
" endpoint: \"" + sqlContainer.getJdbcUrl() + "\"\n" +
102102
" username: \"" + sqlContainer.getUsername() + "\"\n" +
103-
" password: \"" + sqlContainer.getPassword() + "\"\n" +
104-
" sql-dialect: \"" + dialectName + "\"\n";
103+
" password: \"" + sqlContainer.getPassword() + "\"\n";
105104

106105
Files.write(configFile, sqlConfig.getBytes());
107106

@@ -182,8 +181,7 @@ void shouldHandleInvalidSqlConnectionGracefully(SqlDialect sqlDialect, String di
182181
" sql:\n" +
183182
" endpoint: \"jdbc:sqlserver://invalid-host:1433\"\n" +
184183
" username: \"" + sqlContainer.getUsername() + "\"\n" +
185-
" password: \"" + sqlContainer.getPassword() + "\"\n" +
186-
" sql-dialect: \"" + dialectName + "\"\n";
184+
" password: \"" + sqlContainer.getPassword() + "\"\n";
187185

188186
Files.write(configFile, invalidConfig.getBytes());
189187

cli/flamingock-cli/src/test/java/io/flamingock/cli/test/TestUtils.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ public static FlamingockConfig createSqlConfig() {
8080
sqlConfig.setEndpoint("jdbc:sqlserver://localhost:1433");
8181
sqlConfig.setUsername("test-user");
8282
sqlConfig.setPassword("test-password");
83-
sqlConfig.setSqlDialect("SqlServer");
8483
databaseConfig.setSql(sqlConfig);
8584

8685
config.setAudit(databaseConfig);

utils/sql-util/src/main/java/io/flamingock/internal/common/sql/SqlDialect.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
*/
1616
package io.flamingock.internal.common.sql;
1717

18+
import java.util.Locale;
19+
import java.util.Optional;
20+
1821
public enum SqlDialect {
1922
MYSQL,
2023
MARIADB,
@@ -28,5 +31,15 @@ public enum SqlDialect {
2831
FIREBIRD,
2932
INFORMIX,
3033
ORACLE,
31-
DB2,
34+
DB2;
35+
36+
public static SqlDialect fromString(String dialect) {
37+
if ("firebirdsql".equals(dialect.toLowerCase())) return FIREBIRD;
38+
if ("informix-sqli".equals(dialect.toLowerCase())) return INFORMIX;
39+
try {
40+
return SqlDialect.valueOf(dialect.toUpperCase());
41+
} catch (IllegalArgumentException e) {
42+
throw new IllegalArgumentException("Unsupported SQL Dialect: " + dialect, e);
43+
}
44+
}
3245
}

0 commit comments

Comments
 (0)