From 7284103f48034885a069fb24155cbaf058c28f58 Mon Sep 17 00:00:00 2001 From: bercianor Date: Sun, 1 Feb 2026 18:51:10 +0000 Subject: [PATCH 1/4] feat: add Connection constructor and SqlDialect getter to AbstractSqlDialectHelper --- .../common/sql/AbstractSqlDialectHelper.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/AbstractSqlDialectHelper.java b/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/AbstractSqlDialectHelper.java index 385e19d92..b5a9d1f52 100644 --- a/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/AbstractSqlDialectHelper.java +++ b/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/AbstractSqlDialectHelper.java @@ -16,6 +16,7 @@ package io.flamingock.internal.common.sql; import javax.sql.DataSource; +import java.sql.Connection; import java.sql.SQLException; public class AbstractSqlDialectHelper { @@ -34,6 +35,18 @@ public AbstractSqlDialectHelper(SqlDialect sqlDialect) { this.sqlDialect = sqlDialect; } + public AbstractSqlDialectHelper(Connection connection) { + try { + sqlDialect = fromDatabaseProductName(connection.getMetaData().getDatabaseProductName()); + } catch (SQLException e) { + throw new IllegalStateException("Unable to obtain database product name from DataSource", e); + } + } + + public SqlDialect getSqlDialect() { + return sqlDialect; + } + private SqlDialect fromDatabaseProductName(String productName) { if (productName == null) { throw new IllegalArgumentException("Database product name is null; cannot determine SQL dialect."); From 1d114e7fb09f08990880dff5f358a1f552409085 Mon Sep 17 00:00:00 2001 From: bercianor Date: Mon, 2 Feb 2026 17:49:46 +0000 Subject: [PATCH 2/4] feat: remove DataSource constructor from AbstractSqlDialectHelper --- .../io/flamingock/store/sql/internal/SqlAuditor.java | 6 +++--- .../store/sql/internal/SqlAuditorDialectHelper.java | 6 +++--- .../store/sql/internal/SqlLockDialectHelper.java | 5 ++--- .../io/flamingock/store/sql/internal/SqlLockService.java | 4 ++-- .../targetsystem/sql/SqlAuditMarkerDialectHelper.java | 6 +++--- .../targetsystem/sql/SqlTargetSystemAuditMarker.java | 6 +++++- .../internal/common/sql/AbstractSqlDialectHelper.java | 9 --------- 7 files changed, 18 insertions(+), 24 deletions(-) diff --git a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java index 1edb0b4d3..73800614f 100644 --- a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java +++ b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java @@ -32,23 +32,23 @@ public class SqlAuditor implements LifecycleAuditWriter, AuditReader { private final DataSource dataSource; private final String auditTableName; private final boolean autoCreate; - private final SqlAuditorDialectHelper dialectHelper; + private SqlAuditorDialectHelper dialectHelper = null; public SqlAuditor(DataSource dataSource, String auditTableName, boolean autoCreate) { this.dataSource = dataSource; this.auditTableName = auditTableName; this.autoCreate = autoCreate; - this.dialectHelper = new SqlAuditorDialectHelper(dataSource); } public void initialize() { if (autoCreate) { try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement()) { + this.dialectHelper = new SqlAuditorDialectHelper(conn); stmt.executeUpdate(dialectHelper.getCreateTableSqlString(auditTableName)); } catch (SQLException e) { // Firebird throws an error when table already exists; ignore that specific case - if (dialectHelper.getSqlDialect() == io.flamingock.internal.common.sql.SqlDialect.FIREBIRD) { + if (dialectHelper.getSqlDialect() == SqlDialect.FIREBIRD) { int errorCode = e.getErrorCode(); String sqlState = e.getSQLState(); String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : ""; diff --git a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditorDialectHelper.java b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditorDialectHelper.java index 2809640c0..6cd862579 100644 --- a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditorDialectHelper.java +++ b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditorDialectHelper.java @@ -18,12 +18,12 @@ import io.flamingock.internal.common.sql.AbstractSqlDialectHelper; import io.flamingock.internal.common.sql.SqlDialect; -import javax.sql.DataSource; +import java.sql.Connection; public final class SqlAuditorDialectHelper extends AbstractSqlDialectHelper { - public SqlAuditorDialectHelper(DataSource dataSource) { - super(dataSource); + public SqlAuditorDialectHelper(Connection connection) { + super(connection); } public SqlAuditorDialectHelper(SqlDialect dialect) { diff --git a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockDialectHelper.java b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockDialectHelper.java index 406236dcf..0c3dd4018 100644 --- a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockDialectHelper.java +++ b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockDialectHelper.java @@ -19,15 +19,14 @@ import io.flamingock.internal.common.sql.SqlDialect; import io.flamingock.internal.core.external.store.lock.LockStatus; -import javax.sql.DataSource; import java.sql.*; import java.time.LocalDateTime; import java.util.Objects; public final class SqlLockDialectHelper extends AbstractSqlDialectHelper { - public SqlLockDialectHelper(DataSource dataSource) { - super(dataSource); + public SqlLockDialectHelper(Connection connection) { + super(connection); } public SqlLockDialectHelper(SqlDialect dialect) { diff --git a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java index 17eb80c87..04c43d4a6 100644 --- a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java +++ b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java @@ -32,18 +32,18 @@ public class SqlLockService implements CommunityLockService { private final DataSource dataSource; private final String lockRepositoryName; - private final SqlLockDialectHelper dialectHelper; + private SqlLockDialectHelper dialectHelper = null; public SqlLockService(DataSource dataSource, String lockRepositoryName) { this.dataSource = dataSource; this.lockRepositoryName = lockRepositoryName; - this.dialectHelper = new SqlLockDialectHelper(dataSource); } public void initialize(boolean autoCreate) { if (autoCreate) { try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement()) { + this.dialectHelper = new SqlLockDialectHelper(conn); stmt.executeUpdate(dialectHelper.getCreateTableSqlString(lockRepositoryName)); } catch (SQLException e) { // For Informix, ignore "Table or view already exists" error (SQLCODE -310) diff --git a/core/target-systems/sql-target-system/src/main/java/io/flamingock/targetsystem/sql/SqlAuditMarkerDialectHelper.java b/core/target-systems/sql-target-system/src/main/java/io/flamingock/targetsystem/sql/SqlAuditMarkerDialectHelper.java index a3cb5792e..852e7b9fe 100644 --- a/core/target-systems/sql-target-system/src/main/java/io/flamingock/targetsystem/sql/SqlAuditMarkerDialectHelper.java +++ b/core/target-systems/sql-target-system/src/main/java/io/flamingock/targetsystem/sql/SqlAuditMarkerDialectHelper.java @@ -18,12 +18,12 @@ import io.flamingock.internal.common.sql.AbstractSqlDialectHelper; import io.flamingock.internal.common.sql.SqlDialect; -import javax.sql.DataSource; +import java.sql.Connection; public final class SqlAuditMarkerDialectHelper extends AbstractSqlDialectHelper { - public SqlAuditMarkerDialectHelper(DataSource dataSource) { - super(dataSource); + public SqlAuditMarkerDialectHelper(Connection connection) { + super(connection); } public SqlAuditMarkerDialectHelper(SqlDialect dialect) { diff --git a/core/target-systems/sql-target-system/src/main/java/io/flamingock/targetsystem/sql/SqlTargetSystemAuditMarker.java b/core/target-systems/sql-target-system/src/main/java/io/flamingock/targetsystem/sql/SqlTargetSystemAuditMarker.java index 5496a452f..385fddd7c 100644 --- a/core/target-systems/sql-target-system/src/main/java/io/flamingock/targetsystem/sql/SqlTargetSystemAuditMarker.java +++ b/core/target-systems/sql-target-system/src/main/java/io/flamingock/targetsystem/sql/SqlTargetSystemAuditMarker.java @@ -113,7 +113,6 @@ public static class Builder { public Builder(DataSource dataSource, TransactionManager txManager) { this.dataSource = dataSource; this.txManager = txManager; - this.dialectHelper = new SqlAuditMarkerDialectHelper(dataSource); } public Builder withTableName(String tableName) { @@ -132,6 +131,11 @@ public Builder withSqlDialect(SqlDialect sqlDialect) { } public SqlTargetSystemAuditMarker build() { + try (Connection connection = dataSource.getConnection()) { + this.dialectHelper = new SqlAuditMarkerDialectHelper(connection); + } catch (SQLException ex) { + throw new FlamingockException(ex); + } if (autoCreate) { createTableIfNotExists(); } diff --git a/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/AbstractSqlDialectHelper.java b/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/AbstractSqlDialectHelper.java index b5a9d1f52..d66529586 100644 --- a/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/AbstractSqlDialectHelper.java +++ b/utils/sql-util/src/main/java/io/flamingock/internal/common/sql/AbstractSqlDialectHelper.java @@ -15,7 +15,6 @@ */ package io.flamingock.internal.common.sql; -import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; @@ -23,14 +22,6 @@ public class AbstractSqlDialectHelper { protected static SqlDialect sqlDialect; - public AbstractSqlDialectHelper(DataSource dataSource) { - try { - sqlDialect = fromDatabaseProductName(dataSource.getConnection().getMetaData().getDatabaseProductName()); - } catch (SQLException e) { - throw new IllegalStateException("Unable to obtain database product name from DataSource", e); - } - } - public AbstractSqlDialectHelper(SqlDialect sqlDialect) { this.sqlDialect = sqlDialect; } From 3bca78f84160fd1855269d749f18c84220c671a2 Mon Sep 17 00:00:00 2001 From: bercianor Date: Mon, 2 Feb 2026 18:13:14 +0000 Subject: [PATCH 3/4] fix: initialize dialectHelper always --- .../store/sql/internal/SqlAuditor.java | 28 +++++++------- .../store/sql/internal/SqlLockService.java | 38 +++++++++---------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java index 73800614f..83d86794b 100644 --- a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java +++ b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java @@ -41,24 +41,24 @@ public SqlAuditor(DataSource dataSource, String auditTableName, boolean autoCrea } public void initialize() { - if (autoCreate) { - try (Connection conn = dataSource.getConnection(); - Statement stmt = conn.createStatement()) { - this.dialectHelper = new SqlAuditorDialectHelper(conn); + try (Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement()) { + this.dialectHelper = new SqlAuditorDialectHelper(conn); + if (autoCreate) { stmt.executeUpdate(dialectHelper.getCreateTableSqlString(auditTableName)); - } catch (SQLException e) { - // Firebird throws an error when table already exists; ignore that specific case - if (dialectHelper.getSqlDialect() == SqlDialect.FIREBIRD) { - int errorCode = e.getErrorCode(); - String sqlState = e.getSQLState(); - String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : ""; + } + } catch (SQLException e) { + // Firebird throws an error when table already exists; ignore that specific case + if (dialectHelper.getSqlDialect() == SqlDialect.FIREBIRD) { + int errorCode = e.getErrorCode(); + String sqlState = e.getSQLState(); + String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : ""; - if (errorCode == 335544351 || "42000".equals(sqlState) || msg.contains("already exists")) { - return; - } + if (errorCode == 335544351 || "42000".equals(sqlState) || msg.contains("already exists")) { + return; } - throw new RuntimeException("Failed to initialize audit table", e); } + throw new RuntimeException("Failed to initialize audit table", e); } } diff --git a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java index 04c43d4a6..e2efef52c 100644 --- a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java +++ b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java @@ -40,29 +40,29 @@ public SqlLockService(DataSource dataSource, String lockRepositoryName) { } public void initialize(boolean autoCreate) { - if (autoCreate) { - try (Connection conn = dataSource.getConnection(); - Statement stmt = conn.createStatement()) { - this.dialectHelper = new SqlLockDialectHelper(conn); + try (Connection conn = dataSource.getConnection(); + Statement stmt = conn.createStatement()) { + this.dialectHelper = new SqlLockDialectHelper(conn); + if (autoCreate) { stmt.executeUpdate(dialectHelper.getCreateTableSqlString(lockRepositoryName)); - } catch (SQLException e) { - // For Informix, ignore "Table or view already exists" error (SQLCODE -310) - if (dialectHelper.getSqlDialect() == SqlDialect.INFORMIX && - (e.getErrorCode() == -310 || e.getSQLState() != null && e.getSQLState().startsWith("42S01"))) { - return; - } - // Firebird throws an error when table already exists; ignore that specific case - if (dialectHelper.getSqlDialect() == io.flamingock.internal.common.sql.SqlDialect.FIREBIRD) { - int errorCode = e.getErrorCode(); - String sqlState = e.getSQLState(); - String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : ""; + } + } catch (SQLException e) { + // For Informix, ignore "Table or view already exists" error (SQLCODE -310) + if (dialectHelper.getSqlDialect() == SqlDialect.INFORMIX && + (e.getErrorCode() == -310 || e.getSQLState() != null && e.getSQLState().startsWith("42S01"))) { + return; + } + // Firebird throws an error when table already exists; ignore that specific case + if (dialectHelper.getSqlDialect() == io.flamingock.internal.common.sql.SqlDialect.FIREBIRD) { + int errorCode = e.getErrorCode(); + String sqlState = e.getSQLState(); + String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : ""; - if (errorCode == 335544351 || "42000".equals(sqlState) || msg.contains("already exists")) { - return; - } + if (errorCode == 335544351 || "42000".equals(sqlState) || msg.contains("already exists")) { + return; } - throw new RuntimeException("Failed to initialize lock table", e); } + throw new RuntimeException("Failed to initialize lock table", e); } } From cc71453a146d445b45526ed48386f6273fda07e1 Mon Sep 17 00:00:00 2001 From: bercianor Date: Mon, 2 Feb 2026 19:49:08 +0000 Subject: [PATCH 4/4] fix: check if dialectHelper is null --- .../java/io/flamingock/store/sql/internal/SqlAuditor.java | 4 ++-- .../java/io/flamingock/store/sql/internal/SqlLockService.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java index 83d86794b..ed716c199 100644 --- a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java +++ b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlAuditor.java @@ -49,7 +49,7 @@ public void initialize() { } } catch (SQLException e) { // Firebird throws an error when table already exists; ignore that specific case - if (dialectHelper.getSqlDialect() == SqlDialect.FIREBIRD) { + if (dialectHelper != null && dialectHelper.getSqlDialect() == SqlDialect.FIREBIRD) { int errorCode = e.getErrorCode(); String sqlState = e.getSQLState(); String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : ""; @@ -69,7 +69,7 @@ public Result writeEntry(AuditEntry auditEntry) { conn = dataSource.getConnection(); // For Informix, ensure autoCommit is enabled for audit writes - if (dialectHelper.getSqlDialect() == SqlDialect.INFORMIX) { + if (dialectHelper != null && dialectHelper.getSqlDialect() == SqlDialect.INFORMIX) { conn.setAutoCommit(true); } diff --git a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java index e2efef52c..52ce8a36c 100644 --- a/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java +++ b/community/flamingock-auditstore-sql/src/main/java/io/flamingock/store/sql/internal/SqlLockService.java @@ -48,12 +48,12 @@ public void initialize(boolean autoCreate) { } } catch (SQLException e) { // For Informix, ignore "Table or view already exists" error (SQLCODE -310) - if (dialectHelper.getSqlDialect() == SqlDialect.INFORMIX && + if (dialectHelper != null && dialectHelper.getSqlDialect() == SqlDialect.INFORMIX && (e.getErrorCode() == -310 || e.getSQLState() != null && e.getSQLState().startsWith("42S01"))) { return; } // Firebird throws an error when table already exists; ignore that specific case - if (dialectHelper.getSqlDialect() == io.flamingock.internal.common.sql.SqlDialect.FIREBIRD) { + if (dialectHelper != null && dialectHelper.getSqlDialect() == SqlDialect.FIREBIRD) { int errorCode = e.getErrorCode(); String sqlState = e.getSQLState(); String msg = e.getMessage() != null ? e.getMessage().toLowerCase() : "";