Example #1
0
        public virtual async Task <bool> RemoveExpirationAsync(TKey key)
        {
            using var cancellationTokenSource = CreateCancellationTokenSource();
            await using var connection        = await GetConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false);

            var keyColumnValues = KeyMapper.GetColumnValues(key);
            var columnValues    = new Dictionary <string, object>
            {
                { _expirationColumnName, DBNull.Value }
            };

            await using var command = connection.CreateTextCommand(
                            DatabaseDriver.GetSqlStatementTemplate(SqlStatement.Update),
                            new
            {
                schemaName   = DatabaseDriver.ParseIdentifier(Table.Schema ?? DatabaseDriver.DefaultSchema),
                tableName    = DatabaseDriver.ParseIdentifier(Table.Name),
                columnValues = SqlHelper.GetCommaEqualsStatement(DatabaseDriver, columnValues.Keys.ToArray()),
                filter       = SqlHelper.GetCombinedAndStatement(DatabaseDriver,
                                                                 SqlHelper.GetAndEqualsStatement(DatabaseDriver, keyColumnValues.Keys.ToArray()),
                                                                 SqlHelper.GetIsNotNullStatement(DatabaseDriver, columnValues.Keys.ToArray()))
            },
                            keyColumnValues.Concat(columnValues).Select(c => c.ToDbParameter(DatabaseDriver)));

            var teste = SqlHelper.GetCombinedAndStatement(DatabaseDriver,
                                                          SqlHelper.GetAndEqualsStatement(DatabaseDriver, keyColumnValues.Keys.ToArray()),
                                                          SqlHelper.GetIsNotNullStatement(DatabaseDriver, columnValues.Keys.ToArray()));

            if (await command.ExecuteNonQueryAsync(cancellationTokenSource.Token).ConfigureAwait(false) == 0)
            {
                return(false);
            }

            return(true);
        }
Example #2
0
        public virtual async Task SetAbsoluteKeyExpirationAsync(TKey key, DateTimeOffset expiration)
        {
            using (var cancellationTokenSource = CreateCancellationTokenSource())
            {
                using (var connection = await GetConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false))
                {
                    var keyColumnValues = KeyMapper.GetColumnValues(key);
                    var columnValues    = new Dictionary <string, object>
                    {
                        { _expirationColumnName, expiration }
                    };

                    using (var command = connection.CreateTextCommand(
                               DatabaseDriver.GetSqlStatementTemplate(SqlStatement.Update),
                               new
                    {
                        schemaName = DatabaseDriver.ParseIdentifier(Table.Schema ?? DatabaseDriver.DefaultSchema),
                        tableName = DatabaseDriver.ParseIdentifier(Table.Name),
                        columnValues = SqlHelper.GetCommaEqualsStatement(DatabaseDriver, columnValues.Keys.ToArray()),
                        filter = SqlHelper.GetAndEqualsStatement(DatabaseDriver, keyColumnValues.Keys.ToArray())
                    },
                               keyColumnValues.Concat(columnValues).Select(c => c.ToDbParameter(DatabaseDriver))))
                    {
                        if (await command.ExecuteNonQueryAsync(cancellationTokenSource.Token).ConfigureAwait(false) ==
                            0)
                        {
                            throw new ArgumentException("Invalid key", nameof(key));
                        }
                    }
                }
            }
        }
Example #3
0
        public virtual async Task SetPropertyValueAsync <TProperty>(TKey key, string propertyName, TProperty propertyValue)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (!Table.Columns.ContainsKey(propertyName))
            {
                throw new ArgumentException(@"Invalid property", nameof(propertyName));
            }
            if (Table.KeyColumnsNames.Contains(propertyName))
            {
                throw new ArgumentException(@"A key property cannot be changed", nameof(propertyName));
            }

            using (var cancellationTokenSource = CreateCancellationTokenSource())
            {
                using (var connection = await GetConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false))
                {
                    var keyColumnValues = KeyMapper.GetColumnValues(key);
                    var columnValues    = new Dictionary <string, object> {
                        { propertyName, Mapper.DbTypeMapper.ToDbType(propertyValue, Table.Columns[propertyName].Type) }
                    };

                    using (var command = connection.CreateMergeCommand(DatabaseDriver, Table.Schema, Table.Name, keyColumnValues, columnValues))
                    {
                        if (await command.ExecuteNonQueryAsync(cancellationTokenSource.Token).ConfigureAwait(false) == 0)
                        {
                            throw new Exception("The database operation failed");
                        }
                    }
                }
            }
        }
Example #4
0
        public virtual async Task <TProperty> GetPropertyValueOrDefaultAsync <TProperty>(TKey key, string propertyName)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (!Table.Columns.ContainsKey(propertyName))
            {
                throw new ArgumentException(@"Invalid property", nameof(propertyName));
            }

            using (var cancellationTokenSource = CreateCancellationTokenSource())
            {
                using (var connection = await GetConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false))
                {
                    var keyColumnValues = KeyMapper.GetColumnValues(key);

                    using (var command = connection.CreateSelectTop1Command(DatabaseDriver, Table.Schema, Table.Name, new[] { propertyName }, keyColumnValues))
                    {
                        var dbValue = await command.ExecuteScalarAsync(cancellationTokenSource.Token).ConfigureAwait(false);

                        if (dbValue != null && !(dbValue is DBNull))
                        {
                            return((TProperty)Mapper.DbTypeMapper.FromDbType(
                                       dbValue,
                                       Table.Columns[propertyName].Type,
                                       typeof(TValue).GetTypeInfo().GetProperty(propertyName).PropertyType));
                        }
                    }
                }
            }

            return(default(TProperty));
        }
