Skip to content

Commit b71683a

Browse files
committed
* Finished all unit tests for SqlLogEventWriter.
* Reduced dependency on SqlClient library only to three classes (SqlBulkCopyWrapper, SqlCommandWrapper, SqlConnectionWrapper) and moved them to namespace Platform.SqlClient. * All tests in SqlTableCreatorTests are now unit tests.
1 parent 2cd6dfa commit b71683a

21 files changed

+324
-181
lines changed

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Dependencies/SinkDependenciesFactory.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ internal static SinkDependencies Create(
2121

2222
var sqlConnectionFactory =
2323
new SqlConnectionFactory(connectionString,
24+
sinkOptions?.UseAzureManagedIdentity ?? default,
2425
new AzureManagedServiceAuthenticator(
2526
sinkOptions?.UseAzureManagedIdentity ?? default,
2627
sinkOptions.AzureServiceTokenProviderResource));

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/AzureManagedServiceAuthenticator.cs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
using System;
2-
#if NET452
3-
using System.Data.SqlClient;
4-
#else
5-
using Microsoft.Data.SqlClient;
6-
#endif
2+
using System.Threading.Tasks;
73
using Microsoft.Azure.Services.AppAuthentication;
84

95
namespace Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform
@@ -26,15 +22,14 @@ public AzureManagedServiceAuthenticator(bool useAzureManagedIdentity, string azu
2622
_azureServiceTokenProvider = new AzureServiceTokenProvider();
2723
}
2824

29-
public void SetAuthenticationToken(SqlConnection sqlConnection)
25+
public Task<string> GetAuthenticationToken()
3026
{
3127
if (!_useAzureManagedIdentity)
3228
{
33-
return;
29+
return Task.FromResult((string)null);
3430
}
3531

36-
sqlConnection.AccessToken = _azureServiceTokenProvider.GetAccessTokenAsync(
37-
_azureServiceTokenProviderResource).GetAwaiter().GetResult();
32+
return _azureServiceTokenProvider.GetAccessTokenAsync(_azureServiceTokenProviderResource);
3833
}
3934
}
4035
}

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/AzureManagedServiceAuthenticatorStub.cs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
using System;
2-
#if NET452
3-
using System.Data.SqlClient;
4-
#else
5-
using Microsoft.Data.SqlClient;
6-
#endif
7-
2+
using System.Threading.Tasks;
83
using System.Diagnostics.CodeAnalysis;
94

105
// This is an empty stub implementaion of IAzureManagedServiceAuthenticator for the target frameworks
@@ -29,8 +24,6 @@ public AzureManagedServiceAuthenticator(bool useAzureManagedIdentity, string azu
2924
_azureServiceTokenProviderResource = azureServiceTokenProviderResource;
3025
}
3126

32-
public void SetAuthenticationToken(SqlConnection sqlConnection)
33-
{
34-
}
27+
public Task<string> GetAuthenticationToken() => Task.FromResult((string)null);
3528
}
3629
}
Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,9 @@
1-
#if NET452
2-
using System.Data.SqlClient;
3-
#else
4-
using Microsoft.Data.SqlClient;
5-
#endif
1+
using System.Threading.Tasks;
62

73
namespace Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform
84
{
95
internal interface IAzureManagedServiceAuthenticator
106
{
11-
void SetAuthenticationToken(SqlConnection sqlConnection);
7+
Task<string> GetAuthenticationToken();
128
}
139
}

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/ISqlConnectionFactory.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform
1+
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform.SqlClient;
2+
3+
namespace Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform
24
{
35
internal interface ISqlConnectionFactory
46
{

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/ISqlConnectionWrapper.cs

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/SqlBulkBatchWriter.cs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Data;
4-
#if NET452
5-
using System.Data.SqlClient;
6-
#else
7-
using Microsoft.Data.SqlClient;
8-
#endif
94
using System.Globalization;
105
using System.Linq;
116
using System.Threading.Tasks;
@@ -47,17 +42,13 @@ public async Task WriteBatch(IEnumerable<LogEvent> events, DataTable dataTable)
4742
using (var cn = _sqlConnectionFactory.Create())
4843
{
4944
await cn.OpenAsync().ConfigureAwait(false);
50-
using (var copy = _disableTriggers
51-
? new SqlBulkCopy(cn.SqlConnection)
52-
: new SqlBulkCopy(cn.SqlConnection, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers, null)
53-
)
45+
using (var copy = cn.CreateSqlBulkCopy(_disableTriggers,
46+
string.Format(CultureInfo.InvariantCulture, "[{0}].[{1}]", _schemaName, _tableName)))
5447
{
55-
copy.DestinationTableName = string.Format(CultureInfo.InvariantCulture, "[{0}].[{1}]", _schemaName, _tableName);
5648
foreach (var column in dataTable.Columns)
5749
{
5850
var columnName = ((DataColumn)column).ColumnName;
59-
var mapping = new SqlBulkCopyColumnMapping(columnName, columnName);
60-
copy.ColumnMappings.Add(mapping);
51+
copy.AddSqlBulkCopyColumnMapping(columnName, columnName);
6152
}
6253

6354
await copy.WriteToServerAsync(dataTable).ConfigureAwait(false);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System;
2+
using System.Data;
3+
using System.Threading.Tasks;
4+
5+
namespace Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform.SqlClient
6+
{
7+
internal interface ISqlBulkCopyWrapper : IDisposable
8+
{
9+
void AddSqlBulkCopyColumnMapping(string sourceColumn, string destinationColumn);
10+
Task WriteToServerAsync(DataTable table);
11+
}
12+
}

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/ISqlCommandWrapper.cs renamed to src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/SqlClient/ISqlCommandWrapper.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Data;
43

5-
namespace Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform
4+
namespace Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform.SqlClient
65
{
76
internal interface ISqlCommandWrapper : IDisposable
87
{
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
4+
namespace Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform.SqlClient
5+
{
6+
internal interface ISqlConnectionWrapper : IDisposable
7+
{
8+
string ConnectionString { get; }
9+
10+
void Open();
11+
Task OpenAsync();
12+
ISqlCommandWrapper CreateCommand();
13+
ISqlCommandWrapper CreateCommand(string cmdText);
14+
ISqlBulkCopyWrapper CreateSqlBulkCopy(bool disableTriggers, string destinationTableName);
15+
}
16+
}

0 commit comments

Comments
 (0)