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; }
private void UpdateMetadata(Session session) { var groups = BuildMetadata(session.Domain, session.StorageNode.TypeIdRegistry); var driver = session.Handlers.StorageDriver; var mapping = new MetadataMapping(driver, session.Handlers.NameBuilder); var executor = session.Services.Demand <IProviderExecutor>(); var resolver = UpgradeContext.Services.MappingResolver; var metadataSchema = UpgradeContext.Configuration.DefaultSchema; var sqlModel = UpgradeContext.ExtractedSqlModelCache; var namesShouldBeActualized = UpgradeContext.Configuration.ShareStorageSchemaOverNodes && UpgradeContext.Services.ProviderInfo.Supports(ProviderFeatures.Multischema); var nodeConfiguration = UpgradeContext.NodeConfiguration; foreach (var group in groups) { var metadataDatabase = group.Key; var metadata = group.Value; var schema = resolver.ResolveSchema(sqlModel, metadataDatabase, metadataSchema); var task = (!namesShouldBeActualized) ? new SqlExtractionTask(schema.Catalog.GetNameInternal(), schema.GetNameInternal()) : new SqlExtractionTask(nodeConfiguration.GetActualNameFor(schema.Catalog), nodeConfiguration.GetActualNameFor(schema)); var writer = new MetadataWriter(driver, mapping, task, executor); writer.Write(metadata); } var flatMetadata = new MetadataSet(); foreach (var metadata in groups.Values) { flatMetadata.UnionWith(metadata); } UpgradeContext.Metadata = flatMetadata; }
// Constructors public MetadataExtractor(MetadataMapping mapping, ISqlExecutor executor) { ArgumentValidator.EnsureArgumentNotNull(mapping, "mapping"); ArgumentValidator.EnsureArgumentNotNull(executor, "executor"); this.mapping = mapping; this.executor = executor; }
private static bool ShouldSkipMetadataExtraction(MetadataMapping mapping, SqlWorkerResult result, SqlExtractionTask task) { if (result.Schema == null) { return(false); } var tables = GetSchemaTables(result, task); return(tables[mapping.Assembly] == null && tables[mapping.Type] == null && tables[mapping.Extension] == null); }
// Constructors public MetadataWriter(StorageDriver driver, MetadataMapping mapping, SqlExtractionTask task, IProviderExecutor executor) { ArgumentValidator.EnsureArgumentNotNull(driver, "driver"); ArgumentValidator.EnsureArgumentNotNull(mapping, "mapping"); ArgumentValidator.EnsureArgumentNotNull(task, "task"); ArgumentValidator.EnsureArgumentNotNull(executor, "executor"); this.driver = driver; this.mapping = mapping; this.task = task; this.executor = executor; }