Example #5
0
        public virtual async Task MergeAsync(TKey key, TValue value)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            using (var cancellationTokenSource = CreateCancellationTokenSource())
            {
                using (var connection = await GetConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false))
                {
                    var keyColumnValues = KeyMapper.GetColumnValues(key);
                    var columnValues    = GetColumnValues(value);

                    if (columnValues.Any())
                    {
                        using (var command = connection.CreateMergeCommand(DatabaseDriver, Table.Schema, Table.Name, keyColumnValues, columnValues))
                        {
                            if (await command.ExecuteNonQueryAsync(cancellationTokenSource.Token).ConfigureAwait(false) == 0)
                            {
                                throw new Exception("The database operation failed");
                            }
                        }
                    }
                }
            }
        }
Example #6
0
        public virtual Task <ISet <TItem> > GetValueOrEmptyAsync(TKey key)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            var keyColumnValues = KeyMapper.GetColumnValues(key);

            return(new InternalSet(ConnectionString, Table, Mapper, DatabaseDriver, keyColumnValues).AsCompletedTask <ISet <TItem> >());
        }
Example #7
0
        public virtual Task <ISet <TItem> > GetValueOrEmptyAsync(TKey key, CancellationToken cancellationToken = default)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            var keyColumnValues = KeyMapper.GetColumnValues(key);

            return(new InternalSet(ConnectionString, Table, Mapper, DatabaseDriver, keyColumnValues)
            {
                FetchQueryResultTotal = this.FetchQueryResultTotal
            }
                   .AsCompletedTask <ISet <TItem> >());
        }
Example #8
0
 public virtual async Task <ISet <TItem> > GetValueOrDefaultAsync(TKey key)
 {
     if (key == null)
     {
         throw new ArgumentNullException(nameof(key));
     }
     using (var cancellationTokenSource = CreateCancellationTokenSource())
     {
         using (var connection = await GetConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false))
         {
             var keyColumnValues = KeyMapper.GetColumnValues(key);
             if (!await ContainsAsync(keyColumnValues, connection, cancellationTokenSource.Token))
             {
                 return(null);
             }
             return(new InternalSet(ConnectionString, Table, Mapper, DatabaseDriver, keyColumnValues));
         }
     }
 }
Example #9
0
        public virtual async Task <long> IncrementAsync(TKey key, long value)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            using (var cancellationTokenSource = CreateCancellationTokenSource())
            {
                using (var connection = await GetConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false))
                {
                    var keyColumnValues = KeyMapper.GetColumnValues(key);
                    var columnValues    = GetColumnValues(value);
                    using (var command = connection.CreateMergeIncrementCommand(DatabaseDriver, Table.Schema, Table.Name, _numberColumnName, keyColumnValues, columnValues))
                    {
                        return((long)await command.ExecuteScalarAsync(cancellationTokenSource.Token).ConfigureAwait(false));
                    }
                }
            }
        }
Example #10
0
        public virtual async Task <TValue> GetValueOrDefaultAsync(TKey key)
        {
            using (var cancellationTokenSource = CreateCancellationTokenSource())
            {
                using (var connection = await GetConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false))
                {
                    var keyColumnValues = KeyMapper.GetColumnValues(key);
                    var selectColumns   = Table.Columns.Keys.ToArray();

                    return(await new DbDataReaderAsyncEnumerable <TValue>(
                               // ReSharper disable once AccessToDisposedClosure
                               t => connection.AsCompletedTask(),
                               c => c.CreateSelectCommand(DatabaseDriver, Table.Schema, Table.Name, keyColumnValues, selectColumns),
                               Mapper,
                               selectColumns)
                           .FirstOrDefaultAsync(cancellationTokenSource.Token)
                           .ConfigureAwait(false));
                }
            }
        }
Example #11
0
        public virtual async Task <bool> TryAddAsync(TKey key,
                                                     ISet <TItem> value,
                                                     bool overwrite = false,
                                                     CancellationToken cancellationToken = default)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }
            var keyColumnValues = GetKeyColumnValues(KeyMapper.GetColumnValues(key));

            var internalSet = value as InternalSet;

            if (internalSet != null)
            {
                return(keyColumnValues.SequenceEqual(internalSet.MapKeyColumnValues) && overwrite);
            }

            using (var cts = CreateCancellationTokenSource())
                using (var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, cancellationToken))
                {
                    using (var connection = await GetConnectionAsync(linkedCts.Token).ConfigureAwait(false))
                    {
                        if (!overwrite &&
                            await ContainsAsync(keyColumnValues, connection, linkedCts.Token))
                        {
                            return(false);
                        }

                        using (var transaction = connection.BeginTransaction(_addIsolationLevel))
                        {
                            if (overwrite)
                            {
                                await
                                TryRemoveAsync(keyColumnValues, connection, linkedCts.Token, transaction)
                                .ConfigureAwait(false);
                            }

                            var success = true;
                            var items   = await value.AsEnumerableAsync(linkedCts.Token).ConfigureAwait(false);

                            await items.ForEachAsync(
                                async item =>
                            {
                                if (!success)
                                {
                                    return;
                                }
                                var columnValues        = GetColumnValues(key, item);
                                var itemKeyColumnValues = GetKeyColumnValues(columnValues);

                                using (
                                    var command = connection.CreateInsertWhereNotExistsCommand(DatabaseDriver, Table.Schema, Table.Name, itemKeyColumnValues, columnValues))
                                {
                                    command.Transaction = transaction;
                                    success             =
                                        await command.ExecuteNonQueryAsync(linkedCts.Token).ConfigureAwait(false) > 0;
                                }
                            },
                                linkedCts.Token);

                            if (success)
                            {
                                transaction.Commit();
                            }
                            else
                            {
                                transaction.Rollback();
                            }

                            return(success);
                        }
                    }
                }
        }