Skip to content

Commit 1f7f7d2

Browse files
committed
Introduce DatabaseAccessorOptions, and with it, add support for suppressing UDT parameter value dump collection for operations with large UDTs
1 parent ed43c8c commit 1f7f7d2

45 files changed

Lines changed: 321 additions & 210 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

shared/Hosting/Data/ScopedDatabaseAccessorFactory.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ public ScopedDatabaseAccessorFactory(IDatabaseConnectionResolver connectionResol
1515
_logger = loggerFactory();
1616
}
1717

18-
public IDatabaseAccessor Create()
18+
public IDatabaseAccessor Create(DatabaseAccessorOptions options)
1919
{
2020
DbConnection connection = _connectionResolver.Resolve();
21-
return new LoggingDapperDatabaseAccessor(connection, _logger);
21+
return new LoggingDapperDatabaseAccessor(connection, options, _logger);
2222
}
2323

2424
private sealed class LoggingDapperDatabaseAccessor : DapperDatabaseAccessor
2525
{
2626
private readonly ILogger _logger;
2727

28-
public LoggingDapperDatabaseAccessor(DbConnection connection, ILogger logger) : base(connection)
28+
public LoggingDapperDatabaseAccessor(DbConnection connection, DatabaseAccessorOptions options, ILogger logger) : base(connection, options)
2929
{
3030
_logger = logger;
3131
}

src/Dibix.Dapper/DapperDatabaseAccessor.cs

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,85 +10,76 @@ namespace Dibix.Dapper
1010
{
1111
public class DapperDatabaseAccessor : DatabaseAccessor, IDatabaseAccessor, IDisposable
1212
{
13-
#region Fields
14-
private readonly IDbTransaction _defaultTransaction;
15-
private readonly int? _defaultCommandTimeout;
16-
private readonly Action _onDispose;
17-
#endregion
18-
1913
#region Constructor
20-
public DapperDatabaseAccessor(DbConnection connection, IDbTransaction defaultTransaction = null, int? defaultCommandTimeout = null, Action onDispose = null) : base(connection)
14+
public DapperDatabaseAccessor(DbConnection connection, DatabaseAccessorOptions options) : base(connection, options)
2115
{
22-
_defaultTransaction = defaultTransaction;
23-
_defaultCommandTimeout = defaultCommandTimeout;
24-
_onDispose = onDispose;
2516
ConfigureDapper();
2617
}
2718
#endregion
2819

2920
#region Overrides
3021
protected override int Execute(string commandText, CommandType commandType, ParametersVisitor parameters, int? commandTimeout)
3122
{
32-
return base.Connection.Execute(commandText, CollectParameters(parameters), _defaultTransaction, commandTimeout ?? _defaultCommandTimeout, commandType);
23+
return base.Connection.Execute(commandText, CollectParameters(parameters), Options.DefaultTransaction, commandTimeout ?? Options.DefaultCommandTimeout, commandType);
3324
}
3425

3526
protected override Task<int> ExecuteAsync(string commandText, CommandType commandType, ParametersVisitor parameters, int? commandTimeout, CancellationToken cancellationToken)
3627
{
37-
CommandDefinition command = new CommandDefinition(commandText, CollectParameters(parameters), _defaultTransaction, commandTimeout ?? _defaultCommandTimeout, commandType, cancellationToken: cancellationToken);
28+
CommandDefinition command = new CommandDefinition(commandText, CollectParameters(parameters), Options.DefaultTransaction, commandTimeout ?? Options.DefaultCommandTimeout, commandType, cancellationToken: cancellationToken);
3829
return base.Connection.ExecuteAsync(command);
3930
}
4031

4132
protected override IEnumerable<T> QueryMany<T>(string commandText, CommandType commandType, ParametersVisitor parameters)
4233
{
4334
DecoratedTypeMap.Adapt<T>();
44-
return base.Connection.Query<T>(commandText, CollectParameters(parameters), _defaultTransaction, commandTimeout: _defaultCommandTimeout, commandType: commandType);
35+
return base.Connection.Query<T>(commandText, CollectParameters(parameters), Options.DefaultTransaction, commandTimeout: Options.DefaultCommandTimeout, commandType: commandType);
4536
}
4637

4738
protected override IEnumerable<T> QueryMany<T>(string commandText, CommandType commandType, ParametersVisitor parameters, bool buffered)
4839
{
4940
DecoratedTypeMap.Adapt<T>();
50-
return base.Connection.Query<T>(commandText, CollectParameters(parameters), _defaultTransaction, buffered, _defaultCommandTimeout, commandType);
41+
return base.Connection.Query<T>(commandText, CollectParameters(parameters), Options.DefaultTransaction, buffered, Options.DefaultCommandTimeout, commandType);
5142
}
5243

5344
protected override Task<IEnumerable<T>> QueryManyAsync<T>(string commandText, CommandType commandType, ParametersVisitor parameters, bool buffered, CancellationToken cancellationToken)
5445
{
5546
DecoratedTypeMap.Adapt<T>();
5647
CommandFlags flags = buffered ? CommandFlags.Buffered : CommandFlags.None;
57-
CommandDefinition command = new CommandDefinition(commandText, CollectParameters(parameters), _defaultTransaction, _defaultCommandTimeout, commandType, flags, cancellationToken);
48+
CommandDefinition command = new CommandDefinition(commandText, CollectParameters(parameters), Options.DefaultTransaction, Options.DefaultCommandTimeout, commandType, flags, cancellationToken);
5849
return base.Connection.QueryAsync<T>(command);
5950
}
6051

6152
protected override IEnumerable<TReturn> QueryMany<TReturn>(string commandText, CommandType commandType, ParametersVisitor parameters, Type[] types, Func<object[], TReturn> map, string splitOn, bool buffered)
6253
{
6354
DecoratedTypeMap.Adapt(types);
64-
return base.Connection.Query(commandText, types, map, CollectParameters(parameters), _defaultTransaction, splitOn: splitOn, commandTimeout: _defaultCommandTimeout, commandType: commandType, buffered: buffered);
55+
return base.Connection.Query(commandText, types, map, CollectParameters(parameters), Options.DefaultTransaction, splitOn: splitOn, commandTimeout: Options.DefaultCommandTimeout, commandType: commandType, buffered: buffered);
6556
}
6657

6758
protected override Task<IEnumerable<TReturn>> QueryManyAsync<TReturn>(string commandText, CommandType commandType, ParametersVisitor parameters, Type[] types, Func<object[], TReturn> map, string splitOn, bool buffered, CancellationToken cancellationToken)
6859
{
6960
DecoratedTypeMap.Adapt(types);
7061
// NOTE: Apparently there is no overload in Dapper that either accepts CancellationToken or CommandDefinition and Type[]
71-
return Connection.QueryAsync(commandText, types, map, CollectParameters(parameters), _defaultTransaction, splitOn: splitOn, commandTimeout: _defaultCommandTimeout, commandType: commandType, buffered: buffered);
62+
return Connection.QueryAsync(commandText, types, map, CollectParameters(parameters), Options.DefaultTransaction, splitOn: splitOn, commandTimeout: Options.DefaultCommandTimeout, commandType: commandType, buffered: buffered);
7263
}
7364

7465
protected override IMultipleResultReader QueryMultiple(string commandText, CommandType commandType, ParametersVisitor parameters)
7566
{
76-
SqlMapper.GridReader reader = base.Connection.QueryMultiple(commandText, CollectParameters(parameters), _defaultTransaction, commandTimeout: _defaultCommandTimeout, commandType: commandType);
77-
return new DapperGridResultReader(reader, commandText, commandType, parameters, DbProviderAdapter);
67+
SqlMapper.GridReader reader = base.Connection.QueryMultiple(commandText, CollectParameters(parameters), Options.DefaultTransaction, commandTimeout: Options.DefaultCommandTimeout, commandType: commandType);
68+
return new DapperGridResultReader(reader, commandText, commandType, parameters, DbProviderAdapter, Options);
7869
}
7970

8071
protected override async Task<IMultipleResultReader> QueryMultipleAsync(string commandText, CommandType commandType, ParametersVisitor parameters, CancellationToken cancellationToken)
8172
{
82-
SqlMapper.GridReader reader = await base.Connection.QueryMultipleAsync(new CommandDefinition(commandText, CollectParameters(parameters), _defaultTransaction, _defaultCommandTimeout, commandType, cancellationToken: cancellationToken)).ConfigureAwait(false);
83-
return new DapperGridResultReader(reader, commandText, commandType, parameters, DbProviderAdapter);
73+
SqlMapper.GridReader reader = await base.Connection.QueryMultipleAsync(new CommandDefinition(commandText, CollectParameters(parameters), Options.DefaultTransaction, Options.DefaultCommandTimeout, commandType, cancellationToken: cancellationToken)).ConfigureAwait(false);
74+
return new DapperGridResultReader(reader, commandText, commandType, parameters, DbProviderAdapter, Options);
8475
}
8576

8677
protected override IEnumerable<TReturn> Parse<TReturn>(IDataReader reader) => reader.Parse<TReturn>();
8778

8879
protected override void DisposeConnection()
8980
{
90-
if (_onDispose != null)
91-
_onDispose.Invoke();
81+
if (Options.OnDispose != null)
82+
Options.OnDispose.Invoke();
9283
else
9384
base.DisposeConnection();
9485
}

src/Dibix.Dapper/DapperDatabaseAccessorFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ public DapperDatabaseAccessorFactory(DbProviderFactory dbProviderFactory, string
1313
_connectionString = connectionString;
1414
}
1515

16-
public IDatabaseAccessor Create()
16+
public IDatabaseAccessor Create(DatabaseAccessorOptions options)
1717
{
1818
DbConnection dbConnection = _dbProviderFactory.CreateConnection();
1919
dbConnection.ConnectionString = _connectionString;
20-
return new DapperDatabaseAccessor(dbConnection);
20+
return new DapperDatabaseAccessor(dbConnection, options);
2121
}
2222
}
2323
}

src/Dibix.Dapper/DapperGridResultReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ internal sealed class DapperGridResultReader : MultipleResultReader, IMultipleRe
1717
#endregion
1818

1919
#region Constructor
20-
public DapperGridResultReader(SqlMapper.GridReader reader, string commandText, CommandType commandType, ParametersVisitor parameters, DbProviderAdapter dbProviderAdapter) : base(commandText, commandType, parameters, dbProviderAdapter)
20+
public DapperGridResultReader(SqlMapper.GridReader reader, string commandText, CommandType commandType, ParametersVisitor parameters, DbProviderAdapter dbProviderAdapter, DatabaseAccessorOptions options) : base(commandText, commandType, parameters, dbProviderAdapter, options)
2121
{
2222
_reader = reader;
2323
}

src/Dibix.Sdk.CodeGeneration/Output/DaoExecutorWriter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,9 @@ private static void AddExecutionMethods(CSharpClass @class, CodeGenerationContex
118118
}
119119
}
120120

