diff --git a/spring-modulith-events/spring-modulith-events-jdbc/pom.xml b/spring-modulith-events/spring-modulith-events-jdbc/pom.xml index ab264c5c..86dd607a 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/pom.xml +++ b/spring-modulith-events/spring-modulith-events-jdbc/pom.xml @@ -116,6 +116,12 @@ test + + org.testcontainers + oracle-free + test + + com.microsoft.sqlserver mssql-jdbc @@ -152,6 +158,12 @@ test + + com.oracle.database.jdbc + ojdbc11 + test + + diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/DatabaseType.java b/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/DatabaseType.java index 7a0e8513..6d2c091d 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/DatabaseType.java +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/DatabaseType.java @@ -82,6 +82,24 @@ enum DatabaseType { return UUID.fromString(id.toString()); } + @Override + boolean isSchemaSupported() { + return false; + } + }, + + ORACLE("oracle", "Oracle") { + + @Override + Object uuidToDatabase(UUID id) { + return id.toString(); + } + + @Override + UUID databaseToUUID(Object id) { + return UUID.fromString(id.toString()); + } + @Override boolean isSchemaSupported() { return false; diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepository.java b/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepository.java index 25cfa455..7c71ee60 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepository.java +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/main/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepository.java @@ -400,7 +400,7 @@ class JdbcEventPublicationRepository implements EventPublicationRepository, Bean var completionDate = rs.getTimestamp("COMPLETION_DATE"); var publicationDate = rs.getTimestamp("PUBLICATION_DATE").toInstant(); var listenerId = rs.getString("LISTENER_ID"); - var serializedEvent = rs.getString("SERIALIZED_EVENT"); + var serializedEvent = Optional.ofNullable(rs.getString("SERIALIZED_EVENT")).orElse(""); return new JdbcEventPublication(id, publicationDate, listenerId, () -> serializer.deserialize(serializedEvent, eventClass), diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-oracle.sql b/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-oracle.sql new file mode 100644 index 00000000..9f25536c --- /dev/null +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-oracle.sql @@ -0,0 +1,11 @@ +-- oracle database support 'create xx if not exists' from 23c, lower version should create table and index manually +CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION ( + ID VARCHAR2(36) NOT NULL, + LISTENER_ID VARCHAR2(512) NOT NULL, + EVENT_TYPE VARCHAR2(512) NOT NULL, + SERIALIZED_EVENT VARCHAR2(4000), + PUBLICATION_DATE TIMESTAMP(6) NOT NULL, + COMPLETION_DATE TIMESTAMP(6), + CONSTRAINT EVENT_PUBLICATION_PK PRIMARY KEY(ID) +); +CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE); diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/DatabaseSchemaInitializerIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/DatabaseSchemaInitializerIntegrationTests.java index 86dd9d5f..b63a320d 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/DatabaseSchemaInitializerIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/DatabaseSchemaInitializerIntegrationTests.java @@ -130,4 +130,8 @@ class DatabaseSchemaInitializerIntegrationTests { @Nested @ActiveProfiles("mssql") class MSSQL extends WithInitEnabled {} + + @Nested + @ActiveProfiles("oracle") + class Oracle extends WithInitEnabled {} } diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepositoryIntegrationTests.java b/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepositoryIntegrationTests.java index 4e77f087..bbe15631 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepositoryIntegrationTests.java +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/java/org/springframework/modulith/events/jdbc/JdbcEventPublicationRepositoryIntegrationTests.java @@ -476,6 +476,14 @@ class JdbcEventPublicationRepositoryIntegrationTests { @WithMariaDB class MariaDBWithDeleteCompletion extends WithDeleteCompletion {} + + // Oracle + + @WithOracle + class OracleWithNoDefinedSchemaName extends WithNoDefinedSchemaName {} + + @WithOracle + class OracleWithDeleteCompletion extends WithDeleteCompletion {} @Value private static final class TestEvent { @@ -515,4 +523,9 @@ class JdbcEventPublicationRepositoryIntegrationTests { @ActiveProfiles("mssql") @Retention(RetentionPolicy.RUNTIME) @interface WithMssql {} + + @Nested + @ActiveProfiles("oracle") + @Retention(RetentionPolicy.RUNTIME) + @interface WithOracle {} } diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-oracle.properties b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-oracle.properties new file mode 100644 index 00000000..f39d8172 --- /dev/null +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-oracle.properties @@ -0,0 +1,2 @@ +spring.datasource.url=jdbc:tc:oracle:23-slim-faststart:///events +spring.datasource.driverClassName=org.testcontainers.jdbc.ContainerDatabaseDriver