Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
                }
            }
        }
Exemplo n.º 3
0
        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);
            }
        }