121+
context.AddUsing<Action<object>>();
122+
method.AddParameter("configure", "Action<DatabaseAccessorOptions>", new CSharpValue("null"));
123+
121124
if (definition.Async)
122125
{
123126
context.AddUsing<CancellationToken>();
@@ -167,7 +170,7 @@ private static string GenerateMethodBody(SqlStatementDefinition definition, stri
167170
writer.WriteLine();
168171
}
169172

170-
writer.WriteLine($"using (IDatabaseAccessor accessor = databaseAccessorFactory.Create(\"{definition.DefinitionName}\"))")
173+
writer.WriteLine($"using (IDatabaseAccessor accessor = databaseAccessorFactory.Create(\"{definition.DefinitionName}\", configure))")
171174
.WriteLine("{")
172175
.PushIndent();
173176

src/Dibix.Testing/Data/DatabaseTestBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,17 @@ protected override async Task OnTestInitialized()
4343
_traceListener = traceListener;
4444
}
4545

46-
protected async Task<TResult> ExecuteDatabaseAction<TResult>(Func<IDatabaseAccessor, Task<TResult>> action)
46+
protected async Task<TResult> ExecuteDatabaseAction<TResult>(Func<IDatabaseAccessor, Task<TResult>> action, Action<DatabaseAccessorOptions> configure = null)
4747
{
48-
using (IDatabaseAccessor accessor = DatabaseAccessorFactory.Create())
48+
using (IDatabaseAccessor accessor = DatabaseAccessorFactory.Create(configure))
4949
{
5050
return await action(accessor).ConfigureAwait(false);
5151
}
5252
}
5353

