示例#1
0
 private void Initialize()
 {
     Stage = UpgradeMode.IsMultistage() ? UpgradeStage.Upgrading : UpgradeStage.Final;
     Hints = new SetSlim <UpgradeHint>();
     RecycledDefinitions = new List <RecycledDefinition>();
     Services            = new UpgradeServiceAccessor();
 }
示例#2
0
        private void CreateConnection(UpgradeServiceAccessor serviceAccessor)
        {
            var driver     = serviceAccessor.StorageDriver;
            var connection = driver.CreateConnection(null);

            driver.ApplyNodeConfiguration(connection, context.NodeConfiguration);

            try {
                driver.OpenConnection(null, connection);
                driver.BeginTransaction(null, connection, null);
            }
            catch {
                connection.Dispose();
                throw;
            }

            if (driver.ProviderInfo.Supports(ProviderFeatures.SingleConnection))
            {
                serviceAccessor.RegisterTemporaryResource(connection);
            }
            else
            {
                serviceAccessor.RegisterResource(connection);
            }

            serviceAccessor.Connection = connection;
        }
示例#3
0
        private static async Task ExtractMetadataAsync(
            UpgradeServiceAccessor services, SqlExecutor executor, SqlWorkerResult result, SqlWorkerTask task,
            CancellationToken token)
        {
            var set               = new MetadataSet();
            var mapping           = new MetadataMapping(services.StorageDriver, services.NameBuilder);
            var metadataExtractor = new MetadataExtractor(mapping, executor);

            foreach (var metadataTask in services.MappingResolver.GetMetadataTasks()
                     .Where(metadataTask => !ShouldSkipMetadataExtraction(mapping, result, metadataTask)))
            {
                try {
                    if (task.HasFlag(SqlWorkerTask.ExtractMetadataAssemblies))
                    {
                        await metadataExtractor.ExtractAssembliesAsync(set, metadataTask, token).ConfigureAwait(false);
                    }

                    if (task.HasFlag(SqlWorkerTask.ExtractMetadataTypes))
                    {
                        await metadataExtractor.ExtractTypesAsync(set, metadataTask, token).ConfigureAwait(false);
                    }

                    if (task.HasFlag(SqlWorkerTask.ExtractMetadataExtension))
                    {
                        await metadataExtractor.ExtractExtensionsAsync(set, metadataTask, token).ConfigureAwait(false);
                    }
                }
                catch (Exception exception) {
                    UpgradeLog.Warning(
                        Strings.LogFailedToExtractMetadataFromXYZ, metadataTask.Catalog, metadataTask.Schema, exception);
                }
            }
            result.Metadata = set;
        }
        // Constructors

        public SchemaExtractor(UpgradeContext context, Session session)
        {
            this.context = context;

            services = context.Services;
            executor = session.Services.Demand <ISqlExecutor>();
        }
示例#5
0
        private static async Task <SchemaExtractionResult> ExtractSchemaAsync(
            UpgradeServiceAccessor services, ISqlExecutor executor, CancellationToken token)
        {
            var extractionTasks  = services.MappingResolver.GetSchemaTasks();
            var extractionResult = await executor.ExtractAsync(extractionTasks, token).ConfigureAwait(false);

            var schema = new SchemaExtractionResult(extractionResult);

            return(new IgnoreRulesHandler(schema, services.Configuration, services.MappingResolver).Handle());
        }
示例#6
0
        private static void DropSchema(UpgradeServiceAccessor services, ISqlExecutor executor)
        {
            var driver           = services.StorageDriver;
            var extractionResult = ExtractSchema(services, executor);
            var schemas          = extractionResult.Catalogs.SelectMany(c => c.Schemas).ToList();
            var tables           = schemas.SelectMany(s => s.Tables).ToList();
            var sequences        = schemas.SelectMany(s => s.Sequences);

            DropForeignKeys(driver, tables, executor);
            DropTables(driver, tables, executor);
            DropSequences(driver, sequences, executor);
        }
