private static async Task <Option <T> > QuerySingleOrNoneAsyncCore <T>(IDbConnectionFactory connectionFactory, string sql, object parameters, CancellationToken cancellationToken) where T : notnull { try { var command = new CommandDefinition(sql, parameters, cancellationToken: cancellationToken); var loggingContext = new QueryLoggingContext(connectionFactory, sql, parameters); using var context = await QueryContext.CreateAsync(connectionFactory, loggingContext, cancellationToken).ConfigureAwait(false); var connection = await connectionFactory.OpenConnectionAsync(cancellationToken).ConfigureAwait(false); await using var _ = connection.WithDispose(connectionFactory); var retryPolicy = BuildRetryPolicy(connectionFactory, loggingContext); var result = await retryPolicy.ExecuteAsync(_ => connection.QuerySingleOrDefaultAsync <T>(command), cancellationToken).ConfigureAwait(false); return(result != null ? Option <T> .Some(result) : Option <T> .None); } catch (InvalidOperationException) // for > 1 case { return(Option <T> .None); } }
public static void CreateAsync_WithoutQueryLimitConfigured_ReturnsNewInstance() { var connectionFactory = Mock.Of <IDbConnectionFactory>(); const string sql = "select 1"; var loggingContext = new QueryLoggingContext(connectionFactory, sql, null); Assert.That(async() => await QueryContext.CreateAsync(connectionFactory, loggingContext).ConfigureAwait(false), Throws.Nothing); }
public static void CreateAsync_GivenNullConnectionFactory_ThrowsArgNullException() { var connectionFactory = Mock.Of <IDbConnectionFactory>(); const string sql = "select 1"; var loggingContext = new QueryLoggingContext(connectionFactory, sql, null); Assert.That(() => QueryContext.CreateAsync(null, loggingContext), Throws.ArgumentNullException); }
public static void Stop_WhenNotConfigured_ShouldDoNothing() { var connectionFactory = Mock.Of <IDbConnectionFactory>(MockBehavior.Strict); const string sql = "select 1"; var loggingContext = new QueryLoggingContext(connectionFactory, sql, null); Assert.That(() => loggingContext.Stop(), Throws.Nothing); }
public static void Stop_WhenNotStarted_ShouldDoNothing() { var connectionFactory = Mock.Of <IDbConnectionFactory>(MockBehavior.Strict); var logger = Mock.Of <ILogger>(); const string sql = "select 1"; var connection = new SchematicConnection(connectionFactory, Mock.Of <IDatabaseDialect>()); Logging.AddLogging(connection, logger, LogLevel.Information); var loggingContext = new QueryLoggingContext(connectionFactory, sql, null); Assert.That(() => loggingContext.Stop(), Throws.Nothing); }
private static async Task <IEnumerable <T> > QueryAsyncCore <T>(IDbConnectionFactory connectionFactory, string sql, object parameters, CancellationToken cancellationToken) { var command = new CommandDefinition(sql, parameters, cancellationToken: cancellationToken); var loggingContext = new QueryLoggingContext(connectionFactory, sql, parameters); using var context = await QueryContext.CreateAsync(connectionFactory, loggingContext, cancellationToken).ConfigureAwait(false); var connection = await connectionFactory.OpenConnectionAsync(cancellationToken).ConfigureAwait(false); await using var _ = connection.WithDispose(connectionFactory); var retryPolicy = BuildRetryPolicy(connectionFactory, loggingContext); return(await retryPolicy.ExecuteAsync(_ => connection.QueryAsync <T>(command), cancellationToken).ConfigureAwait(false)); }
private static async Task <Option <T> > QueryFirstOrNoneAsyncCore <T>(IDbConnectionFactory connectionFactory, string sql, CancellationToken cancellationToken) where T : notnull { var command = new CommandDefinition(sql, cancellationToken: cancellationToken); var loggingContext = new QueryLoggingContext(connectionFactory, sql, null); using var context = await QueryContext.CreateAsync(connectionFactory, loggingContext, cancellationToken).ConfigureAwait(false); var connection = await connectionFactory.OpenConnectionAsync(cancellationToken).ConfigureAwait(false); await using var _ = connection.WithDispose(connectionFactory); var retryPolicy = BuildRetryPolicy(connectionFactory, loggingContext); var result = await retryPolicy.ExecuteAsync(_ => connection.QueryFirstOrDefaultAsync <T>(command), cancellationToken).ConfigureAwait(false); return(result != null ? Option <T> .Some(result) : Option <T> .None); }
private static IAsyncPolicy BuildRetryPolicy(IDbConnectionFactory connectionFactory, QueryLoggingContext loggingContext) { return(connectionFactory.RetryPolicy.WaitAndRetryAsync( Backoff.DecorrelatedJitterBackoffV2(TimeSpan.FromMilliseconds(100), MaxRetryAttempts), (ex, delay, retryAttempt, ctx) => loggingContext.Retry(retryAttempt, delay) )); }