54-
protected async Task ExecuteStoredProcedure(string storedProcedureName, Action<IParameterBuilder> parameters = null, int commandTimeout = 30)
54+
protected async Task ExecuteStoredProcedure(string storedProcedureName, Action<IParameterBuilder> parameters = null, int commandTimeout = 30, Action<DatabaseAccessorOptions> configure = null)
5555
{
56-
using (IDatabaseAccessor accessor = DatabaseAccessorFactory.Create())
56+
using (IDatabaseAccessor accessor = DatabaseAccessorFactory.Create(configure))
5757
{
5858
IParameterBuilder parameterBuilder = accessor.Parameters();
5959
parameters?.Invoke(parameterBuilder);

src/Dibix.Testing/Data/DatabaseTestUtility.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public DapperDatabaseAccessorFactory(string connectionString, RaiseErrorWithNoWa
5353
});
5454
}
5555

56-
public IDatabaseAccessor Create()
56+
public IDatabaseAccessor Create(DatabaseAccessorOptions options)
5757
{
5858
DbConnection connection = _connectionAccessor.Value;
5959

@@ -64,8 +64,9 @@ public IDatabaseAccessor Create()
6464
connection.InfoMessage += OnInfoMessage;
6565
}
6666
*/
67-
68-
return new DapperDatabaseAccessor(connection, _raiseErrorWithNoWaitBehavior, _defaultCommandTimeout);
67+
options ??= new DatabaseAccessorOptions();
68+
options.DefaultCommandTimeout ??= _defaultCommandTimeout;
69+
return new DapperDatabaseAccessor(connection, _raiseErrorWithNoWaitBehavior, options);
6970
}
7071