示例#7
0
        private static void BuildUpgradeHandlers(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer)
        {
            // Getting user handlers
            var userHandlers =
                from handler in serviceContainer.GetAll <IUpgradeHandler>()
                let assembly = handler.Assembly ?? handler.GetType().Assembly
                               where handler.IsEnabled
                               group handler by assembly;

            // Adding user handlers
            var handlers = new Dictionary <Assembly, IUpgradeHandler>();

            foreach (var group in userHandlers)
            {
                var candidates = group.ToList();
                if (candidates.Count > 1)
                {
                    throw new DomainBuilderException(
                              string.Format(Strings.ExMoreThanOneEnabledXIsProvidedForAssemblyY, typeof(IUpgradeHandler).GetShortName(), @group.Key));
                }
                handlers.Add(group.Key, candidates[0]);
            }

            // Adding default handlers
            var assembliesWithUserHandlers   = handlers.Select(pair => pair.Key);
            var assembliesWithoutUserHandler =
                serviceAccessor.Configuration.Types.PersistentTypes
                .Select(type => type.Assembly)
                .Distinct()
                .Except(assembliesWithUserHandlers);

            foreach (var assembly in assembliesWithoutUserHandler)
            {
                var handler = new UpgradeHandler(assembly);
                handlers.Add(assembly, handler);
            }

            // Building a list of handlers sorted by dependencies of their assemblies
            var dependencies = handlers.Keys.ToDictionary(
                assembly => assembly,
                assembly => assembly.GetReferencedAssemblies().Select(assemblyName => assemblyName.ToString()).ToHashSet());
            var sortedHandlers = handlers
                                 .SortTopologically((a0, a1) => dependencies[a1.Key].Contains(a0.Key.GetName().ToString()))
                                 .Select(pair => pair.Value);

            // Storing the result
            serviceAccessor.UpgradeHandlers =
                new ReadOnlyDictionary <Assembly, IUpgradeHandler>(handlers);
            serviceAccessor.OrderedUpgradeHandlers =
                new ReadOnlyList <IUpgradeHandler>(sortedHandlers.ToList());
        }
示例#8
0
        private static async Task DropSchemaAsync(
            UpgradeServiceAccessor services, ISqlExecutor executor, CancellationToken token)
        {
            var driver           = services.StorageDriver;
            var extractionResult = await ExtractSchemaAsync(services, executor, token).ConfigureAwait(false);

            var schemas   = extractionResult.Catalogs.SelectMany(c => c.Schemas).ToList();
            var tables    = schemas.SelectMany(s => s.Tables).ToList();
            var sequences = schemas.SelectMany(s => s.Sequences);

            await DropForeignKeysAsync(driver, tables, executor, token).ConfigureAwait(false);
            await DropTablesAsync(driver, tables, executor, token).ConfigureAwait(false);
            await DropSequencesAsync(driver, sequences, executor, token).ConfigureAwait(false);
        }
        // Constructors

        public SqlModelConverter(UpgradeServiceAccessor services, SchemaExtractionResult sourceModel,
                                 IEnumerable <StoredPartialIndexFilterInfo> partialIndexes)
        {
            ArgumentValidator.EnsureArgumentNotNull(services, "handlers");
            ArgumentValidator.EnsureArgumentNotNull(sourceModel, "sourceModel");
            ArgumentValidator.EnsureArgumentNotNull(partialIndexes, "partialIndexes");

            this.sourceModel = sourceModel;

            resolver     = services.MappingResolver;
            providerInfo = services.ProviderInfo;
            driver       = services.StorageDriver;

            partialIndexMap = new PartialIndexInfoMap(resolver, partialIndexes);
        }
示例#10
0
        private async ValueTask CreateConnection(
            UpgradeServiceAccessor serviceAccessor, bool isAsync, CancellationToken token = default)
        {
            var driver     = serviceAccessor.StorageDriver;
            var connection = driver.CreateConnection(null);

            driver.ApplyNodeConfiguration(connection, context.NodeConfiguration);

            try {
                if (isAsync)
                {
                    await driver.OpenConnectionAsync(null, connection, token).ConfigureAwait(false);

                    await driver.BeginTransactionAsync(null, connection, null, token).ConfigureAwait(false);
                }
                else
                {
                    driver.OpenConnection(null, connection);
                    driver.BeginTransaction(null, connection, null);
                }
            }
            catch {
                if (isAsync)
                {
                    await connection.DisposeAsync().ConfigureAwait(false);
                }
                else
                {
                    connection.Dispose();
                }
                throw;
            }

            if (driver.ProviderInfo.Supports(ProviderFeatures.SingleConnection))
            {
                serviceAccessor.RegisterTemporaryResource(connection);
            }
            else
            {
                serviceAccessor.RegisterResource(connection);
            }

            serviceAccessor.Connection = connection;
        }
示例#11
0
        private static SqlWorkerResult Run(UpgradeServiceAccessor services, SqlWorkerTask task)
        {
            var result   = new SqlWorkerResult();
            var executor = new SqlExecutor(services.StorageDriver, services.Connection);

            if ((task & SqlWorkerTask.DropSchema) > 0)
            {
                DropSchema(services, executor);
            }
            if ((task & SqlWorkerTask.ExtractSchema) > 0)
            {
                result.Schema = ExtractSchema(services, executor);
            }
            if ((task & (SqlWorkerTask.ExtractMetadataTypes | SqlWorkerTask.ExtractMetadataAssemblies | SqlWorkerTask.ExtractMetadataExtension)) > 0)
            {
                ExtractMetadata(services, executor, result, task);
            }
            return(result);
        }
