@@ -6,6 +6,7 @@ namespace ServiceControl.Audit.Persistence.PostgreSQL;
66using System . Text . Json ;
77using System . Threading ;
88using System . Threading . Tasks ;
9+ using Microsoft . IO ;
910using Npgsql ;
1011using NServiceBus ;
1112using ServiceControl . Audit . Auditing ;
@@ -19,21 +20,25 @@ namespace ServiceControl.Audit.Persistence.PostgreSQL;
1920
2021class PostgreSQLAuditDataStore ( PostgreSQLConnectionFactory connectionFactory ) : IAuditDataStore
2122{
23+ static readonly RecyclableMemoryStreamManager manager = new RecyclableMemoryStreamManager ( ) ;
24+
2225 public async Task < MessageBodyView > GetMessageBody ( string messageId , CancellationToken cancellationToken )
2326 {
24- using var conn = await connectionFactory . OpenConnection ( cancellationToken ) ;
25- using var cmd = new NpgsqlCommand ( @"
26- select body, headers from processed_messages
27+ await using var conn = await connectionFactory . OpenConnection ( cancellationToken ) ;
28+ await using var cmd = new NpgsqlCommand ( @"
29+ select headers, body from processed_messages
2730 where message_id = @message_id
2831 LIMIT 1;" , conn ) ;
2932 cmd . Parameters . AddWithValue ( "message_id" , messageId ) ;
30- using var reader = await cmd . ExecuteReaderAsync ( cancellationToken ) ;
33+ await using var reader = await cmd . ExecuteReaderAsync ( System . Data . CommandBehavior . SequentialAccess , cancellationToken ) ;
3134 if ( await reader . ReadAsync ( cancellationToken ) )
3235 {
33- //var stream = await reader.GetStreamAsync(reader.GetOrdinal("body"), cancellationToken);
34- var stream = reader . GetStream ( reader . GetOrdinal ( "body" ) ) ;
3536 var contentType = reader . GetFieldValue < Dictionary < string , string > > ( reader . GetOrdinal ( "headers" ) ) . GetValueOrDefault ( Headers . ContentType , "text/xml" ) ;
36- return MessageBodyView . FromStream ( stream , contentType , ( int ) stream . Length , string . Empty ) ;
37+ using var stream = await reader . GetStreamAsync ( reader . GetOrdinal ( "body" ) , cancellationToken ) ;
38+ var responseStream = manager . GetStream ( ) ;
39+ await stream . CopyToAsync ( responseStream , cancellationToken ) ;
40+ responseStream . Position = 0 ;
41+ return MessageBodyView . FromStream ( responseStream , contentType , ( int ) stream . Length , string . Empty ) ;
3742 }
3843 return MessageBodyView . NotFound ( ) ;
3944 }
@@ -52,8 +57,8 @@ public async Task<QueryResult<IList<AuditCount>>> QueryAuditCounts(string endpoi
5257 {
5358 var startDate = DateTime . UtcNow . AddDays ( - 30 ) ;
5459 var endDate = DateTime . UtcNow ;
55- using var connection = await connectionFactory . OpenConnection ( cancellationToken ) ;
56- using var cmd = new NpgsqlCommand ( @"
60+ await using var connection = await connectionFactory . OpenConnection ( cancellationToken ) ;
61+ await using var cmd = new NpgsqlCommand ( @"
5762 SELECT
5863 DATE_TRUNC('day', processed_at) AS day,
5964 COUNT(*) AS count
@@ -66,7 +71,7 @@ GROUP BY day
6671 cmd . Parameters . AddWithValue ( "start_date" , startDate ) ;
6772 cmd . Parameters . AddWithValue ( "end_date" , endDate ) ;
6873
69- using var reader = await cmd . ExecuteReaderAsync ( cancellationToken ) ;
74+ await using var reader = await cmd . ExecuteReaderAsync ( cancellationToken ) ;
7075 var results = new List < AuditCount > ( ) ;
7176 while ( await reader . ReadAsync ( cancellationToken ) )
7277 {
@@ -83,8 +88,8 @@ GROUP BY day
8388 public async Task < QueryResult < IList < KnownEndpointsView > > > QueryKnownEndpoints ( CancellationToken cancellationToken )
8489 {
8590 // We need to return all the data from known_endpoints table in postgress
86- using var connection = await connectionFactory . OpenConnection ( cancellationToken ) ;
87- using var cmd = new NpgsqlCommand ( @"
91+ await using var connection = await connectionFactory . OpenConnection ( cancellationToken ) ;
92+ await using var cmd = new NpgsqlCommand ( @"
8893 SELECT
8994 id,
9095 name,
@@ -93,7 +98,7 @@ public async Task<QueryResult<IList<KnownEndpointsView>>> QueryKnownEndpoints(Ca
9398 last_seen
9499 FROM known_endpoints;" , connection ) ;
95100
96- using var reader = await cmd . ExecuteReaderAsync ( cancellationToken ) ;
101+ await using var reader = await cmd . ExecuteReaderAsync ( cancellationToken ) ;
97102 var results = new List < KnownEndpointsView > ( ) ;
98103 while ( await reader . ReadAsync ( cancellationToken ) )
99104 {
@@ -164,9 +169,9 @@ async Task<QueryResult<IList<MessagesView>>> ExecuteMessagesQuery(
164169 PostgresqlMessagesQueryBuilder builder ,
165170 CancellationToken cancellationToken )
166171 {
167- using var conn = await connectionFactory . OpenConnection ( cancellationToken ) ;
172+ await using var conn = await connectionFactory . OpenConnection ( cancellationToken ) ;
168173 var ( query , parameters ) = builder . Build ( ) ;
169- using var cmd = new NpgsqlCommand ( query , conn ) ;
174+ await using var cmd = new NpgsqlCommand ( query , conn ) ;
170175 foreach ( var param in parameters )
171176 {
172177 cmd . Parameters . Add ( param ) ;
@@ -193,7 +198,7 @@ static T GetValue<T>(NpgsqlDataReader reader, string column)
193198 async Task < QueryResult < IList < MessagesView > > > ReturnResults ( NpgsqlCommand cmd , CancellationToken cancellationToken = default )
194199 {
195200 var results = new List < MessagesView > ( ) ;
196- using var reader = await cmd . ExecuteReaderAsync ( cancellationToken ) ;
201+ await using var reader = await cmd . ExecuteReaderAsync ( cancellationToken ) ;
197202 while ( await reader . ReadAsync ( cancellationToken ) )
198203 {
199204 var headers = GetValue < Dictionary < string , string > > ( reader , "headers" ) ;
0 commit comments