public async Task IsDuplicateKeyException() { MySqlCache cache = GetCache(); var options = new DistributedCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromSeconds(10)); string key = "MyKey"; var expectedValue = Encoding.UTF8.GetBytes("MyValue"); await cache.SetAsync(key, expectedValue, options); CacheItemInfo value = new CacheItemInfo { Id = key, Value = expectedValue, ExpiresAtTime = DateTimeOffset.Now, //AbsoluteExpiration = DateTimeOffset.Now, SlidingExpirationInSeconds = TimeSpan.FromSeconds(10) }; var exception = await Assert.ThrowsAsync <MySqlException>(async() => { await SetCacheItemFromDatabaseAsync(key, value); }); Assert.NotNull(exception); Assert.Equal(1062, exception.Number); await cache.SetAsync(key, expectedValue, options); }
private async Task <CacheItemInfo> GetCacheItemFromDatabaseAsync(string key) { using (var connection = new MySqlConnection(_databaseOptionsFixture.Options.Value.ReadConnectionString)) { var command = new MySqlCommand( "SELECT Id, Value, ExpiresAtTime, SlidingExpirationInSeconds, AbsoluteExpiration " + $"FROM {_databaseOptionsFixture.Options.Value.TableName} WHERE Id = @Id", connection); command.Parameters.AddWithValue("Id", key); await connection.OpenAsync(); var reader = await command.ExecuteReaderAsync(CommandBehavior.SingleRow); // NOTE: The following code is made to run on Mono as well because of which // we cannot use GetFieldValueAsync etc. if (await reader.ReadAsync()) { var cacheItemInfo = new CacheItemInfo { Id = key, Value = (byte[])reader[1], ExpiresAtTime = DateTimeOffset.Parse(reader[2].ToString(), System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat, System.Globalization.DateTimeStyles.AssumeUniversal) }; if (!await reader.IsDBNullAsync(3)) { cacheItemInfo.SlidingExpirationInSeconds = TimeSpan.FromSeconds(reader.GetInt64(3)); } if (!await reader.IsDBNullAsync(4)) { cacheItemInfo.AbsoluteExpiration = DateTimeOffset.Parse(reader[4].ToString(), System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat, System.Globalization.DateTimeStyles.AssumeUniversal); } return(cacheItemInfo); } else { return(null); } } }
private async Task <bool> SetCacheItemFromDatabaseAsync(string key, CacheItemInfo value, CancellationToken token = default(CancellationToken)) { using (var connection = new MySqlConnection(_databaseOptionsFixture.Options.Value.WriteConnectionString)) { var command = new MySqlCommand( $"INSERT INTO {_databaseOptionsFixture.Options.Value.TableName} " + "(Id, Value, ExpiresAtTime, SlidingExpirationInSeconds, AbsoluteExpiration) " + "VALUES (@Id, @Value, @ExpiresAtTime, @SlidingExpirationInSeconds, @AbsoluteExpiration)", connection); command.Parameters.AddWithValue("Id", value.Id); command.Parameters.AddWithValue("Value", value.Value); command.Parameters.AddWithValue("ExpiresAtTime", value.ExpiresAtTime); command.Parameters.AddWithValue("SlidingExpirationInSeconds", value.SlidingExpirationInSeconds); command.Parameters.AddWithValue("AbsoluteExpiration", value.AbsoluteExpiration); await connection.OpenAsync(token); var changed_rows = await command.ExecuteNonQueryAsync(token); return(changed_rows > 0); } }