示例#12
0
        // Constructors

        public SchemaUpgrader(UpgradeContext context, Session session)
        {
            this.context = context;
            this.session = session;

            services   = context.Services;
            connection = context.Services.Connection;
            executor   = session.Services.Demand <ISqlExecutor>();

            driver = services.StorageDriver;
            if (driver.ProviderInfo.Supports(ProviderFeatures.TransactionalDdl))
            {
                statementProcessor = ExecuteTransactionally;
            }
            else
            {
                statementProcessor = ExecuteNonTransactionally;
            }
        }
示例#13
0
        private static void BuildFullTextCatalogResolver(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer)
        {
            //Getting user resolvers
            var candidates = from r in serviceContainer.GetAll <IFullTextCatalogNameBuilder>()
                             let assembly = r.GetType().Assembly
                                            where r.IsEnabled && assembly != typeof(IFullTextCatalogNameBuilder).Assembly
                                            select r;

            var userResolversCount = candidates.Count();

            if (userResolversCount > 1)
            {
                throw new DomainBuilderException(string.Format(Strings.ExMoreThanOneEnabledXIsProvided, typeof(IFullTextCatalogNameBuilder).GetShortName()));
            }

            var resolver = (userResolversCount == 0)
        ? new FullTextCatalogNameBuilder()
        : candidates.First();

            //storing sesolver
            serviceAccessor.FulltextCatalogNameBuilder = resolver;
        }
示例#14
0
        private static async Task <SqlWorkerResult> RunAsync(
            UpgradeServiceAccessor services, SqlWorkerTask task, CancellationToken token)
        {
            var result   = new SqlWorkerResult();
            var executor = new SqlExecutor(services.StorageDriver, services.Connection);

            if ((task & SqlWorkerTask.DropSchema) > 0)
            {
                await DropSchemaAsync(services, executor, token).ConfigureAwait(false);
            }

            if ((task & SqlWorkerTask.ExtractSchema) > 0)
            {
                result.Schema = await ExtractSchemaAsync(services, executor, token).ConfigureAwait(false);
            }

            if ((task & (SqlWorkerTask.ExtractMetadataTypes | SqlWorkerTask.ExtractMetadataAssemblies | SqlWorkerTask.ExtractMetadataExtension)) > 0)
            {
                await ExtractMetadataAsync(services, executor, result, task, token).ConfigureAwait(false);
            }

            return(result);
        }
示例#15
0
        private void BuildExternalServices(UpgradeServiceAccessor serviceAccessor, DomainConfiguration configuration)
        {
            var standardRegistrations = new[] {
                new ServiceRegistration(typeof(DomainConfiguration), configuration),
                new ServiceRegistration(typeof(UpgradeContext), context)
            };

            var modules = configuration.Types.Modules
                          .Select(type => new ServiceRegistration(typeof(IModule), type, false));
            var handlers = configuration.Types.UpgradeHandlers
                           .Select(type => new ServiceRegistration(typeof(IUpgradeHandler), type, false));
            var ftCatalogResolvers = configuration.Types.FullTextCatalogResolvers
                                     .Select(type => new ServiceRegistration(typeof(IFullTextCatalogNameBuilder), type, false));

            var registrations    = standardRegistrations.Concat(modules).Concat(handlers).Concat(ftCatalogResolvers);
            var serviceContainer = new ServiceContainer(registrations);

            serviceAccessor.RegisterResource(serviceContainer);

            BuildModules(serviceAccessor, serviceContainer);
            BuildUpgradeHandlers(serviceAccessor, serviceContainer);
            BuildFullTextCatalogResolver(serviceAccessor, serviceContainer);
        }
示例#16
0
        private static SchemaExtractionResult ExtractSchema(UpgradeServiceAccessor services, ISqlExecutor executor)
        {
            var schema = new SchemaExtractionResult(executor.Extract(services.MappingResolver.GetSchemaTasks()));

            return(new IgnoreRulesHandler(schema, services.Configuration, services.MappingResolver).Handle());
        }
示例#17
0
 private static void BuildModules(UpgradeServiceAccessor serviceAccessor, IServiceContainer serviceContainer)
 {
     serviceAccessor.Modules = new ReadOnlyList <IModule>(serviceContainer.GetAll <IModule>().ToList());
 }
示例#18
0
 public static Func <SqlWorkerResult> Create(UpgradeServiceAccessor services, SqlWorkerTask task)
 {
     return(() => Run(services, task));
 }
示例#19
0
 public static Func <Task <SqlWorkerResult> > Create(
     UpgradeServiceAccessor services, SqlWorkerTask task, CancellationToken token) =>
 () => RunAsync(services, task, token);