diff --git a/spring-modulith-events/spring-modulith-events-jdbc/pom.xml b/spring-modulith-events/spring-modulith-events-jdbc/pom.xml index 4570d36b..0090cf0b 100644 --- a/spring-modulith-events/spring-modulith-events-jdbc/pom.xml +++ b/spring-modulith-events/spring-modulith-events-jdbc/pom.xml @@ -104,6 +104,18 @@ test + + org.testcontainers + mssqlserver + test + + + + com.microsoft.sqlserver + mssql-jdbc + test + + org.hsqldb hsqldb 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 35f572cf..2c5b43f2 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 @@ -45,7 +45,20 @@ enum DatabaseType { } }, - POSTGRES("postgresql", "PostgreSQL"); + POSTGRES("postgresql", "PostgreSQL"), + + MSSQL("sqlserver", "Microsoft SQL Server"){ + + @Override + Object uuidToDatabase(UUID id) { + return id.toString(); + } + + @Override + UUID databaseToUUID(Object id) { + return UUID.fromString(id.toString()); + } + }; static final String SCHEMA_NOT_SUPPORTED = "Setting the schema name not supported on MySQL!"; @@ -86,6 +99,7 @@ enum DatabaseType { case MYSQL -> throw new IllegalArgumentException(SCHEMA_NOT_SUPPORTED); case H2, HSQLDB -> "SET SCHEMA " + schema; case POSTGRES -> "SET search_path TO " + schema; + case MSSQL -> ""; // No equivalent schema-switching command in MSSQL }; } } diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-sqlserver.sql b/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-sqlserver.sql new file mode 100644 index 00000000..92fefec5 --- /dev/null +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/main/resources/schema-sqlserver.sql @@ -0,0 +1,12 @@ +IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'EVENT_PUBLICATION') +CREATE TABLE EVENT_PUBLICATION +( + ID VARCHAR(36) NOT NULL, + LISTENER_ID VARCHAR(512) NOT NULL, + EVENT_TYPE VARCHAR(512) NOT NULL, + SERIALIZED_EVENT VARCHAR(MAX) NOT NULL, + PUBLICATION_DATE DATETIME2(6) NOT NULL, + COMPLETION_DATE DATETIME2(6) NULL, + PRIMARY KEY (ID), + INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE) +); \ No newline at end of file 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 39cd35b4..a241ed6c 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 @@ -122,4 +122,8 @@ class DatabaseSchemaInitializerIntegrationTests { @Nested @ActiveProfiles("mysql") class MySQL extends WithInitEnabled {} + + @Nested + @ActiveProfiles("mssql") + class MSSQL 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 4c6edcb2..710ced0e 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 @@ -453,6 +453,16 @@ class JdbcEventPublicationRepositoryIntegrationTests { @WithPostgres class PostgresWithDeleteCompletion extends WithDeleteCompletion {} + // MSSQL + @WithMssql + class MssqlWithNoDefinedSchemaName extends WithNoDefinedSchemaName {} + + @WithMssql + class MssqlWithEmptySchemaName extends WithEmptySchemaName {} + + @WithMssql + class MssqlWithDeleteCompletion extends WithDeleteCompletion {} + // MySQL @WithMySql @@ -489,4 +499,9 @@ class JdbcEventPublicationRepositoryIntegrationTests { @ActiveProfiles("postgres") @Retention(RetentionPolicy.RUNTIME) @interface WithPostgres {} + + @Nested + @ActiveProfiles("mssql") + @Retention(RetentionPolicy.RUNTIME) + @interface WithMssql {} } diff --git a/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-mssql.properties b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-mssql.properties new file mode 100644 index 00000000..e7c19b6c --- /dev/null +++ b/spring-modulith-events/spring-modulith-events-jdbc/src/test/resources/application-mssql.properties @@ -0,0 +1,2 @@ +spring.datasource.url=jdbc:tc:sqlserver:2022-latest:///events;encrypt=false;TC_ACCEPT_LICENSE=accept +spring.datasource.driverClassName=org.testcontainers.jdbc.ContainerDatabaseDriver \ No newline at end of file