Esempio n. 1
0
 public CurrencyService(IMapper mapper,
                        IContextScope contextScope,
                        IRepository <Currency> currenciesRepository,
                        IRepository <CurrencyPrice> currencyPricesRepository,
                        INbpService nbpService)
 {
     _mapper                   = mapper;
     _contextScope             = contextScope;
     _currenciesRepository     = currenciesRepository;
     _currencyPricesRepository = currencyPricesRepository;
     _nbpService               = nbpService;
 }
Esempio n. 2
0
        public IContextScope CreateContextScope()
        {
            if (_existingContextScope == null || _existingContextScope.IsDisposed)
            {
                _existingContextScope = new ContextScope(_dbContextOptionsProvider);
                return(_existingContextScope);
            }

            var nested = (INestedScope)_existingContextScope;

            nested.NestedUsingCount++;
            return(_existingContextScope);
        }
        private void Vote(IContextScope scope)
        {
            if (scope.Completed == true &&
                OverallVote == false)
            {
                throw new InvalidOperationException("Cannot vote to complete as the scope has already been voted to rollback");
            }

            if (scope.Completed.HasValue)
            {
                OverallVote = scope.Completed;
            }
        }
        private void Dispose(IContextScope scope)
        {
            scopes.Remove(scope);

            Vote(scope);

            if (scopes.Empty())
            {
                if (ContextSource.IsLoaded)
                {
                    DisposeContext();
                }

                OverallVote = null;
            }
        }
        public IDisposable Subscribe(IContextScope scope)
        {
            scopes.Add(scope);

            return(Actions.Create(() => Dispose(scope)).ToDisposable());
        }
        public void RemoveTableReferenceSpecificationCollisions(IContextScope contextScope, ref List <ITableReferenceSpecification> tableReferenceSpecifications)
        {
            for (var index = 0; index < tableReferenceSpecifications.Count; index++)
            {
                var tableReferenceSpecification = tableReferenceSpecifications[index];

                var tableReferenceSpecificationCollisions = tableReferenceSpecifications.Where(parameter =>
                {
                    if (tableReferenceSpecification == parameter)
                    {
                        return(false);
                    }

                    const TableReferenceSpecificationKind tableAlias = TableReferenceSpecificationKind.TableAlias;

                    var isTableAliasComparison = tableReferenceSpecification.TableReferenceSpecificationKind == tableAlias &&
                                                 parameter.TableReferenceSpecificationKind == tableAlias;

                    var isTableAliasSame = tableReferenceSpecification.TableAlias == parameter.TableAlias;
                    var isMostExplicitUniqueTableAliasScope = parameter.TableReferenceSpecificationScope == TableReferenceSpecificationScope.AliasServerIdentifier;

                    var isTableAliasCollision = isTableAliasComparison &&
                                                isTableAliasSame &&
                                                !isMostExplicitUniqueTableAliasScope;

                    const TableReferenceSpecificationKind tableSource = TableReferenceSpecificationKind.TableSource;

                    var isTableSourceComparison = tableReferenceSpecification.TableReferenceSpecificationKind == tableSource &&
                                                  parameter.TableReferenceSpecificationKind == tableSource;

                    var isTableSourceSame = tableReferenceSpecification.TableSource == parameter.TableSource ||
                                            tableReferenceSpecification.SchemaTableSource == parameter.SchemaTableSource ||
                                            tableReferenceSpecification.DatabaseSchemaTableSource == parameter.DatabaseSchemaTableSource;

                    var isTableSourceServerDifferent         = !string.Equals(tableReferenceSpecification.Table.ServerName, contextScope.ServerName, StringComparison.CurrentCultureIgnoreCase);
                    var isMostExplicitUniqueTableSourceScope = parameter.TableReferenceSpecificationScope == TableReferenceSpecificationScope.TableSourceServerIdentifier;

                    var isTableSourceCollision = isTableSourceComparison &&
                                                 isTableSourceSame &&
                                                 isTableSourceServerDifferent &&
                                                 !isMostExplicitUniqueTableSourceScope;

                    var isTableReferenceSpecificationCollision = isTableAliasCollision ||
                                                                 isTableSourceCollision;

                    return(isTableReferenceSpecificationCollision);
                })
                                                            .AsList();

                if (!tableReferenceSpecificationCollisions.Any())
                {
                    continue;
                }

                tableReferenceSpecificationCollisions.Add(tableReferenceSpecification);

                foreach (var tableReferenceSpecificationCollision in tableReferenceSpecificationCollisions)
                {
                    tableReferenceSpecifications.Remove(tableReferenceSpecificationCollision);
                }

                index = 0;
            }
        }
        public IReadOnlyDictionary <string, ITableReferenceIdentifier> GetTableReferenceIdentifierByTableMultiPartIdentifier(IContextScope contextScope, IReadOnlyList <ITable> selectionTables, params ITableRelationship[] tableRelationships)
        {
            // TODO: The reason why you're unioning these here is because you definitely need all of the table relationships found, plus, you need the original tables you selected.  Find a better way to do this.
            var fromTables = tableRelationships.Select(tableRelationship => tableRelationship.FromTable);
            var toTables   = tableRelationships.Select(tableRelationship => tableRelationship.ToTable);
            var tables     = selectionTables.Union(fromTables).Union(toTables);
            var tableReferenceSpecifications = new List <ITableReferenceSpecification>();

            foreach (var table in tables)
            {
                var serverName   = _sqlFormatter.QuoteEncapsulate(table.ServerName);
                var databaseName = _sqlFormatter.QuoteEncapsulate(table.DatabaseName);
                var schemaName   = _sqlFormatter.QuoteEncapsulate(table.SchemaName);
                var tableName    = _sqlFormatter.QuoteEncapsulate(table.TableName);

                var whitespaceDelimitation = _pascalCaseRegex.Replace(tableName, "$1 $2");
                var titleCasing            = _textInfo.ToTitleCase(whitespaceDelimitation);
                var tableAlias             = _predicateRegex.Replace(titleCasing, string.Empty);

                tableReferenceSpecifications.AddRange(new List <ITableReferenceSpecification>
                {
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasAbbreviationIdentifier, TableReferenceSpecificationKind.TableAlias, tableAlias),
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasTableIdentifier, TableReferenceSpecificationKind.TableAlias, tableName),
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasSchemaIdentifier, TableReferenceSpecificationKind.TableAlias, $"{schemaName}_{tableName}"),
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasDatabaseIdentifier, TableReferenceSpecificationKind.TableAlias, $"{databaseName}_{schemaName}_{tableName}"),
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.AliasServerIdentifier, TableReferenceSpecificationKind.TableAlias, $"{serverName.ToUpper()}_{databaseName}_{schemaName}_{tableName}"),
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.TableSourceTableIdentifier, TableReferenceSpecificationKind.TableSource, table.SchemaName.ToLower() != "dbo" ? $"{table.SchemaName}.{table.TableName}" : tableName),
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.TableSourceSchemaIdentifier, TableReferenceSpecificationKind.TableSource, $"{schemaName}.{tableName}"),
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.TableSourceDatabaseIdentifier, TableReferenceSpecificationKind.TableSource, $"{databaseName}.{schemaName}.{tableName}"),
                    new TableReferenceSpecification(table, TableReferenceSpecificationScope.TableSourceServerIdentifier, TableReferenceSpecificationKind.TableSource, $"{serverName.ToUpper()}.{databaseName}.{schemaName}.{tableName}")
                });
            }

            RemoveTableReferenceSpecificationCollisions(contextScope, ref tableReferenceSpecifications);

            var tableReferenceIdentifierByTableMultiPartIdentifier = tableReferenceSpecifications.GroupBy(tableReferenceSpecification => tableReferenceSpecification.Table.MultiPartIdentifier)
                                                                     .ToDictionary(tableMultiPartIdentifier => tableMultiPartIdentifier.Key, grouping =>
            {
                var orderedEnumerable = grouping.OrderBy(tableReferenceSpecification => tableReferenceSpecification.TableReferenceSpecificationScope);
                var tableAlias        = orderedEnumerable.First(tableReferenceSpecification => tableReferenceSpecification.TableReferenceSpecificationKind == TableReferenceSpecificationKind.TableAlias);
                var tableSource       = orderedEnumerable.First(tableReferenceSpecification => tableReferenceSpecification.TableReferenceSpecificationKind == TableReferenceSpecificationKind.TableSource);

                return(new TableReferenceIdentifier
                       (
                           tableAlias: tableAlias.TableAlias,
                           tableSource: tableSource.TableAlias
                       )
                       as ITableReferenceIdentifier);
            });

            return(tableReferenceIdentifierByTableMultiPartIdentifier);
        }