Beispiel #1
0
        private IEnumerable <ITemplateRenderer> GetRenderers(
            IReadOnlyCollection <IRelationalDatabaseTable> tables,
            IReadOnlyCollection <IDatabaseView> views,
            IReadOnlyCollection <IDatabaseSequence> sequences,
            IReadOnlyCollection <IDatabaseSynonym> synonyms,
            IReadOnlyCollection <IDatabaseRoutine> routines,
            IReadOnlyDictionary <Identifier, ulong> rowCounts,
            string databaseVersion
            )
        {
            if (tables == null || tables.AnyNull())
            {
                throw new ArgumentNullException(nameof(tables));
            }
            if (views == null || views.AnyNull())
            {
                throw new ArgumentNullException(nameof(views));
            }
            if (sequences == null || sequences.AnyNull())
            {
                throw new ArgumentNullException(nameof(sequences));
            }
            if (synonyms == null || synonyms.AnyNull())
            {
                throw new ArgumentNullException(nameof(synonyms));
            }
            if (routines == null || routines.AnyNull())
            {
                throw new ArgumentNullException(nameof(routines));
            }
            if (rowCounts == null)
            {
                throw new ArgumentNullException(nameof(rowCounts));
            }

            var ruleProvider   = new ReportingRuleProvider();
            var rules          = ruleProvider.GetRules(Connection, RuleLevel.Warning);
            var linter         = new RelationalDatabaseLinter(rules);
            var synonymTargets = new SynonymTargets(tables, views, sequences, synonyms, routines);

            var dependencyProvider      = Connection.Dialect.GetDependencyProvider();
            var referencedObjectTargets = new ReferencedObjectTargets(dependencyProvider, tables, views, sequences, synonyms, routines);

            return(new ITemplateRenderer[]
            {
                new ColumnsRenderer(Database.IdentifierDefaults, TemplateFormatter, tables, views, ExportDirectory),
                new ConstraintsRenderer(Database.IdentifierDefaults, TemplateFormatter, tables, ExportDirectory),
                new IndexesRenderer(Database.IdentifierDefaults, TemplateFormatter, tables, ExportDirectory),
                new LintRenderer(linter, Database.IdentifierDefaults, TemplateFormatter, tables, views, sequences, synonyms, routines, ExportDirectory),
                new MainRenderer(Database, TemplateFormatter, tables, views, sequences, synonyms, routines, rowCounts, databaseVersion, ExportDirectory),
                new OrphansRenderer(Database.IdentifierDefaults, TemplateFormatter, tables, rowCounts, ExportDirectory),
                new RelationshipsRenderer(Database.IdentifierDefaults, TemplateFormatter, tables, rowCounts, ExportDirectory),
                new TableRenderer(Database.IdentifierDefaults, TemplateFormatter, tables, rowCounts, ExportDirectory),
                new TriggerRenderer(TemplateFormatter, tables, ExportDirectory),
                new ViewRenderer(Database.IdentifierDefaults, TemplateFormatter, views, referencedObjectTargets, ExportDirectory),
                new SequenceRenderer(Database.IdentifierDefaults, TemplateFormatter, sequences, ExportDirectory),
                new SynonymRenderer(Database.IdentifierDefaults, TemplateFormatter, synonyms, synonymTargets, ExportDirectory),
                new RoutineRenderer(Database.IdentifierDefaults, TemplateFormatter, routines, ExportDirectory),
                new TablesRenderer(Database.IdentifierDefaults, TemplateFormatter, tables, rowCounts, ExportDirectory),
                new TriggersRenderer(Database.IdentifierDefaults, TemplateFormatter, tables, ExportDirectory),
                new ViewsRenderer(Database.IdentifierDefaults, TemplateFormatter, views, ExportDirectory),
                new SequencesRenderer(Database.IdentifierDefaults, TemplateFormatter, sequences, ExportDirectory),
                new SynonymsRenderer(Database.IdentifierDefaults, TemplateFormatter, synonyms, synonymTargets, ExportDirectory),
                new RoutinesRenderer(Database.IdentifierDefaults, TemplateFormatter, routines, ExportDirectory),
                new TableOrderingRenderer(Connection.Dialect, tables, ExportDirectory),
                new DbmlRenderer(tables, ExportDirectory)
            });
        }
        public async Task <int> HandleCommandAsync(IConsole console, CancellationToken cancellationToken)
        {
            var connection = GetSchematicConnection();
            var database   = await connection.Dialect.GetRelationalDatabaseAsync(connection, cancellationToken).ConfigureAwait(false);

            var ruleProvider = new DefaultRuleProvider();
            var rules        = ruleProvider.GetRules(connection, RuleLevel.Information);

            var tables = await database.GetAllTables(cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var views = await database.GetAllViews(cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var sequences = await database.GetAllSequences(cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var synonyms = await database.GetAllSynonyms(cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var routines = await database.GetAllRoutines(cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var linter = new RelationalDatabaseLinter(rules);

            var tableResults = await linter.AnalyseTables(tables, cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var viewResults = await linter.AnalyseViews(views, cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var sequenceResults = await linter.AnalyseSequences(sequences, cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var synonymResults = await linter.AnalyseSynonyms(synonyms, cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var routineResults = await linter.AnalyseRoutines(routines, cancellationToken).ToListAsync(cancellationToken).ConfigureAwait(false);

            var groupedResults = tableResults
                                 .Append(viewResults)
                                 .Append(sequenceResults)
                                 .Append(synonymResults)
                                 .Append(routineResults)
                                 .GroupBy(r => r.RuleId)
                                 .ToList();

            var hasDisplayedResults = false;

            foreach (var group in groupedResults)
            {
                var ruleTitle = "Rule: " + group.First().Title;
                var underline = new string('-', ruleTitle.Length);

                if (hasDisplayedResults)
                {
                    console.Out.WriteLine();
                    console.Out.WriteLine();
                }
                hasDisplayedResults = true;

                console.Out.WriteLine(underline);
                console.Out.WriteLine(ruleTitle);
                console.Out.WriteLine(underline);
                console.Out.WriteLine();

                foreach (var message in group)
                {
                    console.Out.WriteLine(" * " + message.Message);
                }
            }

            return(ErrorCode.Success);
        }