diff --git a/src/Persistence/PostgresqlTests/Bugs/Bug_1516_get_the_schema_names_right.cs b/src/Persistence/PostgresqlTests/Bugs/Bug_1516_get_the_schema_names_right.cs new file mode 100644 index 000000000..d43e5c60f --- /dev/null +++ b/src/Persistence/PostgresqlTests/Bugs/Bug_1516_get_the_schema_names_right.cs @@ -0,0 +1,47 @@ +using System.Diagnostics; +using IntegrationTests; +using JasperFx.Core; +using Microsoft.Extensions.Hosting; +using Shouldly; +using Wolverine; +using Wolverine.ComplianceTests.Compliance; +using Wolverine.Postgresql; +using Wolverine.Tracking; + +namespace PostgresqlTests.Bugs; + +public class Bug_1516_get_the_schema_names_right : PostgresqlContext +{ + [Fact] + public async Task get_the_bleeping_schema_names_right() + { + using var host = await Host.CreateDefaultBuilder() + .UseWolverine(o => + { + o.PersistMessagesWithPostgresql(Servers.PostgresConnectionString, "ops") + .SchemaName("ops") + .EnableMessageTransport(x => x.TransportSchemaName("queues").AutoProvision()); + + o.PublishAllMessages().ToPostgresqlQueue("outbound"); + o.ListenToPostgresqlQueue("outbound"); + }).StartAsync(); + + var tracked = await host.TrackActivity().IncludeExternalTransports().Timeout(30.Seconds()) + .SendMessageAndWaitAsync(new TraceMessage { Name = "Tom Landry" }); + + tracked.Executed.SingleMessage().Name.ShouldBe("Tom Landry"); + } +} + +public class TraceMessage +{ + public string Name { get; set; } +} + +public class TraceHandler +{ + public void Handle(TraceMessage message) + { + Debug.WriteLine("Got message with " + message.Name); + } +} \ No newline at end of file diff --git a/src/Persistence/Wolverine.Postgresql/PostgresqlBackedPersistence.cs b/src/Persistence/Wolverine.Postgresql/PostgresqlBackedPersistence.cs index e33d11424..a0e98c126 100644 --- a/src/Persistence/Wolverine.Postgresql/PostgresqlBackedPersistence.cs +++ b/src/Persistence/Wolverine.Postgresql/PostgresqlBackedPersistence.cs @@ -110,10 +110,15 @@ public interface IPostgresqlBackedPersistence /// internal class PostgresqlBackedPersistence : IPostgresqlBackedPersistence, IWolverineExtension { - public PostgresqlBackedPersistence(DurabilitySettings settings) + private readonly WolverineOptions _options; + + public PostgresqlBackedPersistence(DurabilitySettings settings, WolverineOptions options) { + _options = options; EnvelopeStorageSchemaName = settings.MessageStorageSchemaName ?? "wolverine"; } + + internal bool AlreadyIncluded { get; set; } // Gotta have one or the other. Maybe even just DbDataSource here public NpgsqlDataSource? DataSource { get; set; } @@ -227,7 +232,17 @@ public IPostgresqlBackedPersistence EnableMessageTransport(Action(); + + var expression = new PostgresqlPersistenceExpression(transport, _options); + configure(expression); + } + else + { + _transportConfigurations.Add(configure); + } } return this; } @@ -240,6 +255,7 @@ IPostgresqlBackedPersistence IPostgresqlBackedPersistence.OverrideAutoCreateReso IPostgresqlBackedPersistence IPostgresqlBackedPersistence.SchemaName(string schemaName) { + schemaName.AssertValidSchemaName(); EnvelopeStorageSchemaName = schemaName; return this; } @@ -305,4 +321,6 @@ IPostgresqlBackedPersistence IPostgresqlBackedPersistence.UseMasterTableTenancy( /// This is any default connection strings by tenant that should be loaded at start up time /// public StaticConnectionStringSource? TenantConnections { get; set; } + + } \ No newline at end of file diff --git a/src/Persistence/Wolverine.Postgresql/PostgresqlConfigurationExtensions.cs b/src/Persistence/Wolverine.Postgresql/PostgresqlConfigurationExtensions.cs index 7fb5985f7..df7b24905 100644 --- a/src/Persistence/Wolverine.Postgresql/PostgresqlConfigurationExtensions.cs +++ b/src/Persistence/Wolverine.Postgresql/PostgresqlConfigurationExtensions.cs @@ -37,9 +37,10 @@ internal static void AssertValidSchemaName(this string schemaName) public static IPostgresqlBackedPersistence PersistMessagesWithPostgresql(this WolverineOptions options, string connectionString, string? schemaName = null) { - var persistence = new PostgresqlBackedPersistence(options.Durability) + var persistence = new PostgresqlBackedPersistence(options.Durability, options) { ConnectionString = connectionString, + AlreadyIncluded = true }; if (schemaName.IsNotEmpty()) @@ -62,7 +63,7 @@ public static IPostgresqlBackedPersistence PersistMessagesWithPostgresql(this Wo public static IPostgresqlBackedPersistence PersistMessagesWithPostgresql(this WolverineOptions options, NpgsqlDataSource dataSource, string? schemaName = null) { - var persistence = new PostgresqlBackedPersistence(options.Durability) + var persistence = new PostgresqlBackedPersistence(options.Durability, options) { DataSource = dataSource }; @@ -75,6 +76,8 @@ public static IPostgresqlBackedPersistence PersistMessagesWithPostgresql(this Wo options.Include(persistence); + persistence.AlreadyIncluded = true; + return persistence; } diff --git a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlTransport.cs b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlTransport.cs index 80eeeee31..0bbbaf39e 100644 --- a/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlTransport.cs +++ b/src/Persistence/Wolverine.Postgresql/Transport/PostgresqlTransport.cs @@ -45,6 +45,8 @@ public async ValueTask ConfigureAsync(IWolverineRuntime runtime) store.AddTable(queue.ScheduledTable); } + MessageStorageSchemaName = store.SchemaName; + Store = store; } else if (runtime.Storage is MultiTenantedMessageStore tenants) @@ -57,6 +59,8 @@ await source.ConfigureDatabaseAsync(messageStore => { if (messageStore is PostgresqlMessageStore s) { + MessageStorageSchemaName = s.SchemaName; + foreach (var queue in Queues) { s.AddTable(queue.QueueTable);