7172
// When FireInfoMessageEventOnUserErrors is true, errors will trigger an info message event aswell, without throwing an exception.
@@ -102,12 +103,10 @@ void IDisposable.Dispose()
102103
private sealed class DapperDatabaseAccessor : Dapper.DapperDatabaseAccessor
103104
{
104105
private readonly RaiseErrorWithNoWaitBehavior _raiseErrorWithNoWaitBehavior;
105-
private readonly int? _defaultCommandTimeout;
106106

107-
public DapperDatabaseAccessor(DbConnection connection, RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior, int? defaultCommandTimeout) : base(connection, defaultCommandTimeout: defaultCommandTimeout)
107+
public DapperDatabaseAccessor(DbConnection connection, RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior, DatabaseAccessorOptions options) : base(connection, options)
108108
{
109109
_raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior;
110-
_defaultCommandTimeout = defaultCommandTimeout;
111110
}
112111

113112
// ExecuteNonQuery is optimized, and will not process any messages, so RAISERROR WITH NOWAIT will not work.
@@ -117,15 +116,15 @@ protected override int Execute(string commandText, CommandType commandType, Para
117116
if (_raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior.ExecuteScalar)
118117
return base.Execute(commandText, commandType, parameters, commandTimeout);
119118

120-
_ = base.Connection.ExecuteScalar(commandText, CollectParameters(parameters), transaction: null, commandTimeout ?? _defaultCommandTimeout, commandType);
119+
_ = base.Connection.ExecuteScalar(commandText, CollectParameters(parameters), transaction: null, commandTimeout ?? Options.DefaultCommandTimeout, commandType);
121120
return default;
122121
}
123122
protected override async Task<int> ExecuteAsync(string commandText, CommandType commandType, ParametersVisitor parameters, int? commandTimeout, CancellationToken cancellationToken)
124123
{
125124
if (_raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior.ExecuteScalar)
126125
return await base.ExecuteAsync(commandText, commandType, parameters, commandTimeout, cancellationToken).ConfigureAwait(false);
127126

128-
CommandDefinition command = new CommandDefinition(commandText, CollectParameters(parameters), transaction: null, commandTimeout ?? _defaultCommandTimeout, commandType, cancellationToken: cancellationToken);
127+
CommandDefinition command = new CommandDefinition(commandText, CollectParameters(parameters), transaction: null, commandTimeout ?? Options.DefaultCommandTimeout, commandType, cancellationToken: cancellationToken);
129128
_ = await base.Connection.ExecuteScalarAsync(command).ConfigureAwait(false);
130129
return default;
131130
}

src/Dibix.Worker.Host/Data/ServiceBrokerDatabaseAccessorFactory.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ public ServiceBrokerDatabaseAccessorFactory(IDatabaseConnectionResolver connecti
2222
_logger = loggerFactory();
2323
}
2424

25-
public IDatabaseAccessor Create()
25+
public IDatabaseAccessor Create(DatabaseAccessorOptions options)
2626
{
2727
DbConnection connection = _connectionResolver.Resolve();
28-
return new ServiceBrokerDatabaseAccessor(connection, _logger);
28+
return new ServiceBrokerDatabaseAccessor(connection, options, _logger);
2929
}
3030
}
3131

3232
internal sealed class ServiceBrokerDatabaseAccessor : DatabaseAccessor
3333
{
3434
private readonly ILogger _logger;
3535

36-
public ServiceBrokerDatabaseAccessor(DbConnection connection, ILogger logger) : base(connection)
36+
public ServiceBrokerDatabaseAccessor(DbConnection connection, DatabaseAccessorOptions options, ILogger logger) : base(connection, options)
3737
{
3838
_logger = logger;
3939
}

0 commit comments

Comments
 (0)